From de1f89d8c98b36be241f0adb360aa63c10bea5b0 Mon Sep 17 00:00:00 2001 From: Valerio Date: Fri, 12 Sep 2025 15:36:18 +0200 Subject: [PATCH 001/113] initial --- src/include/86box/unix_osd.h | 11 ++ src/unix/CMakeLists.txt | 1 + src/unix/unix.c | 238 ++++++++++++++-------- src/unix/unix_osd.c | 369 +++++++++++++++++++++++++++++++++++ src/utils/crc32.c | 3 + 5 files changed, 538 insertions(+), 84 deletions(-) create mode 100644 src/include/86box/unix_osd.h create mode 100644 src/unix/unix_osd.c diff --git a/src/include/86box/unix_osd.h b/src/include/86box/unix_osd.h new file mode 100644 index 000000000..4ae93a8c2 --- /dev/null +++ b/src/include/86box/unix_osd.h @@ -0,0 +1,11 @@ +#ifndef _UNIX_OSD_H +#define _UNIX_OSD_H + +#include + +extern int osd_open(SDL_Event event); +extern int osd_close(SDL_Event event); +extern int osd_handle(SDL_Event event); + +#endif /*_UNIX_OSD_H*/ + diff --git a/src/unix/CMakeLists.txt b/src/unix/CMakeLists.txt index 724ab041f..1d428fa2b 100644 --- a/src/unix/CMakeLists.txt +++ b/src/unix/CMakeLists.txt @@ -44,6 +44,7 @@ endif() add_library(ui OBJECT unix_sdl.c + unix_osd.c unix_cdrom.c dummy_cdrom_ioctl.c ) diff --git a/src/unix/unix.c b/src/unix/unix.c index 4f3990590..d15646e2b 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -41,6 +41,7 @@ #include <86box/device.h> #include <86box/gameport.h> #include <86box/unix_sdl.h> +#include <86box/unix_osd.h> #include "cpu.h" #include <86box/timer.h> #include <86box/nvr.h> @@ -291,7 +292,7 @@ plat_get_string(int i) case STRING_MONITOR_SLEEP: return L"Monitor in sleep mode"; case STRING_EDID_TOO_LARGE: - return "EDID file \"%ls\" is too large."; + return L"EDID file \"%ls\" is too large."; } return L""; } @@ -1287,98 +1288,30 @@ main(int argc, char **argv) SDL_AddTimer(1000, timer_onesec, NULL); while (!is_quit) { static int mouse_inside = 0; + static int r_alt_pressed = 0; + static int flag_osd_open = 0; - while (SDL_PollEvent(&event)) { - switch (event.type) { - case SDL_QUIT: - exit_event = 1; - break; - case SDL_MOUSEWHEEL: + while (SDL_PollEvent(&event)) + { + if (flag_osd_open == 1) + { + // route almost everything to the OSD + switch (event.type) + { + case SDL_QUIT: { - if (mouse_capture || video_fullscreen) { - if (event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED) { - event.wheel.x *= -1; - event.wheel.y *= -1; - } - SDL_LockMutex(mousemutex); - mouse_set_z(event.wheel.y); - SDL_UnlockMutex(mousemutex); - } + exit_event = 1; break; } - case SDL_MOUSEMOTION: - { - if (mouse_capture || video_fullscreen) { - SDL_LockMutex(mousemutex); - mouse_scale(event.motion.xrel, event.motion.yrel); - SDL_UnlockMutex(mousemutex); - } - break; - } - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - { - if ((event.button.button == SDL_BUTTON_LEFT) - && !(mouse_capture || video_fullscreen) - && event.button.state == SDL_RELEASED - && mouse_inside) { - plat_mouse_capture(1); - break; - } - if (mouse_get_buttons() < 3 && event.button.button == SDL_BUTTON_MIDDLE && !video_fullscreen) { - plat_mouse_capture(0); - break; - } - if (mouse_capture || video_fullscreen) { - int buttonmask = 0; - - switch (event.button.button) { - case SDL_BUTTON_LEFT: - buttonmask = 1; - break; - case SDL_BUTTON_RIGHT: - buttonmask = 2; - break; - case SDL_BUTTON_MIDDLE: - buttonmask = 4; - break; - case SDL_BUTTON_X1: - buttonmask = 8; - break; - case SDL_BUTTON_X2: - buttonmask = 16; - break; - } - SDL_LockMutex(mousemutex); - if (event.button.state == SDL_PRESSED) - mouse_set_buttons_ex(mouse_get_buttons_ex() | buttonmask); - else - mouse_set_buttons_ex(mouse_get_buttons_ex() & ~buttonmask); - SDL_UnlockMutex(mousemutex); - } - break; - } - case SDL_RENDER_DEVICE_RESET: - case SDL_RENDER_TARGETS_RESET: + case SDL_RENDER_DEVICE_RESET: + case SDL_RENDER_TARGETS_RESET: { extern void sdl_reinit_texture(void); sdl_reinit_texture(); break; } - case SDL_KEYDOWN: - case SDL_KEYUP: - { - uint16_t xtkey = 0; - - switch (event.key.keysym.scancode) { - default: - xtkey = sdl_to_xt[event.key.keysym.scancode]; - break; - } - keyboard_input(event.key.state == SDL_PRESSED, xtkey); - } - case SDL_WINDOWEVENT: + case SDL_WINDOWEVENT: { switch (event.window.event) { case SDL_WINDOWEVENT_ENTER: @@ -1389,9 +1322,146 @@ main(int argc, char **argv) break; } } + default: + // route everything else + flag_osd_open = osd_handle(event); + + if (flag_osd_open == 0) + { + // close it + osd_close(event); + } + + break; + } + } + else + { + switch (event.type) + { + case SDL_QUIT: + exit_event = 1; + break; + case SDL_MOUSEWHEEL: + { + if (mouse_capture || video_fullscreen) { + if (event.wheel.direction == SDL_MOUSEWHEEL_FLIPPED) { + event.wheel.x *= -1; + event.wheel.y *= -1; + } + SDL_LockMutex(mousemutex); + mouse_set_z(event.wheel.y); + SDL_UnlockMutex(mousemutex); + } + break; + } + case SDL_MOUSEMOTION: + { + if (mouse_capture || video_fullscreen) { + SDL_LockMutex(mousemutex); + mouse_scale(event.motion.xrel, event.motion.yrel); + SDL_UnlockMutex(mousemutex); + } + break; + } + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + { + if ((event.button.button == SDL_BUTTON_LEFT) + && !(mouse_capture || video_fullscreen) + && event.button.state == SDL_RELEASED + && mouse_inside) { + plat_mouse_capture(1); + break; + } + if (mouse_get_buttons() < 3 && event.button.button == SDL_BUTTON_MIDDLE && !video_fullscreen) { + plat_mouse_capture(0); + break; + } + if (mouse_capture || video_fullscreen) { + int buttonmask = 0; + + switch (event.button.button) { + case SDL_BUTTON_LEFT: + buttonmask = 1; + break; + case SDL_BUTTON_RIGHT: + buttonmask = 2; + break; + case SDL_BUTTON_MIDDLE: + buttonmask = 4; + break; + case SDL_BUTTON_X1: + buttonmask = 8; + break; + case SDL_BUTTON_X2: + buttonmask = 16; + break; + } + SDL_LockMutex(mousemutex); + if (event.button.state == SDL_PRESSED) + mouse_set_buttons_ex(mouse_get_buttons_ex() | buttonmask); + else + mouse_set_buttons_ex(mouse_get_buttons_ex() & ~buttonmask); + SDL_UnlockMutex(mousemutex); + } + break; + } + case SDL_RENDER_DEVICE_RESET: + case SDL_RENDER_TARGETS_RESET: + { + extern void sdl_reinit_texture(void); + + sdl_reinit_texture(); + break; + } + case SDL_KEYDOWN: + case SDL_KEYUP: + { + uint16_t xtkey = 0; + + if (event.key.keysym.scancode == SDL_SCANCODE_RALT) + { + if (event.type == SDL_KEYDOWN) + r_alt_pressed = 1; + else + r_alt_pressed = 0; + } + + if (r_alt_pressed && event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_G) + { + // open OSD! + flag_osd_open = osd_open(event); + // we can assume alt-gr has been released + r_alt_pressed = 0; + break; + } + + switch (event.key.keysym.scancode) { + default: + xtkey = sdl_to_xt[event.key.keysym.scancode]; + break; + } + + keyboard_input(event.key.state == SDL_PRESSED, xtkey); + } + case SDL_WINDOWEVENT: + { + switch (event.window.event) { + case SDL_WINDOWEVENT_ENTER: + mouse_inside = 1; + break; + case SDL_WINDOWEVENT_LEAVE: + mouse_inside = 0; + break; + } + } + } } } - if (blitreq) { + + // blit only if the OSD is closed + if (blitreq && !flag_osd_open) { extern void sdl_blit(int x, int y, int w, int h); sdl_blit(params.x, params.y, params.w, params.h); } diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c new file mode 100644 index 000000000..48c801117 --- /dev/null +++ b/src/unix/unix_osd.c @@ -0,0 +1,369 @@ +#include +#include + +#include +#include +#include +#include +#include +/* This #undef is needed because a SDL include header redefines HAVE_STDARG_H. */ +#undef HAVE_STDARG_H +#define HAVE_STDARG_H +#include <86box/86box.h> +#include <86box/device.h> +#include <86box/plat.h> +#include <86box/plat_dynld.h> +#include <86box/video.h> +#include <86box/ui.h> +#include <86box/version.h> +#include <86box/unix_sdl.h> +#include <86box/unix_osd.h> + +#include +#include +#include + +static int SCREEN_W = 640; +static int SCREEN_H = 480; +static int BOX_W = 240; +static int BOX_H = 160; +#define LINE_HEIGHT 16 +#define TITLE_HEIGHT 16 +#define SCROLLBAR_WIDTH 6 +#define CHAR_W 8 +#define CHAR_H 8 + +extern SDL_Window *sdl_win; +extern SDL_Renderer *sdl_render; + +typedef enum { + STATE_MENU, + STATE_FILESELECT +} AppState; + +static const char *menu_items[] = { + "fddload - Load floppy disk image", + "cdload - Load CD-ROM image", + "rdiskload - Load removable disk image", + "cartload - Load cartridge image", + "moload - Load MO image", + "fddeject - eject disk from floppy drive", + "cdeject - eject disc from CD-ROM drive", + "rdiskeject - eject removable disk", + "carteject - eject cartridge", + "moeject - eject image from MO drive", + "hardreset - hard reset the emulated system", + "pause - pause the the emulated system", + "fullscreen - toggle fullscreen", + "version - print version and license information", + "exit - exit 86Box", + "close OSD" +}; +#define MENU_ITEMS (sizeof(menu_items) / sizeof(menu_items[0])) + +static char selected_file[256] = ""; // memoria della selezione + +static SDL_Texture *font_texture = NULL; +static int font_cols = 16; // numero colonne nella bitmap font (16x16 caratteri) +static int font_rows = 16; + +static int selected = 0; +static int file_selected = 0; +static int scroll_offset = 0; +static AppState state = STATE_MENU; + +static char files[100][256]; +static int file_count = 0; + +static int max_visible = 0; + +// ------------------- Funzione: trova i file .iso ------------------- +int load_iso_files(char files[][256], int max_files) { + DIR *d; + struct dirent *dir; + int count = 0; + d = opendir("."); + if (!d) return 0; + + while ((dir = readdir(d)) != NULL && count < max_files) { + if (strstr(dir->d_name, ".iso")) { + strncpy(files[count], dir->d_name, 255); + files[count][255] = '\0'; + count++; + } + } + closedir(d); + return count; +} + +// ------------------- Disegna testo da bitmap font ------------------- +void draw_text(SDL_Renderer *renderer, const char *text, int x, int y, SDL_Color color) { + if (!font_texture) return; + SDL_SetTextureColorMod(font_texture, color.r, color.g, color.b); + + int i = 0; + while (text[i]) { + unsigned char c = text[i]; + int tx = (c % font_cols) * CHAR_W; + int ty = (c / font_cols) * CHAR_H; + SDL_Rect src = {tx, ty, CHAR_W, CHAR_H}; + SDL_Rect dst = {x + i * CHAR_W, y, CHAR_W, CHAR_H}; + SDL_RenderCopy(renderer, font_texture, &src, &dst); + i++; + } +} + +// ------------------- Disegna cornice rossa + riquadro ------------------- +void draw_box_with_border(SDL_Renderer *renderer, SDL_Rect box) { + SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); + SDL_RenderDrawRect(renderer, &box); + + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + SDL_Rect inner = {box.x + 2, box.y + 2, box.w - 4, box.h - 4}; + SDL_RenderDrawRect(renderer, &inner); + + SDL_SetRenderDrawColor(renderer, 0, 0, 128, 255); + SDL_RenderFillRect(renderer, &inner); +} + +// ------------------- Disegna menu principale ------------------- +void draw_menu(SDL_Renderer *renderer, int selected) { + SDL_SetRenderDrawColor(renderer, 0, 0, 128, 255); + SDL_RenderClear(renderer); + + int x0 = (SCREEN_W - BOX_W) / 2; + int y0 = (SCREEN_H - BOX_H) / 2; + SDL_Rect box = {x0, y0, BOX_W, BOX_H}; + draw_box_with_border(renderer, box); + + draw_text(renderer, "MAIN MENU", x0 + 20, y0 + 5, (SDL_Color){255,255,255,255}); + + for (int i = 0; i < MENU_ITEMS; i++) { + int tx = x0 + 20; + int ty = y0 + TITLE_HEIGHT + i * LINE_HEIGHT; + + SDL_Color textColor; + SDL_Rect bgRect = {tx - 5, ty - 2, BOX_W - 20, LINE_HEIGHT}; + + if (i == selected) { + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + SDL_RenderFillRect(renderer, &bgRect); + textColor = (SDL_Color){0, 0, 0, 255}; + } else { + textColor = (SDL_Color){255, 255, 0, 255}; + } + + draw_text(renderer, menu_items[i], tx, ty, textColor); + } + + if (selected_file[0] != '\0') { + char buffer[300]; + snprintf(buffer, sizeof(buffer), "File: %s", selected_file); + draw_text(renderer, buffer, 20, SCREEN_H - 20, (SDL_Color){255,255,255,255}); + } + + SDL_RenderPresent(renderer); +} + +// ------------------- Disegna selezione file ------------------- +void draw_file_selector(SDL_Renderer *renderer, + char files[][256], int file_count, + int selected, int scroll_offset, int max_visible) { + SDL_SetRenderDrawColor(renderer, 0, 0, 128, 255); + SDL_RenderClear(renderer); + + int x0 = (SCREEN_W - BOX_W) / 2; + int y0 = (SCREEN_H - BOX_H) / 2; + SDL_Rect box = {x0, y0, BOX_W, BOX_H}; + draw_box_with_border(renderer, box); + + draw_text(renderer, "SELEZIONE FILE", x0 + 20, y0 + 5, (SDL_Color){255,255,255,255}); + + if (file_count == 0) { + draw_text(renderer, "Nessun file trovato", + x0 + 20, y0 + TITLE_HEIGHT + 10, + (SDL_Color){255, 255, 0, 255}); + } else { + for (int i = 0; i < max_visible && (i + scroll_offset) < file_count; i++) { + int index = i + scroll_offset; + int tx = x0 + 20; + int ty = y0 + TITLE_HEIGHT + i * LINE_HEIGHT; + + SDL_Color textColor; + SDL_Rect bgRect = {tx - 5, ty - 2, 200, LINE_HEIGHT}; + + if (index == selected) { + SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); + SDL_RenderFillRect(renderer, &bgRect); + textColor = (SDL_Color){0, 0, 0, 255}; + } else { + textColor = (SDL_Color){255, 255, 0, 255}; + } + + draw_text(renderer, files[index], tx, ty, textColor); + } + } + + SDL_RenderPresent(renderer); +} + +int osd_open(SDL_Event event) +{ + // ok opened + fprintf(stderr, "OSD OPEN\n"); + + SDL_GetWindowSize(sdl_win, &SCREEN_W, &SCREEN_H); + BOX_W = (SCREEN_W / 4) * 3; + BOX_H = (SCREEN_H / 4) * 3; + + max_visible = (BOX_H - TITLE_HEIGHT) / LINE_HEIGHT; + + // Carica font bitmap (font.bmp 128x128, 16x16 caratteri, 8x8 ciascuno) + SDL_Surface *font_surface = SDL_LoadBMP("font.bmp"); + if (!font_surface) { + printf("Errore caricamento font.bmp: %s\n", SDL_GetError()); + return 1; + } + // Imposta trasparenza sul nero puro + SDL_SetColorKey(font_surface, SDL_TRUE, SDL_MapRGB(font_surface->format, 0, 0, 0)); + font_texture = SDL_CreateTextureFromSurface(sdl_render, font_surface); + SDL_FreeSurface(font_surface); + + return 1; +} + +int osd_close(SDL_Event event) +{ + // ok closed + fprintf(stderr, "OSD CLOSE\n"); + + SDL_DestroyTexture(font_texture); + + return 1; +} + + +int osd_handle(SDL_Event event) +{ + fprintf(stderr, "OSD HANDLE\n"); + + if (state == STATE_MENU) { + draw_menu(sdl_render, selected); + } else if (state == STATE_FILESELECT) { + draw_file_selector(sdl_render, files, file_count, file_selected, scroll_offset, max_visible); + } + + if (event.type == SDL_KEYUP) + { + if (event.key.keysym.scancode == SDL_SCANCODE_ESCAPE) + { + // Close the OSD + fprintf(stderr, "OSD HANDLE: escape\n"); + return 0; + } + } + + if (event.type == SDL_KEYDOWN) { + if (state == STATE_MENU) { + switch (event.key.keysym.sym) { + case SDLK_UP: + selected = (selected - 1 + MENU_ITEMS) % MENU_ITEMS; + break; + case SDLK_DOWN: + selected = (selected + 1) % MENU_ITEMS; + break; + case SDLK_RETURN: + case SDLK_KP_ENTER: + if (selected == MENU_ITEMS - 1) { + return 0; // Esci + } + else if (strcmp(menu_items[selected], "Carica partita") == 0) + { + file_count = load_iso_files(files, 100); + file_selected = 0; + scroll_offset = 0; + state = STATE_FILESELECT; + } + else + { + switch (selected) + { + case 0 : // "fddload - Load floppy disk image", + break; + case 1 : // "cdload - Load CD-ROM image", + break; + case 2 : // "rdiskload - Load removable disk image", + break; + case 3 : // "cartload - Load cartridge image", + break; + case 4 : // "moload - Load MO image", + break; + case 5 : // "fddeject - eject disk from floppy drive", + break; + case 6 : // "cdeject - eject disc from CD-ROM drive", + break; + case 7 : // "rdiskeject - eject removable disk", + break; + case 8 : // "carteject - eject cartridge", + break; + case 9 : // "moeject - eject image from MO drive", + break; + case 10 : // "hardreset - hard reset the emulated system", + break; + case 11 : // "pause - pause the the emulated system", + break; + case 12 : // "fullscreen - toggle fullscreen", + break; + case 13 : // "version - print version and license information", + break; + case 14 : // "exit - exit 86Box", + break; + case 15 : // "close OSD" + break; + } + + printf("Hai scelto: %s\n", menu_items[selected]); + } + break; + } + } else if (state == STATE_FILESELECT) { + if (file_count == 0) { + if (event.key.keysym.sym == SDLK_ESCAPE) { + state = STATE_MENU; + } + } else { + switch (event.key.keysym.sym) { + case SDLK_UP: + if (file_selected > 0) { + file_selected--; + if (file_selected < scroll_offset) { + scroll_offset--; + } + } + break; + case SDLK_DOWN: + if (file_selected < file_count - 1) { + file_selected++; + if (file_selected >= scroll_offset + max_visible) { + scroll_offset++; + } + } + break; + case SDLK_RETURN: + case SDLK_KP_ENTER: + strncpy(selected_file, files[file_selected], 255); + selected_file[255] = '\0'; + printf("Selezionato file: %s\n", selected_file); + state = STATE_MENU; + break; + case SDLK_ESCAPE: + state = STATE_MENU; + break; + } + } + } + } + + // Keep it open + return 1; +} diff --git a/src/utils/crc32.c b/src/utils/crc32.c index 6993654ae..8c4e96c3c 100644 --- a/src/utils/crc32.c +++ b/src/utils/crc32.c @@ -22,7 +22,10 @@ #include #include +#ifndef __USE_LARGEFILE64 #define __USE_LARGEFILE64 +#endif + #include #if (defined(__HAIKU__) || defined(__unix__) || defined(__APPLE__)) && !defined(__linux__) From a2d66eea51f02d88b0bd995d7c9762b35c6afaf3 Mon Sep 17 00:00:00 2001 From: Valerio Date: Fri, 12 Sep 2025 16:34:20 +0200 Subject: [PATCH 002/113] initial --- src/include/86box/unix_osd_font.h | 4109 +++++++++++++++++++++++++++++ src/unix/unix.c | 438 +-- src/unix/unix_osd.c | 29 +- 3 files changed, 4352 insertions(+), 224 deletions(-) create mode 100644 src/include/86box/unix_osd_font.h diff --git a/src/include/86box/unix_osd_font.h b/src/include/86box/unix_osd_font.h new file mode 100644 index 000000000..412d367c7 --- /dev/null +++ b/src/include/86box/unix_osd_font.h @@ -0,0 +1,4109 @@ +#ifndef UNIX_OSD_FONT_H_INCLUDED +#define UNIX_OSD_FONT_H_INCLUDED + +unsigned char _________font_bmp[] = { + 0x42, 0x4d, 0x36, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, + 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa +}; +unsigned int _________font_bmp_len = 49206; + +#endif // UNIX_OSD_FONT_H_INCLUDED diff --git a/src/unix/unix.c b/src/unix/unix.c index d15646e2b..45f108ef2 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -974,67 +974,48 @@ timer_onesec(uint32_t interval, UNUSED(void *param)) } void -monitor_thread(UNUSED(void *param)) +unix_executeLine(char *line) { -#ifndef USE_CLI - if (isatty(fileno(stdin)) && isatty(fileno(stdout))) { - char *line = NULL; - size_t n; + if (line) { + int cmdargc = 0; + char *linecpy; - printf("86Box monitor console.\n"); - while (!exit_event) { - if (feof(stdin)) + line[strcspn(line, "\r\n")] = '\0'; + linecpy = strdup(line); + if (!linecpy) { + free(line); + line = NULL; + return; + } + if (f_add_history) + f_add_history(line); + memset(xargv, 0, sizeof(xargv)); + while (1) { + xargv[cmdargc++] = local_strsep(&linecpy, " "); + if (xargv[cmdargc - 1] == NULL || cmdargc >= 512) break; -#ifdef ENABLE_READLINE - if (f_readline) - line = f_readline("(86Box) "); - else { -#endif - printf("(86Box) "); - (void) !getline(&line, &n, stdin); -#ifdef ENABLE_READLINE - } -#endif - if (line) { - int cmdargc = 0; - char *linecpy; - - line[strcspn(line, "\r\n")] = '\0'; - linecpy = strdup(line); - if (!linecpy) { - free(line); - line = NULL; - continue; - } - if (f_add_history) - f_add_history(line); - memset(xargv, 0, sizeof(xargv)); - while (1) { - xargv[cmdargc++] = local_strsep(&linecpy, " "); - if (xargv[cmdargc - 1] == NULL || cmdargc >= 512) - break; - } - cmdargc--; - if (strncasecmp(xargv[0], "help", 4) == 0) { - printf( - "fddload - Load floppy disk image into drive .\n" - "cdload - Load CD-ROM image into drive .\n" - "rdiskload - Load removable disk image into removable disk drive .\n" - "cartload - Load cartridge image into cartridge drive .\n" - "moload - Load MO image into MO drive .\n\n" - "fddeject - eject disk from floppy drive .\n" - "cdeject - eject disc from CD-ROM drive .\n" - "rdiskeject - eject removable disk image from removable disk drive .\n" - "carteject - eject cartridge from drive .\n" - "moeject - eject image from MO drive .\n\n" - "hardreset - hard reset the emulated system.\n" - "pause - pause the the emulated system.\n" - "fullscreen - toggle fullscreen.\n" - "version - print version and license information.\n" - "exit - exit 86Box.\n"); - } else if (strncasecmp(xargv[0], "exit", 4) == 0) { - exit_event = 1; - } else if (strncasecmp(xargv[0], "version", 7) == 0) { + } + cmdargc--; + if (strncasecmp(xargv[0], "help", 4) == 0) { + printf( + "fddload - Load floppy disk image into drive .\n" + "cdload - Load CD-ROM image into drive .\n" + "rdiskload - Load removable disk image into removable disk drive .\n" + "cartload - Load cartridge image into cartridge drive .\n" + "moload - Load MO image into MO drive .\n\n" + "fddeject - eject disk from floppy drive .\n" + "cdeject - eject disc from CD-ROM drive .\n" + "rdiskeject - eject removable disk image from removable disk drive .\n" + "carteject - eject cartridge from drive .\n" + "moeject - eject image from MO drive .\n\n" + "hardreset - hard reset the emulated system.\n" + "pause - pause the the emulated system.\n" + "fullscreen - toggle fullscreen.\n" + "version - print version and license information.\n" + "exit - exit 86Box.\n"); + } else if (strncasecmp(xargv[0], "exit", 4) == 0) { + exit_event = 1; + } else if (strncasecmp(xargv[0], "version", 7) == 0) { # ifndef EMU_GIT_HASH # define EMU_GIT_HASH "0000000" # endif @@ -1061,169 +1042,194 @@ monitor_thread(UNUSED(void *param)) # define DYNAREC_STR "no dynarec" # endif - printf( - "%s v%s [%s] [%s, %s]\n\n" - "An emulator of old computers\n" - "Authors: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), " - "Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), " - "Tiseno100, reenigne, and others.\n" - "With previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\n" - "Released under the GNU General Public License version 2 or later. See LICENSE for more information.\n", - EMU_NAME, EMU_VERSION_FULL, EMU_GIT_HASH, ARCH_STR, DYNAREC_STR); - } else if (strncasecmp(xargv[0], "fullscreen", 10) == 0) { - video_fullscreen = video_fullscreen ? 0 : 1; - fullscreen_pending = 1; - } else if (strncasecmp(xargv[0], "pause", 5) == 0) { - plat_pause(dopause ^ 1); - printf("%s", dopause ? "Paused.\n" : "Unpaused.\n"); - } else if (strncasecmp(xargv[0], "hardreset", 9) == 0) { - pc_reset_hard(); - } else if (strncasecmp(xargv[0], "cdload", 6) == 0 && cmdargc >= 3) { - uint8_t id; - bool err = false; - char fn[PATH_MAX]; + printf( + "%s v%s [%s] [%s, %s]\n\n" + "An emulator of old computers\n" + "Authors: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), " + "Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), " + "Tiseno100, reenigne, and others.\n" + "With previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\n" + "Released under the GNU General Public License version 2 or later. See LICENSE for more information.\n", + EMU_NAME, EMU_VERSION_FULL, EMU_GIT_HASH, ARCH_STR, DYNAREC_STR); + } else if (strncasecmp(xargv[0], "fullscreen", 10) == 0) { + video_fullscreen = video_fullscreen ? 0 : 1; + fullscreen_pending = 1; + } else if (strncasecmp(xargv[0], "pause", 5) == 0) { + plat_pause(dopause ^ 1); + printf("%s", dopause ? "Paused.\n" : "Unpaused.\n"); + } else if (strncasecmp(xargv[0], "hardreset", 9) == 0) { + pc_reset_hard(); + } else if (strncasecmp(xargv[0], "cdload", 6) == 0 && cmdargc >= 3) { + uint8_t id; + bool err = false; + char fn[PATH_MAX]; - if (!xargv[2] || !xargv[1]) { - free(line); - free(linecpy); - line = NULL; - continue; - } - id = atoi(xargv[1]); - memset(fn, 0, sizeof(fn)); - if (xargv[2][0] == '\'' || xargv[2][0] == '"') { - int curarg = 2; - - for (curarg = 2; curarg < cmdargc; curarg++) { - if (strlen(fn) + strlen(xargv[curarg]) >= PATH_MAX) { - err = true; - fprintf(stderr, "Path name too long.\n"); - } - strcat(fn, xargv[curarg] + (xargv[curarg][0] == '\'' || xargv[curarg][0] == '"')); - if (fn[strlen(fn) - 1] == '\'' - || fn[strlen(fn) - 1] == '"') { - break; - } - strcat(fn, " "); - } - } else { - if (strlen(xargv[2]) < PATH_MAX) { - strcpy(fn, xargv[2]); - } else { - fprintf(stderr, "Path name too long.\n"); - } - } - if (!err) { - - if (fn[strlen(fn) - 1] == '\'' - || fn[strlen(fn) - 1] == '"') - fn[strlen(fn) - 1] = '\0'; - printf("Inserting disc into CD-ROM drive %hhu: %s\n", id, fn); - cdrom_mount(id, fn); - } - } else if (strncasecmp(xargv[0], "fddeject", 8) == 0 && cmdargc >= 2) { - floppy_eject(atoi(xargv[1])); - } else if (strncasecmp(xargv[0], "cdeject", 8) == 0 && cmdargc >= 2) { - cdrom_mount(atoi(xargv[1]), ""); - } else if (strncasecmp(xargv[0], "moeject", 8) == 0 && cmdargc >= 2) { - mo_eject(atoi(xargv[1])); - } else if (strncasecmp(xargv[0], "carteject", 8) == 0 && cmdargc >= 2) { - cartridge_eject(atoi(xargv[1])); - } else if (strncasecmp(xargv[0], "rdiskeject", 8) == 0 && cmdargc >= 2) { - rdisk_eject(atoi(xargv[1])); - } else if (strncasecmp(xargv[0], "fddload", 7) == 0 && cmdargc >= 4) { - uint8_t id; - uint8_t wp; - bool err = false; - char fn[PATH_MAX]; - - memset(fn, 0, sizeof(fn)); - - if (!xargv[2] || !xargv[1]) { - free(line); - free(linecpy); - line = NULL; - continue; - } - err = process_media_commands_3(&id, fn, &wp, cmdargc); - if (!err) { - if (fn[strlen(fn) - 1] == '\'' - || fn[strlen(fn) - 1] == '"') - fn[strlen(fn) - 1] = '\0'; - printf("Inserting disk into floppy drive %c: %s\n", id + 'A', fn); - floppy_mount(id, fn, wp); - } - } else if (strncasecmp(xargv[0], "moload", 7) == 0 && cmdargc >= 4) { - uint8_t id; - uint8_t wp; - bool err = false; - char fn[PATH_MAX]; - - memset(fn, 0, sizeof(fn)); - - if (!xargv[2] || !xargv[1]) { - free(line); - free(linecpy); - line = NULL; - continue; - } - err = process_media_commands_3(&id, fn, &wp, cmdargc); - if (!err) { - if (fn[strlen(fn) - 1] == '\'' - || fn[strlen(fn) - 1] == '"') - fn[strlen(fn) - 1] = '\0'; - printf("Inserting into mo drive %hhu: %s\n", id, fn); - mo_mount(id, fn, wp); - } - } else if (strncasecmp(xargv[0], "cartload", 7) == 0 && cmdargc >= 4) { - uint8_t id; - uint8_t wp; - bool err = false; - char fn[PATH_MAX]; - - memset(fn, 0, sizeof(fn)); - - if (!xargv[2] || !xargv[1]) { - free(line); - free(linecpy); - line = NULL; - continue; - } - err = process_media_commands_3(&id, fn, &wp, cmdargc); - if (!err) { - if (fn[strlen(fn) - 1] == '\'' - || fn[strlen(fn) - 1] == '"') - fn[strlen(fn) - 1] = '\0'; - printf("Inserting tape into cartridge holder %hhu: %s\n", id, fn); - cartridge_mount(id, fn, wp); - } - } else if (strncasecmp(xargv[0], "rdiskload", 7) == 0 && cmdargc >= 4) { - uint8_t id; - uint8_t wp; - bool err = false; - char fn[PATH_MAX]; - - memset(fn, 0, sizeof(fn)); - - if (!xargv[2] || !xargv[1]) { - free(line); - free(linecpy); - line = NULL; - continue; - } - err = process_media_commands_3(&id, fn, &wp, cmdargc); - if (!err) { - if (fn[strlen(fn) - 1] == '\'' - || fn[strlen(fn) - 1] == '"') - fn[strlen(fn) - 1] = '\0'; - printf("Inserting disk into removable disk drive %c: %s\n", id + 'A', fn); - rdisk_mount(id, fn, wp); - } - } + if (!xargv[2] || !xargv[1]) { free(line); free(linecpy); line = NULL; + return; } + id = atoi(xargv[1]); + memset(fn, 0, sizeof(fn)); + if (xargv[2][0] == '\'' || xargv[2][0] == '"') { + int curarg = 2; + + for (curarg = 2; curarg < cmdargc; curarg++) { + if (strlen(fn) + strlen(xargv[curarg]) >= PATH_MAX) { + err = true; + fprintf(stderr, "Path name too long.\n"); + } + strcat(fn, xargv[curarg] + (xargv[curarg][0] == '\'' || xargv[curarg][0] == '"')); + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') { + break; + } + strcat(fn, " "); + } + } else { + if (strlen(xargv[2]) < PATH_MAX) { + strcpy(fn, xargv[2]); + } else { + fprintf(stderr, "Path name too long.\n"); + } + } + if (!err) { + + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') + fn[strlen(fn) - 1] = '\0'; + printf("Inserting disc into CD-ROM drive %hhu: %s\n", id, fn); + cdrom_mount(id, fn); + } + } else if (strncasecmp(xargv[0], "fddeject", 8) == 0 && cmdargc >= 2) { + floppy_eject(atoi(xargv[1])); + } else if (strncasecmp(xargv[0], "cdeject", 8) == 0 && cmdargc >= 2) { + cdrom_mount(atoi(xargv[1]), ""); + } else if (strncasecmp(xargv[0], "moeject", 8) == 0 && cmdargc >= 2) { + mo_eject(atoi(xargv[1])); + } else if (strncasecmp(xargv[0], "carteject", 8) == 0 && cmdargc >= 2) { + cartridge_eject(atoi(xargv[1])); + } else if (strncasecmp(xargv[0], "rdiskeject", 8) == 0 && cmdargc >= 2) { + rdisk_eject(atoi(xargv[1])); + } else if (strncasecmp(xargv[0], "fddload", 7) == 0 && cmdargc >= 4) { + uint8_t id; + uint8_t wp; + bool err = false; + char fn[PATH_MAX]; + + memset(fn, 0, sizeof(fn)); + + if (!xargv[2] || !xargv[1]) { + free(line); + free(linecpy); + line = NULL; + return; + } + err = process_media_commands_3(&id, fn, &wp, cmdargc); + if (!err) { + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') + fn[strlen(fn) - 1] = '\0'; + printf("Inserting disk into floppy drive %c: %s\n", id + 'A', fn); + floppy_mount(id, fn, wp); + } + } else if (strncasecmp(xargv[0], "moload", 7) == 0 && cmdargc >= 4) { + uint8_t id; + uint8_t wp; + bool err = false; + char fn[PATH_MAX]; + + memset(fn, 0, sizeof(fn)); + + if (!xargv[2] || !xargv[1]) { + free(line); + free(linecpy); + line = NULL; + return; + } + err = process_media_commands_3(&id, fn, &wp, cmdargc); + if (!err) { + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') + fn[strlen(fn) - 1] = '\0'; + printf("Inserting into mo drive %hhu: %s\n", id, fn); + mo_mount(id, fn, wp); + } + } else if (strncasecmp(xargv[0], "cartload", 7) == 0 && cmdargc >= 4) { + uint8_t id; + uint8_t wp; + bool err = false; + char fn[PATH_MAX]; + + memset(fn, 0, sizeof(fn)); + + if (!xargv[2] || !xargv[1]) { + free(line); + free(linecpy); + line = NULL; + return; + } + err = process_media_commands_3(&id, fn, &wp, cmdargc); + if (!err) { + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') + fn[strlen(fn) - 1] = '\0'; + printf("Inserting tape into cartridge holder %hhu: %s\n", id, fn); + cartridge_mount(id, fn, wp); + } + } else if (strncasecmp(xargv[0], "rdiskload", 7) == 0 && cmdargc >= 4) { + uint8_t id; + uint8_t wp; + bool err = false; + char fn[PATH_MAX]; + + memset(fn, 0, sizeof(fn)); + + if (!xargv[2] || !xargv[1]) { + free(line); + free(linecpy); + line = NULL; + return; + } + err = process_media_commands_3(&id, fn, &wp, cmdargc); + if (!err) { + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') + fn[strlen(fn) - 1] = '\0'; + printf("Inserting disk into removable disk drive %c: %s\n", id + 'A', fn); + rdisk_mount(id, fn, wp); + } + } + free(line); + free(linecpy); + line = NULL; + } +} + +void +monitor_thread(UNUSED(void *param)) +{ +#ifndef USE_CLI + if (isatty(fileno(stdin)) && isatty(fileno(stdout))) { + char *line = NULL; + size_t n; + + printf("86Box monitor console.\n"); + while (!exit_event) { + if (feof(stdin)) + break; +#ifdef ENABLE_READLINE + if (f_readline) + line = f_readline("(86Box) "); + else { +#endif + printf("(86Box) "); + (void) !getline(&line, &n, stdin); +#ifdef ENABLE_READLINE + } +#endif + unix_executeLine(line); } } #endif diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index 48c801117..3fbdf723f 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -5,7 +5,10 @@ #include #include #include +#include +#include #include + /* This #undef is needed because a SDL include header redefines HAVE_STDARG_H. */ #undef HAVE_STDARG_H #define HAVE_STDARG_H @@ -18,10 +21,7 @@ #include <86box/version.h> #include <86box/unix_sdl.h> #include <86box/unix_osd.h> - -#include -#include -#include +#include <86box/unix_osd_font.h> static int SCREEN_W = 640; static int SCREEN_H = 480; @@ -33,9 +33,13 @@ static int BOX_H = 160; #define CHAR_W 8 #define CHAR_H 8 +// interface to SDL environment extern SDL_Window *sdl_win; extern SDL_Renderer *sdl_render; +// interface back to main unix monitor implementation +extern void unix_executeLine(char *line); + typedef enum { STATE_MENU, STATE_FILESELECT @@ -219,11 +223,20 @@ int osd_open(SDL_Event event) max_visible = (BOX_H - TITLE_HEIGHT) / LINE_HEIGHT; // Carica font bitmap (font.bmp 128x128, 16x16 caratteri, 8x8 ciascuno) - SDL_Surface *font_surface = SDL_LoadBMP("font.bmp"); - if (!font_surface) { - printf("Errore caricamento font.bmp: %s\n", SDL_GetError()); - return 1; + SDL_RWops *rwop = SDL_RWFromConstMem(_________font_bmp, _________font_bmp_len); + if (!rwop) + { + fprintf(stderr, "Cannot create a new SDL RW stream: %s\n", SDL_GetError()); + return 0; } + + // auto-closes the stream + SDL_Surface *font_surface = SDL_LoadBMP_RW(rwop, 1); + if (!font_surface) { + fprintf(stderr, "Cannot create a surface using RW stream: %s\n", SDL_GetError()); + return 0; + } + // Imposta trasparenza sul nero puro SDL_SetColorKey(font_surface, SDL_TRUE, SDL_MapRGB(font_surface->format, 0, 0, 0)); font_texture = SDL_CreateTextureFromSurface(sdl_render, font_surface); From 47298ed3189e8d020d58e9201861c4bd2c7e80fd Mon Sep 17 00:00:00 2001 From: Valerio Vitali Date: Fri, 12 Sep 2025 19:19:45 +0200 Subject: [PATCH 003/113] fullscreen on/off --- src/unix/unix.c | 3 +++ src/unix/unix_osd.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/unix/unix.c b/src/unix/unix.c index 45f108ef2..cbf41f6ed 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1327,8 +1327,10 @@ main(int argc, char **argv) mouse_inside = 0; break; } + break; } default: + { // route everything else flag_osd_open = osd_handle(event); @@ -1339,6 +1341,7 @@ main(int argc, char **argv) } break; + } } } else diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index 3fbdf723f..5e155367a 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -326,6 +326,9 @@ int osd_handle(SDL_Event event) case 11 : // "pause - pause the the emulated system", break; case 12 : // "fullscreen - toggle fullscreen", + unix_executeLine(strdup("fullscreen")); + // directly close the OSD + return 0; break; case 13 : // "version - print version and license information", break; From df503f95f9b05709005fdd045ad05836992a589d Mon Sep 17 00:00:00 2001 From: Valerio Date: Fri, 12 Sep 2025 19:40:12 +0200 Subject: [PATCH 004/113] more commands --- src/unix/unix_osd.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index 5e155367a..910c84849 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -322,8 +322,14 @@ int osd_handle(SDL_Event event) case 9 : // "moeject - eject image from MO drive", break; case 10 : // "hardreset - hard reset the emulated system", + unix_executeLine(strdup("hardreset")); + // directly close the OSD + return 0; break; case 11 : // "pause - pause the the emulated system", + unix_executeLine(strdup("pause")); + // directly close the OSD + return 0; break; case 12 : // "fullscreen - toggle fullscreen", unix_executeLine(strdup("fullscreen")); @@ -331,11 +337,18 @@ int osd_handle(SDL_Event event) return 0; break; case 13 : // "version - print version and license information", + unix_executeLine(strdup("version")); + // directly close the OSD + return 0; break; case 14 : // "exit - exit 86Box", + unix_executeLine(strdup("exit")); + // directly close the OSD + return 0; break; case 15 : // "close OSD" - break; + // directly close the OSD + return 0; } printf("Hai scelto: %s\n", menu_items[selected]); From 606b9aca3d5b72439c7d7946e0d807dfa16c8eb1 Mon Sep 17 00:00:00 2001 From: Valerio Date: Sat, 13 Sep 2025 12:23:11 +0200 Subject: [PATCH 005/113] other fixes, cd and floppy load --- src/86box.c | 5 +- src/include/86box/unix_osd.h | 3 + src/unix/unix.c | 50 +++---- src/unix/unix_osd.c | 279 ++++++++++++++++++++--------------- src/unix/unix_sdl.c | 5 +- 5 files changed, 193 insertions(+), 149 deletions(-) diff --git a/src/86box.c b/src/86box.c index 0b5a26131..44e2d24f6 100644 --- a/src/86box.c +++ b/src/86box.c @@ -1078,7 +1078,10 @@ usage: /* Build the global configuration file path. */ if (global == NULL) { plat_get_global_config_dir(global_cfg_path, sizeof(global_cfg_path)); - path_append_filename(global_cfg_path, global_cfg_path, GLOBAL_CONFIG_FILE); + // avoid strcpy global_cfg_path over itself (valgrind says it's bad...) + // path_append_filename(global_cfg_path, global_cfg_path, GLOBAL_CONFIG_FILE); + path_slash(global_cfg_path); + strcat(global_cfg_path, GLOBAL_CONFIG_FILE); } else { strncpy(global_cfg_path, global, sizeof(global_cfg_path) - 1); } diff --git a/src/include/86box/unix_osd.h b/src/include/86box/unix_osd.h index 4ae93a8c2..90c319fbe 100644 --- a/src/include/86box/unix_osd.h +++ b/src/include/86box/unix_osd.h @@ -3,6 +3,9 @@ #include +extern void osd_init(); +extern void osd_deinit(); + extern int osd_open(SDL_Event event); extern int osd_close(SDL_Event event); extern int osd_handle(SDL_Event event); diff --git a/src/unix/unix.c b/src/unix/unix.c index cbf41f6ed..0eefea211 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -753,7 +753,6 @@ ui_sb_set_ready(UNUSED(int ready)) /* No-op. */ } -char *xargv[512]; // From musl. char * @@ -915,7 +914,7 @@ plat_get_vmm_dir(char *outbuf, const size_t len) } bool -process_media_commands_3(uint8_t *id, char *fn, uint8_t *wp, int cmdargc) +process_media_commands_3(uint8_t *id, char *fn, uint8_t *wp, char **xargv, int cmdargc) { bool err = false; @@ -951,6 +950,7 @@ process_media_commands_3(uint8_t *id, char *fn, uint8_t *wp, int cmdargc) fn[strlen(fn) - 1] = '\0'; return err; } + char *(*f_readline)(const char *) = NULL; int (*f_add_history)(const char *) = NULL; void (*f_rl_callback_handler_remove)(void) = NULL; @@ -977,21 +977,23 @@ void unix_executeLine(char *line) { if (line) { + char *xargv[512]; int cmdargc = 0; - char *linecpy; + char *linecpy, *linespn; + + linecpy = linespn = strdup(line); + linecpy[strcspn(linecpy, "\r\n")] = 0; - line[strcspn(line, "\r\n")] = '\0'; - linecpy = strdup(line); if (!linecpy) { - free(line); - line = NULL; return; } + if (f_add_history) - f_add_history(line); + f_add_history(linecpy); + memset(xargv, 0, sizeof(xargv)); while (1) { - xargv[cmdargc++] = local_strsep(&linecpy, " "); + xargv[cmdargc++] = local_strsep(&linespn, " "); if (xargv[cmdargc - 1] == NULL || cmdargc >= 512) break; } @@ -1065,9 +1067,7 @@ unix_executeLine(char *line) char fn[PATH_MAX]; if (!xargv[2] || !xargv[1]) { - free(line); free(linecpy); - line = NULL; return; } id = atoi(xargv[1]); @@ -1121,12 +1121,10 @@ unix_executeLine(char *line) memset(fn, 0, sizeof(fn)); if (!xargv[2] || !xargv[1]) { - free(line); free(linecpy); - line = NULL; return; } - err = process_media_commands_3(&id, fn, &wp, cmdargc); + err = process_media_commands_3(&id, fn, &wp, xargv, cmdargc); if (!err) { if (fn[strlen(fn) - 1] == '\'' || fn[strlen(fn) - 1] == '"') @@ -1143,12 +1141,10 @@ unix_executeLine(char *line) memset(fn, 0, sizeof(fn)); if (!xargv[2] || !xargv[1]) { - free(line); free(linecpy); - line = NULL; return; } - err = process_media_commands_3(&id, fn, &wp, cmdargc); + err = process_media_commands_3(&id, fn, &wp, xargv, cmdargc); if (!err) { if (fn[strlen(fn) - 1] == '\'' || fn[strlen(fn) - 1] == '"') @@ -1165,12 +1161,10 @@ unix_executeLine(char *line) memset(fn, 0, sizeof(fn)); if (!xargv[2] || !xargv[1]) { - free(line); free(linecpy); - line = NULL; return; } - err = process_media_commands_3(&id, fn, &wp, cmdargc); + err = process_media_commands_3(&id, fn, &wp, xargv, cmdargc); if (!err) { if (fn[strlen(fn) - 1] == '\'' || fn[strlen(fn) - 1] == '"') @@ -1187,12 +1181,10 @@ unix_executeLine(char *line) memset(fn, 0, sizeof(fn)); if (!xargv[2] || !xargv[1]) { - free(line); free(linecpy); - line = NULL; return; } - err = process_media_commands_3(&id, fn, &wp, cmdargc); + err = process_media_commands_3(&id, fn, &wp, xargv, cmdargc); if (!err) { if (fn[strlen(fn) - 1] == '\'' || fn[strlen(fn) - 1] == '"') @@ -1201,9 +1193,7 @@ unix_executeLine(char *line) rdisk_mount(id, fn, wp); } } - free(line); free(linecpy); - line = NULL; } } @@ -1230,6 +1220,9 @@ monitor_thread(UNUSED(void *param)) } #endif unix_executeLine(line); + + free(line); + line = NULL; } } #endif @@ -1286,13 +1279,15 @@ main(int argc, char **argv) plat_pause(0); /* Initialize the rendering window, or fullscreen. */ - do_start(); + #ifndef USE_CLI thread_create(monitor_thread, NULL); #endif + SDL_AddTimer(1000, timer_onesec, NULL); - while (!is_quit) { + while (!is_quit) + { static int mouse_inside = 0; static int r_alt_pressed = 0; static int flag_osd_open = 0; @@ -1314,6 +1309,7 @@ main(int argc, char **argv) { extern void sdl_reinit_texture(void); + printf("reinit tex\n"); sdl_reinit_texture(); break; } diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index 910c84849..34fe5f09f 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -29,20 +29,23 @@ static int BOX_W = 240; static int BOX_H = 160; #define LINE_HEIGHT 16 #define TITLE_HEIGHT 16 -#define SCROLLBAR_WIDTH 6 #define CHAR_W 8 #define CHAR_H 8 // interface to SDL environment extern SDL_Window *sdl_win; extern SDL_Renderer *sdl_render; +extern SDL_mutex *sdl_mutex; // interface back to main unix monitor implementation extern void unix_executeLine(char *line); +static SDL_Texture *font_texture = NULL; + typedef enum { STATE_MENU, - STATE_FILESELECT + STATE_FILESELECT_FLOPPY, + STATE_FILESELECT_CD } AppState; static const char *menu_items[] = { @@ -67,7 +70,6 @@ static const char *menu_items[] = { static char selected_file[256] = ""; // memoria della selezione -static SDL_Texture *font_texture = NULL; static int font_cols = 16; // numero colonne nella bitmap font (16x16 caratteri) static int font_rows = 16; @@ -81,32 +83,38 @@ static int file_count = 0; static int max_visible = 0; -// ------------------- Funzione: trova i file .iso ------------------- -int load_iso_files(char files[][256], int max_files) { +int load_iso_files(char files[][256], int max_files, char *mask) +{ DIR *d; struct dirent *dir; int count = 0; d = opendir("."); - if (!d) return 0; + if (!d) + return 0; while ((dir = readdir(d)) != NULL && count < max_files) { - if (strstr(dir->d_name, ".iso")) { + if (strstr(dir->d_name, mask)) { strncpy(files[count], dir->d_name, 255); files[count][255] = '\0'; count++; } } + closedir(d); + return count; } -// ------------------- Disegna testo da bitmap font ------------------- -void draw_text(SDL_Renderer *renderer, const char *text, int x, int y, SDL_Color color) { - if (!font_texture) return; +void draw_text(SDL_Renderer *renderer, const char *text, int x, int y, SDL_Color color) +{ + if (!font_texture) + return; + SDL_SetTextureColorMod(font_texture, color.r, color.g, color.b); int i = 0; - while (text[i]) { + while (text[i]) + { unsigned char c = text[i]; int tx = (c % font_cols) * CHAR_W; int ty = (c / font_cols) * CHAR_H; @@ -117,8 +125,8 @@ void draw_text(SDL_Renderer *renderer, const char *text, int x, int y, SDL_Color } } -// ------------------- Disegna cornice rossa + riquadro ------------------- -void draw_box_with_border(SDL_Renderer *renderer, SDL_Rect box) { +void draw_box_with_border(SDL_Renderer *renderer, SDL_Rect box) +{ SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); SDL_RenderDrawRect(renderer, &box); @@ -130,10 +138,11 @@ void draw_box_with_border(SDL_Renderer *renderer, SDL_Rect box) { SDL_RenderFillRect(renderer, &inner); } -// ------------------- Disegna menu principale ------------------- -void draw_menu(SDL_Renderer *renderer, int selected) { - SDL_SetRenderDrawColor(renderer, 0, 0, 128, 255); - SDL_RenderClear(renderer); + +void draw_menu(SDL_Renderer *renderer, int selected) +{ + // SDL_SetRenderDrawColor(renderer, 0, 0, 128, 255); + // SDL_RenderClear(renderer); int x0 = (SCREEN_W - BOX_W) / 2; int y0 = (SCREEN_H - BOX_H) / 2; @@ -142,7 +151,8 @@ void draw_menu(SDL_Renderer *renderer, int selected) { draw_text(renderer, "MAIN MENU", x0 + 20, y0 + 5, (SDL_Color){255,255,255,255}); - for (int i = 0; i < MENU_ITEMS; i++) { + for (int i = 0; i < MENU_ITEMS; i++) + { int tx = x0 + 20; int ty = y0 + TITLE_HEIGHT + i * LINE_HEIGHT; @@ -160,31 +170,27 @@ void draw_menu(SDL_Renderer *renderer, int selected) { draw_text(renderer, menu_items[i], tx, ty, textColor); } - if (selected_file[0] != '\0') { - char buffer[300]; - snprintf(buffer, sizeof(buffer), "File: %s", selected_file); - draw_text(renderer, buffer, 20, SCREEN_H - 20, (SDL_Color){255,255,255,255}); - } - SDL_RenderPresent(renderer); } // ------------------- Disegna selezione file ------------------- void draw_file_selector(SDL_Renderer *renderer, + char *title, char files[][256], int file_count, - int selected, int scroll_offset, int max_visible) { - SDL_SetRenderDrawColor(renderer, 0, 0, 128, 255); - SDL_RenderClear(renderer); + int selected, int scroll_offset, int max_visible) +{ + // SDL_SetRenderDrawColor(renderer, 0, 0, 128, 255); + // SDL_RenderClear(renderer); int x0 = (SCREEN_W - BOX_W) / 2; int y0 = (SCREEN_H - BOX_H) / 2; SDL_Rect box = {x0, y0, BOX_W, BOX_H}; draw_box_with_border(renderer, box); - draw_text(renderer, "SELEZIONE FILE", x0 + 20, y0 + 5, (SDL_Color){255,255,255,255}); + draw_text(renderer, title, x0 + 20, y0 + 5, (SDL_Color){255,255,255,255}); if (file_count == 0) { - draw_text(renderer, "Nessun file trovato", + draw_text(renderer, "No files.", x0 + 20, y0 + TITLE_HEIGHT + 10, (SDL_Color){255, 255, 0, 255}); } else { @@ -211,6 +217,47 @@ void draw_file_selector(SDL_Renderer *renderer, SDL_RenderPresent(renderer); } +void osd_init() +{ + fprintf(stderr, "OSD INIT\n"); + + if (font_texture == NULL) + { + fprintf(stderr, "OSD INIT FONT\n"); + + // Carica font bitmap (font.bmp 128x128, 16x16 caratteri, 8x8 ciascuno) + SDL_RWops *rwop = SDL_RWFromConstMem(_________font_bmp, _________font_bmp_len); + if (!rwop) + { + fprintf(stderr, "Cannot create a new SDL RW stream: %s\n", SDL_GetError()); + return; + } + + // auto-closes the stream + SDL_Surface *font_surface = SDL_LoadBMP_RW(rwop, 1); + if (!font_surface) { + fprintf(stderr, "Cannot create a surface using RW stream: %s\n", SDL_GetError()); + return; + } + + // Imposta trasparenza sul nero puro + SDL_SetColorKey(font_surface, SDL_TRUE, SDL_MapRGB(font_surface->format, 0, 0, 0)); + font_texture = SDL_CreateTextureFromSurface(sdl_render, font_surface); + SDL_FreeSurface(font_surface); + } +} + +void osd_deinit() +{ + // nothing to do + fprintf(stderr, "OSD DEINIT\n"); + + // will be implicitly freed on exit + // SDL_DestroyTexture(font_texture); + + font_texture = NULL; +} + int osd_open(SDL_Event event) { // ok opened @@ -222,26 +269,6 @@ int osd_open(SDL_Event event) max_visible = (BOX_H - TITLE_HEIGHT) / LINE_HEIGHT; - // Carica font bitmap (font.bmp 128x128, 16x16 caratteri, 8x8 ciascuno) - SDL_RWops *rwop = SDL_RWFromConstMem(_________font_bmp, _________font_bmp_len); - if (!rwop) - { - fprintf(stderr, "Cannot create a new SDL RW stream: %s\n", SDL_GetError()); - return 0; - } - - // auto-closes the stream - SDL_Surface *font_surface = SDL_LoadBMP_RW(rwop, 1); - if (!font_surface) { - fprintf(stderr, "Cannot create a surface using RW stream: %s\n", SDL_GetError()); - return 0; - } - - // Imposta trasparenza sul nero puro - SDL_SetColorKey(font_surface, SDL_TRUE, SDL_MapRGB(font_surface->format, 0, 0, 0)); - font_texture = SDL_CreateTextureFromSurface(sdl_render, font_surface); - SDL_FreeSurface(font_surface); - return 1; } @@ -250,21 +277,35 @@ int osd_close(SDL_Event event) // ok closed fprintf(stderr, "OSD CLOSE\n"); - SDL_DestroyTexture(font_texture); - return 1; } +static void osd_cmd_run(char *c) +{ + char *l = calloc(strlen(c)+2, 1); + strcpy(l, c); + unix_executeLine(l); + free(l); +} + int osd_handle(SDL_Event event) { fprintf(stderr, "OSD HANDLE\n"); + SDL_LockMutex(sdl_mutex); + if (state == STATE_MENU) { draw_menu(sdl_render, selected); - } else if (state == STATE_FILESELECT) { - draw_file_selector(sdl_render, files, file_count, file_selected, scroll_offset, max_visible); } + else if (state == STATE_FILESELECT_FLOPPY) { + draw_file_selector(sdl_render, "SELECT FLOPPY IMAGE", files, file_count, file_selected, scroll_offset, max_visible); + } + else if (state == STATE_FILESELECT_CD) { + draw_file_selector(sdl_render, "SELECT CD ISO IMAGE", files, file_count, file_selected, scroll_offset, max_visible); + } + + SDL_UnlockMutex(sdl_mutex); if (event.type == SDL_KEYUP) { @@ -287,75 +328,68 @@ int osd_handle(SDL_Event event) break; case SDLK_RETURN: case SDLK_KP_ENTER: - if (selected == MENU_ITEMS - 1) { - return 0; // Esci - } - else if (strcmp(menu_items[selected], "Carica partita") == 0) + switch (selected) { - file_count = load_iso_files(files, 100); - file_selected = 0; - scroll_offset = 0; - state = STATE_FILESELECT; - } - else - { - switch (selected) - { - case 0 : // "fddload - Load floppy disk image", - break; - case 1 : // "cdload - Load CD-ROM image", - break; - case 2 : // "rdiskload - Load removable disk image", - break; - case 3 : // "cartload - Load cartridge image", - break; - case 4 : // "moload - Load MO image", - break; - case 5 : // "fddeject - eject disk from floppy drive", - break; - case 6 : // "cdeject - eject disc from CD-ROM drive", - break; - case 7 : // "rdiskeject - eject removable disk", - break; - case 8 : // "carteject - eject cartridge", - break; - case 9 : // "moeject - eject image from MO drive", - break; - case 10 : // "hardreset - hard reset the emulated system", - unix_executeLine(strdup("hardreset")); - // directly close the OSD - return 0; - break; - case 11 : // "pause - pause the the emulated system", - unix_executeLine(strdup("pause")); - // directly close the OSD - return 0; - break; - case 12 : // "fullscreen - toggle fullscreen", - unix_executeLine(strdup("fullscreen")); - // directly close the OSD - return 0; - break; - case 13 : // "version - print version and license information", - unix_executeLine(strdup("version")); - // directly close the OSD - return 0; - break; - case 14 : // "exit - exit 86Box", - unix_executeLine(strdup("exit")); - // directly close the OSD - return 0; - break; - case 15 : // "close OSD" - // directly close the OSD - return 0; - } + case 0 : // "fddload - Load floppy disk image", + file_count = load_iso_files(files, 100, "*.img"); + file_selected = 0; + scroll_offset = 0; + state = STATE_FILESELECT_FLOPPY; + break; + case 1 : // "cdload - Load CD-ROM image", + file_count = load_iso_files(files, 100, "*.iso"); + file_selected = 0; + scroll_offset = 0; + state = STATE_FILESELECT_CD; + break; + case 2 : // "rdiskload - Load removable disk image", + break; + case 3 : // "cartload - Load cartridge image", + break; + case 4 : // "moload - Load MO image", + break; + case 5 : // "fddeject - eject disk from floppy drive", + osd_cmd_run("fddeject 0"); + break; + case 6 : // "cdeject - eject disc from CD-ROM drive", + osd_cmd_run("cdeject 0"); + break; + case 7 : // "rdiskeject - eject removable disk", + osd_cmd_run("rdiskeject 0"); + break; + case 8 : // "carteject - eject cartridge", + osd_cmd_run("carteject 0"); + break; + case 9 : // "moeject - eject image from MO drive", + osd_cmd_run("moeject 0"); + break; + case 10 : // "hardreset - hard reset the emulated system", + osd_cmd_run("hardreset"); + return 0; - printf("Hai scelto: %s\n", menu_items[selected]); + case 11 : // "pause - pause the the emulated system", + osd_cmd_run("pause"); + return 0; + + case 12 : // "fullscreen - toggle fullscreen", + osd_cmd_run("fullscreen"); + return 0; + + case 13 : // "version - print version and license information", + osd_cmd_run("version"); + return 0; + + case 14 : // "exit - exit 86Box", + osd_cmd_run("exit"); + return 0; + + case 15 : // "close OSD" + // return zero does directly close the OSD + return 0; } break; } - } else if (state == STATE_FILESELECT) { + } else if (state == STATE_FILESELECT_FLOPPY || state == STATE_FILESELECT_CD) { if (file_count == 0) { if (event.key.keysym.sym == SDLK_ESCAPE) { state = STATE_MENU; @@ -380,9 +414,14 @@ int osd_handle(SDL_Event event) break; case SDLK_RETURN: case SDLK_KP_ENTER: - strncpy(selected_file, files[file_selected], 255); - selected_file[255] = '\0'; - printf("Selezionato file: %s\n", selected_file); + char cmd[1024] = ""; + + if (state == STATE_FILESELECT_FLOPPY) + sprintf(cmd, "fddload 0 %s 0", files[file_selected]); + if (state == STATE_FILESELECT_CD) + sprintf(cmd, "cdload 0 %s", files[file_selected]); + + unix_executeLine(cmd); state = STATE_MENU; break; case SDLK_ESCAPE: diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index 651822335..0568b99ae 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -16,6 +16,7 @@ #include <86box/video.h> #include <86box/ui.h> #include <86box/version.h> +#include <86box/unix_osd.h> #include <86box/unix_sdl.h> #define RENDERER_FULL_SCREEN 1 @@ -45,7 +46,7 @@ static int cur_wy = 0; static int cur_ww = 0; static int cur_wh = 0; static volatile int sdl_enabled = 1; -static SDL_mutex *sdl_mutex = NULL; +SDL_mutex *sdl_mutex = NULL; int mouse_capture; int title_set = 0; int resize_pending = 0; @@ -314,6 +315,7 @@ sdl_select_best_hw_driver(void) void sdl_reinit_texture(void) { + osd_deinit(); sdl_destroy_texture(); if (sdl_flags & RENDERER_HARDWARE) { @@ -324,6 +326,7 @@ sdl_reinit_texture(void) sdl_tex = SDL_CreateTexture(sdl_render, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 2048, 2048); + osd_init(); } void From d7f12ae36e8dfe69271634b8c61a76a5f9e03653 Mon Sep 17 00:00:00 2001 From: Valerio Date: Sat, 13 Sep 2025 12:41:45 +0200 Subject: [PATCH 006/113] fix img and iso masks --- src/unix/unix_osd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index 34fe5f09f..e64d890b5 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -331,13 +331,13 @@ int osd_handle(SDL_Event event) switch (selected) { case 0 : // "fddload - Load floppy disk image", - file_count = load_iso_files(files, 100, "*.img"); + file_count = load_iso_files(files, 100, ".img"); file_selected = 0; scroll_offset = 0; state = STATE_FILESELECT_FLOPPY; break; case 1 : // "cdload - Load CD-ROM image", - file_count = load_iso_files(files, 100, "*.iso"); + file_count = load_iso_files(files, 100, ".iso"); file_selected = 0; scroll_offset = 0; state = STATE_FILESELECT_CD; From f4a0537a8c34d66802df4dd27b9fc078a703ba9f Mon Sep 17 00:00:00 2001 From: Valerio Date: Sat, 13 Sep 2025 12:48:54 +0200 Subject: [PATCH 007/113] close osd when doing actions --- src/unix/unix_osd.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index e64d890b5..c7c5af02b 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -350,19 +350,24 @@ int osd_handle(SDL_Event event) break; case 5 : // "fddeject - eject disk from floppy drive", osd_cmd_run("fddeject 0"); - break; + return 0; + case 6 : // "cdeject - eject disc from CD-ROM drive", osd_cmd_run("cdeject 0"); - break; + return 0; + case 7 : // "rdiskeject - eject removable disk", osd_cmd_run("rdiskeject 0"); - break; + return 0; + case 8 : // "carteject - eject cartridge", osd_cmd_run("carteject 0"); - break; + return 0; + case 9 : // "moeject - eject image from MO drive", osd_cmd_run("moeject 0"); - break; + return 0; + case 10 : // "hardreset - hard reset the emulated system", osd_cmd_run("hardreset"); return 0; @@ -423,7 +428,8 @@ int osd_handle(SDL_Event event) unix_executeLine(cmd); state = STATE_MENU; - break; + return 0; + case SDLK_ESCAPE: state = STATE_MENU; break; From 52b20c21186343949a25fa6d30f69538b7faea86 Mon Sep 17 00:00:00 2001 From: Valerio Date: Sat, 13 Sep 2025 18:50:38 +0200 Subject: [PATCH 008/113] cdrom load, future icons --- src/include/86box/unix_osd.h | 4 ++++ src/unix/unix.c | 6 +++--- src/unix/unix_cdrom.c | 9 ++++++++- src/unix/unix_osd.c | 14 ++++++++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/include/86box/unix_osd.h b/src/include/86box/unix_osd.h index 90c319fbe..b774cbea1 100644 --- a/src/include/86box/unix_osd.h +++ b/src/include/86box/unix_osd.h @@ -10,5 +10,9 @@ extern int osd_open(SDL_Event event); extern int osd_close(SDL_Event event); extern int osd_handle(SDL_Event event); +extern void osd_ui_sb_update_icon_state(int tag, int state); +extern void osd_ui_sb_update_icon(int tag, int active); +extern void osd_ui_sb_update_icon_write(int tag, int active); + #endif /*_UNIX_OSD_H*/ diff --git a/src/unix/unix.c b/src/unix/unix.c index 0eefea211..0d4f0189f 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -476,19 +476,19 @@ plat_remove(char *path) void ui_sb_update_icon_state(UNUSED(int tag), UNUSED(int state)) { - /* No-op. */ + osd_ui_sb_update_icon_state(tag, state); } void ui_sb_update_icon(UNUSED(int tag), UNUSED(int active)) { - /* No-op. */ + osd_ui_sb_update_icon(tag, active); } void ui_sb_update_icon_write(UNUSED(int tag), UNUSED(int active)) { - /* No-op. */ + osd_ui_sb_update_icon_write(tag, active); } void diff --git a/src/unix/unix_cdrom.c b/src/unix/unix_cdrom.c index 09aaa5092..76c5f1501 100644 --- a/src/unix/unix_cdrom.c +++ b/src/unix/unix_cdrom.c @@ -140,6 +140,9 @@ plat_cdrom_ui_update(uint8_t id, UNUSED(uint8_t reload)) void cdrom_mount(uint8_t id, char *fn) { + int ret = cdrom_load( &(cdrom[id]), fn, 0); + + /* strcpy(cdrom[id].prev_image_path, cdrom[id].image_path); if (cdrom[id].ops && cdrom[id].ops->close) cdrom[id].ops->close(cdrom[id].local); @@ -148,13 +151,17 @@ cdrom_mount(uint8_t id, char *fn) if ((fn != NULL) && (strlen(fn) >= 1) && (fn[strlen(fn) - 1] == '\\')) fn[strlen(fn) - 1] = '/'; image_open(&(cdrom[id]), fn); - /* Signal media change to the emulated machine. */ + // Signal media change to the emulated machine. if (cdrom[id].insert) cdrom[id].insert(cdrom[id].priv); + if (cdrom[id].image_path[0] == 0x00) ui_sb_update_icon_state(SB_CDROM | id, 0); else ui_sb_update_icon_state(SB_CDROM | id, 1); + */ + + ui_sb_update_icon_state(SB_CDROM | id, ret == 0 ? 1 : 0); #if 0 media_menu_update_cdrom(id); #endif diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index c7c5af02b..42517c866 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -441,3 +441,17 @@ int osd_handle(SDL_Event event) // Keep it open return 1; } + +void osd_ui_sb_update_icon_state(UNUSED(int tag), UNUSED(int state)) +{ +} + +void +osd_ui_sb_update_icon(UNUSED(int tag), UNUSED(int active)) +{ +} + +void +osd_ui_sb_update_icon_write(UNUSED(int tag), UNUSED(int active)) +{ +} From 28b5f6324dc08216590935dca3cd6d33e6f1c3ab Mon Sep 17 00:00:00 2001 From: Valerio Date: Sun, 14 Sep 2025 11:17:56 +0200 Subject: [PATCH 009/113] additional folders for iso and img, better ALTGR-G handling, moved osd draw to main blit loop --- src/include/86box/unix_osd.h | 9 ++- src/unix/unix.c | 54 ++++++++----- src/unix/unix_cdrom.c | 87 ++++++--------------- src/unix/unix_osd.c | 142 +++++++++++++++++++++++++---------- src/unix/unix_sdl.c | 4 + 5 files changed, 172 insertions(+), 124 deletions(-) diff --git a/src/include/86box/unix_osd.h b/src/include/86box/unix_osd.h index b774cbea1..c6582b322 100644 --- a/src/include/86box/unix_osd.h +++ b/src/include/86box/unix_osd.h @@ -3,16 +3,23 @@ #include +// state management extern void osd_init(); extern void osd_deinit(); - extern int osd_open(SDL_Event event); extern int osd_close(SDL_Event event); + +// keyboard event handler extern int osd_handle(SDL_Event event); +// draw the osd interface, if it's open +extern void osd_present(); + +// future ui extern void osd_ui_sb_update_icon_state(int tag, int state); extern void osd_ui_sb_update_icon(int tag, int active); extern void osd_ui_sb_update_icon_write(int tag, int active); +extern void osd_ui_sb_update_icon_wp(int tag, int state); #endif /*_UNIX_OSD_H*/ diff --git a/src/unix/unix.c b/src/unix/unix.c index 0d4f0189f..629528394 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -473,24 +473,26 @@ plat_remove(char *path) remove(path); } -void -ui_sb_update_icon_state(UNUSED(int tag), UNUSED(int state)) +void ui_sb_update_icon_state(int tag, int state) { osd_ui_sb_update_icon_state(tag, state); } -void -ui_sb_update_icon(UNUSED(int tag), UNUSED(int active)) +void ui_sb_update_icon(int tag, int active) { osd_ui_sb_update_icon(tag, active); } -void -ui_sb_update_icon_write(UNUSED(int tag), UNUSED(int active)) +void ui_sb_update_icon_write(int tag, int active) { osd_ui_sb_update_icon_write(tag, active); } +void ui_sb_update_icon_wp(int tag, int state) +{ + osd_ui_sb_update_icon_wp(tag, state); +} + void plat_delay_ms(uint32_t count) { @@ -534,7 +536,6 @@ path_get_dirname(char *dest, const char *path) *dest++ = *path++; *dest = '\0'; } -volatile int cpu_thread_run = 1; void ui_sb_set_text_w(UNUSED(wchar_t *wstr)) @@ -554,6 +555,8 @@ strnicmp(const char *s1, const char *s2, size_t n) return strncasecmp(s1, s2, n); } +volatile int cpu_thread_run = 1; + void main_thread(UNUSED(void *param)) { @@ -567,15 +570,20 @@ main_thread(UNUSED(void *param)) // title_update = 1; old_time = SDL_GetTicks(); drawits = frames = 0; - while (!is_quit && cpu_thread_run) { + while (!is_quit && cpu_thread_run) + { /* See if it is time to run a frame of code. */ new_time = SDL_GetTicks(); + #ifdef USE_GDBSTUB if (gdbstub_next_asap && (drawits <= 0)) drawits = 10; else -#endif drawits += (new_time - old_time); +#else + drawits += (new_time - old_time); +#endif + old_time = new_time; if (drawits > 0 && !dopause) { /* Yes, so do one frame now. */ @@ -592,15 +600,18 @@ main_thread(UNUSED(void *param)) nvr_dosave = 0; frames = 0; } - } else /* Just so we dont overload the host OS. */ + } + else /* Just so we dont overload the host OS. */ SDL_Delay(1); /* If needed, handle a screen resize. */ if (atomic_load(&doresize_monitors[0]) && !video_fullscreen && !is_quit) { + if (vid_resize & 2) plat_resize(fixed_size_x, fixed_size_y, 0); else plat_resize(scrnsz_x, scrnsz_y, 0); + atomic_store(&doresize_monitors[0], 1); } } @@ -753,7 +764,6 @@ ui_sb_set_ready(UNUSED(int ready)) /* No-op. */ } - // From musl. char * local_strsep(char **str, const char *sep) @@ -961,11 +971,6 @@ void (*f_rl_callback_handler_remove)(void) = NULL; # define LIBEDIT_LIBRARY "libedit.so" #endif -void ui_sb_update_icon_wp(int tag, int state) -{ - /* No-op */ -} - uint32_t timer_onesec(uint32_t interval, UNUSED(void *param)) { @@ -1206,9 +1211,11 @@ monitor_thread(UNUSED(void *param)) size_t n; printf("86Box monitor console.\n"); - while (!exit_event) { + while (!exit_event) + { if (feof(stdin)) break; + #ifdef ENABLE_READLINE if (f_readline) line = f_readline("(86Box) "); @@ -1219,6 +1226,7 @@ monitor_thread(UNUSED(void *param)) #ifdef ENABLE_READLINE } #endif + unix_executeLine(line); free(line); @@ -1437,10 +1445,17 @@ main(int argc, char **argv) { // open OSD! flag_osd_open = osd_open(event); - // we can assume alt-gr has been released + + // we can assume alt-gr has been released, tell this also to the virtual machine r_alt_pressed = 0; + keyboard_input(0, sdl_to_xt[SDL_SCANCODE_RALT]); break; } + else + { + // invalidate r_alt_pressed is something happens between its keydown and keydown for G + r_alt_pressed = 0; + } switch (event.key.keysym.scancode) { default: @@ -1465,8 +1480,7 @@ main(int argc, char **argv) } } - // blit only if the OSD is closed - if (blitreq && !flag_osd_open) { + if (blitreq) { extern void sdl_blit(int x, int y, int w, int h); sdl_blit(params.x, params.y, params.w, params.h); } diff --git a/src/unix/unix_cdrom.c b/src/unix/unix_cdrom.c index 76c5f1501..131fe6139 100644 --- a/src/unix/unix_cdrom.c +++ b/src/unix/unix_cdrom.c @@ -46,13 +46,14 @@ cassette_mount(char *fn, uint8_t wp) memset(cassette_fname, 0, sizeof(cassette_fname)); cassette_ui_writeprot = wp; pc_cas_set_fname(cassette, fn); + if (fn != NULL) memcpy(cassette_fname, fn, MIN(511, strlen(fn))); + ui_sb_update_icon_state(SB_CASSETTE, (fn == NULL) ? 1 : 0); -#if 0 - media_menu_update_cassette(); -#endif + ui_sb_update_tip(SB_CASSETTE); + config_save(); } @@ -61,11 +62,11 @@ cassette_eject(void) { pc_cas_set_fname(cassette, NULL); memset(cassette_fname, 0x00, sizeof(cassette_fname)); + ui_sb_update_icon_state(SB_CASSETTE, 1); -#if 0 - media_menu_update_cassette(); -#endif + ui_sb_update_tip(SB_CASSETTE); + config_save(); } @@ -74,11 +75,11 @@ cartridge_mount(uint8_t id, char *fn, UNUSED(uint8_t wp)) { cart_close(id); cart_load(id, fn); + ui_sb_update_icon_state(SB_CARTRIDGE | id, strlen(cart_fns[id]) ? 0 : 1); -#if 0 - media_menu_update_cartridge(id); -#endif + ui_sb_update_tip(SB_CARTRIDGE | id); + config_save(); } @@ -86,11 +87,11 @@ void cartridge_eject(uint8_t id) { cart_close(id); + ui_sb_update_icon_state(SB_CARTRIDGE | id, 1); -#if 0 - media_menu_update_cartridge(id); -#endif + ui_sb_update_tip(SB_CARTRIDGE | id); + config_save(); } @@ -100,11 +101,11 @@ floppy_mount(uint8_t id, char *fn, uint8_t wp) fdd_close(id); ui_writeprot[id] = wp; fdd_load(id, fn); + ui_sb_update_icon_state(SB_FLOPPY | id, strlen(floppyfns[id]) ? 0 : 1); -#if 0 - media_menu_update_floppy(id); -#endif + ui_sb_update_tip(SB_FLOPPY | id); + config_save(); } @@ -112,11 +113,11 @@ void floppy_eject(uint8_t id) { fdd_close(id); + ui_sb_update_icon_state(SB_FLOPPY | id, 1); -#if 0 - media_menu_update_floppy(id); -#endif + ui_sb_update_tip(SB_FLOPPY | id); + config_save(); } @@ -131,9 +132,6 @@ plat_cdrom_ui_update(uint8_t id, UNUSED(uint8_t reload)) ui_sb_update_icon_state(SB_CDROM | id, 0); } -#if 0 - media_menu_update_cdrom(id); -#endif ui_sb_update_tip(SB_CDROM | id); } @@ -142,30 +140,8 @@ cdrom_mount(uint8_t id, char *fn) { int ret = cdrom_load( &(cdrom[id]), fn, 0); - /* - strcpy(cdrom[id].prev_image_path, cdrom[id].image_path); - if (cdrom[id].ops && cdrom[id].ops->close) - cdrom[id].ops->close(cdrom[id].local); - cdrom[id].ops = NULL; - memset(cdrom[id].image_path, 0, sizeof(cdrom[id].image_path)); - if ((fn != NULL) && (strlen(fn) >= 1) && (fn[strlen(fn) - 1] == '\\')) - fn[strlen(fn) - 1] = '/'; - image_open(&(cdrom[id]), fn); - // Signal media change to the emulated machine. - if (cdrom[id].insert) - cdrom[id].insert(cdrom[id].priv); + plat_cdrom_ui_update(id, 0); - if (cdrom[id].image_path[0] == 0x00) - ui_sb_update_icon_state(SB_CDROM | id, 0); - else - ui_sb_update_icon_state(SB_CDROM | id, 1); - */ - - ui_sb_update_icon_state(SB_CDROM | id, ret == 0 ? 1 : 0); -#if 0 - media_menu_update_cdrom(id); -#endif - ui_sb_update_tip(SB_CDROM | id); config_save(); } @@ -181,9 +157,7 @@ mo_eject(uint8_t id) } ui_sb_update_icon_state(SB_MO | id, 1); -#if 0 - media_menu_update_mo(id); -#endif + ui_sb_update_tip(SB_MO | id); config_save(); } @@ -198,9 +172,7 @@ mo_mount(uint8_t id, char *fn, uint8_t wp) mo_load(dev, fn, 0); ui_sb_update_icon_state(SB_MO | id, strlen(mo_drives[id].image_path) ? 0 : 1); -#if 0 - media_menu_update_mo(id); -#endif + ui_sb_update_tip(SB_MO | id); config_save(); @@ -218,9 +190,6 @@ mo_reload(uint8_t id) ui_sb_update_icon_state(SB_MO | id, 0); } -#if 0 - media_menu_update_mo(id); -#endif ui_sb_update_tip(SB_MO | id); config_save(); @@ -238,10 +207,9 @@ rdisk_eject(uint8_t id) } ui_sb_update_icon_state(SB_RDISK | id, 1); -#if 0 - media_menu_update_rdisk(id); -#endif + ui_sb_update_tip(SB_RDISK | id); + config_save(); } @@ -255,9 +223,7 @@ rdisk_mount(uint8_t id, char *fn, uint8_t wp) rdisk_load(dev, fn, 0); ui_sb_update_icon_state(SB_RDISK | id, strlen(rdisk_drives[id].image_path) ? 0 : 1); -#if 0 - media_menu_update_rdisk(id); -#endif + ui_sb_update_tip(SB_RDISK | id); config_save(); @@ -275,9 +241,6 @@ rdisk_reload(uint8_t id) ui_sb_update_icon_state(SB_RDISK | id, 0); } -#if 0 - media_menu_update_rdisk(id); -#endif ui_sb_update_tip(SB_RDISK | id); config_save(); diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index 42517c866..11b255656 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -32,6 +32,9 @@ static int BOX_H = 160; #define CHAR_W 8 #define CHAR_H 8 +// this makes the osd embeddable in the 86box main sdl loop +#define OSD_INSIDE_MAIN_LOOP + // interface to SDL environment extern SDL_Window *sdl_win; extern SDL_Renderer *sdl_render; @@ -70,32 +73,53 @@ static const char *menu_items[] = { static char selected_file[256] = ""; // memoria della selezione -static int font_cols = 16; // numero colonne nella bitmap font (16x16 caratteri) +// chars per cols and rows +static int font_cols = 16; static int font_rows = 16; static int selected = 0; static int file_selected = 0; static int scroll_offset = 0; + +static int osd_is_open = 0; static AppState state = STATE_MENU; -static char files[100][256]; +static char files[100][1024]; static int file_count = 0; static int max_visible = 0; -int load_iso_files(char files[][256], int max_files, char *mask) +int reset_iso_files() +{ + file_selected = 0; + scroll_offset = 0; + + file_count = 0; + memzero(files, sizeof(files)); +} + +static int endswith(char *s1, char *mask) +{ + return strlen(s1) >= strlen(mask) && strncasecmp(s1+strlen(s1)-strlen(mask), mask, strlen(mask)); +} + +int load_iso_files(char *basedir, char files[][1024], int max_files, char *mask) { DIR *d; struct dirent *dir; - int count = 0; - d = opendir("."); + int count = file_count; + d = opendir(basedir); if (!d) - return 0; + return file_count; + + while ((dir = readdir(d)) != NULL && count < max_files) + { + if (endswith(dir->d_name, mask)) + { + strcpy(files[count], basedir); + strcat(files[count], "/"); + strcat(files[count], dir->d_name); - while ((dir = readdir(d)) != NULL && count < max_files) { - if (strstr(dir->d_name, mask)) { - strncpy(files[count], dir->d_name, 255); - files[count][255] = '\0'; count++; } } @@ -141,9 +165,6 @@ void draw_box_with_border(SDL_Renderer *renderer, SDL_Rect box) void draw_menu(SDL_Renderer *renderer, int selected) { - // SDL_SetRenderDrawColor(renderer, 0, 0, 128, 255); - // SDL_RenderClear(renderer); - int x0 = (SCREEN_W - BOX_W) / 2; int y0 = (SCREEN_H - BOX_H) / 2; SDL_Rect box = {x0, y0, BOX_W, BOX_H}; @@ -170,7 +191,9 @@ void draw_menu(SDL_Renderer *renderer, int selected) draw_text(renderer, menu_items[i], tx, ty, textColor); } +#ifndef OSD_INSIDE_MAIN_LOOP SDL_RenderPresent(renderer); +#endif } // ------------------- Disegna selezione file ------------------- @@ -179,9 +202,6 @@ void draw_file_selector(SDL_Renderer *renderer, char files[][256], int file_count, int selected, int scroll_offset, int max_visible) { - // SDL_SetRenderDrawColor(renderer, 0, 0, 128, 255); - // SDL_RenderClear(renderer); - int x0 = (SCREEN_W - BOX_W) / 2; int y0 = (SCREEN_H - BOX_H) / 2; SDL_Rect box = {x0, y0, BOX_W, BOX_H}; @@ -214,16 +234,18 @@ void draw_file_selector(SDL_Renderer *renderer, } } +#ifndef OSD_INSIDE_MAIN_LOOP SDL_RenderPresent(renderer); +#endif } void osd_init() { - fprintf(stderr, "OSD INIT\n"); + // debug: fprintf(stderr, "OSD INIT\n"); if (font_texture == NULL) { - fprintf(stderr, "OSD INIT FONT\n"); + // debug: fprintf(stderr, "OSD INIT FONT\n"); // Carica font bitmap (font.bmp 128x128, 16x16 caratteri, 8x8 ciascuno) SDL_RWops *rwop = SDL_RWFromConstMem(_________font_bmp, _________font_bmp_len); @@ -250,7 +272,7 @@ void osd_init() void osd_deinit() { // nothing to do - fprintf(stderr, "OSD DEINIT\n"); + // debug: fprintf(stderr, "OSD DEINIT\n"); // will be implicitly freed on exit // SDL_DestroyTexture(font_texture); @@ -261,7 +283,7 @@ void osd_deinit() int osd_open(SDL_Event event) { // ok opened - fprintf(stderr, "OSD OPEN\n"); + // debug: fprintf(stderr, "OSD OPEN\n"); SDL_GetWindowSize(sdl_win, &SCREEN_W, &SCREEN_H); BOX_W = (SCREEN_W / 4) * 3; @@ -269,13 +291,17 @@ int osd_open(SDL_Event event) max_visible = (BOX_H - TITLE_HEIGHT) / LINE_HEIGHT; + osd_is_open = 1; + return 1; } int osd_close(SDL_Event event) { // ok closed - fprintf(stderr, "OSD CLOSE\n"); + // debug: fprintf(stderr, "OSD CLOSE\n"); + + osd_is_open = 0; return 1; } @@ -288,12 +314,15 @@ static void osd_cmd_run(char *c) free(l); } - -int osd_handle(SDL_Event event) +void osd_present() { - fprintf(stderr, "OSD HANDLE\n"); + // shortcut + if (!osd_is_open) + return; +#ifndef OSD_INSIDE_MAIN_LOOP SDL_LockMutex(sdl_mutex); +#endif if (state == STATE_MENU) { draw_menu(sdl_render, selected); @@ -305,49 +334,71 @@ int osd_handle(SDL_Event event) draw_file_selector(sdl_render, "SELECT CD ISO IMAGE", files, file_count, file_selected, scroll_offset, max_visible); } +#ifndef OSD_INSIDE_MAIN_LOOP SDL_UnlockMutex(sdl_mutex); +#endif +} + +int osd_handle(SDL_Event event) +{ + // debug: fprintf(stderr, "OSD HANDLE\n"); if (event.type == SDL_KEYUP) { if (event.key.keysym.scancode == SDL_SCANCODE_ESCAPE) { // Close the OSD - fprintf(stderr, "OSD HANDLE: escape\n"); + // debug: fprintf(stderr, "OSD HANDLE: escape\n"); return 0; } } - if (event.type == SDL_KEYDOWN) { - if (state == STATE_MENU) { - switch (event.key.keysym.sym) { + if (event.type == SDL_KEYDOWN) + { + if (state == STATE_MENU) + { + switch (event.key.keysym.sym) + { case SDLK_UP: selected = (selected - 1 + MENU_ITEMS) % MENU_ITEMS; break; + case SDLK_DOWN: selected = (selected + 1) % MENU_ITEMS; break; + case SDLK_RETURN: case SDLK_KP_ENTER: switch (selected) { case 0 : // "fddload - Load floppy disk image", - file_count = load_iso_files(files, 100, ".img"); - file_selected = 0; - scroll_offset = 0; + reset_iso_files(); + file_count = load_iso_files(".", files, 100, ".img"); + file_count = load_iso_files("/mnt", files, 100, ".img"); + file_count = load_iso_files("/mnt/usbkey", files, 100, ".img"); state = STATE_FILESELECT_FLOPPY; break; + case 1 : // "cdload - Load CD-ROM image", - file_count = load_iso_files(files, 100, ".iso"); - file_selected = 0; - scroll_offset = 0; + reset_iso_files(); + file_count = load_iso_files(".", files, 100, ".iso"); + file_count = load_iso_files("/mnt", files, 100, ".iso"); + file_count = load_iso_files("/mnt/usbkey", files, 100, ".iso"); state = STATE_FILESELECT_CD; break; + case 2 : // "rdiskload - Load removable disk image", + reset_iso_files(); break; + case 3 : // "cartload - Load cartridge image", + reset_iso_files(); break; + case 4 : // "moload - Load MO image", + reset_iso_files(); break; + case 5 : // "fddeject - eject disk from floppy drive", osd_cmd_run("fddeject 0"); return 0; @@ -394,12 +445,18 @@ int osd_handle(SDL_Event event) } break; } - } else if (state == STATE_FILESELECT_FLOPPY || state == STATE_FILESELECT_CD) { - if (file_count == 0) { + } + else if (state == STATE_FILESELECT_FLOPPY || state == STATE_FILESELECT_CD) + { + if (file_count == 0) + { + // no files, there is nothing else to do if (event.key.keysym.sym == SDLK_ESCAPE) { state = STATE_MENU; } - } else { + } + else + { switch (event.key.keysym.sym) { case SDLK_UP: if (file_selected > 0) { @@ -417,6 +474,7 @@ int osd_handle(SDL_Event event) } } break; + case SDLK_RETURN: case SDLK_KP_ENTER: char cmd[1024] = ""; @@ -446,12 +504,14 @@ void osd_ui_sb_update_icon_state(UNUSED(int tag), UNUSED(int state)) { } -void -osd_ui_sb_update_icon(UNUSED(int tag), UNUSED(int active)) +void osd_ui_sb_update_icon(UNUSED(int tag), UNUSED(int active)) { } -void -osd_ui_sb_update_icon_write(UNUSED(int tag), UNUSED(int active)) +void osd_ui_sb_update_icon_write(UNUSED(int tag), UNUSED(int active)) +{ +} + +void osd_ui_sb_update_icon_wp(UNUSED(int tag), UNUSED(int state)) { } diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index 0568b99ae..26115deff 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -190,6 +190,9 @@ sdl_real_blit(SDL_Rect *r_src) if (ret) fprintf(stderr, "SDL: unable to copy texture to renderer (%s)\n", SDL_GetError()); + // give the osd an opportunity to draw itself + osd_present(); + SDL_RenderPresent(sdl_render); } @@ -215,6 +218,7 @@ sdl_blit(int x, int y, int w, int h) sdl_resize(resize_w, resize_h); resize_pending = 0; } + r_src.x = x; r_src.y = y; r_src.w = w; From 596dab6df4e73d43d33675d2aa028a05b3baeeba Mon Sep 17 00:00:00 2001 From: Valerio Date: Sun, 14 Sep 2025 11:27:42 +0200 Subject: [PATCH 010/113] mistakes --- src/unix/unix_osd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index 11b255656..7fdabb698 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -95,7 +95,7 @@ int reset_iso_files() scroll_offset = 0; file_count = 0; - memzero(files, sizeof(files)); + memset(files, 0, sizeof(files)); } static int endswith(char *s1, char *mask) @@ -199,7 +199,7 @@ void draw_menu(SDL_Renderer *renderer, int selected) // ------------------- Disegna selezione file ------------------- void draw_file_selector(SDL_Renderer *renderer, char *title, - char files[][256], int file_count, + char files[][1024], int file_count, int selected, int scroll_offset, int max_visible) { int x0 = (SCREEN_W - BOX_W) / 2; @@ -477,7 +477,7 @@ int osd_handle(SDL_Event event) case SDLK_RETURN: case SDLK_KP_ENTER: - char cmd[1024] = ""; + char cmd[1280] = ""; if (state == STATE_FILESELECT_FLOPPY) sprintf(cmd, "fddload 0 %s 0", files[file_selected]); From 003fc5423bb216104cdb6cb07aa8b25c3484671e Mon Sep 17 00:00:00 2001 From: Valerio Date: Sun, 14 Sep 2025 11:40:53 +0200 Subject: [PATCH 011/113] more mistakes --- src/unix/unix.c | 3 +-- src/unix/unix_osd.c | 4 +++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 629528394..c02dbea63 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1440,8 +1440,7 @@ main(int argc, char **argv) else r_alt_pressed = 0; } - - if (r_alt_pressed && event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_G) + else if (r_alt_pressed && event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_G) { // open OSD! flag_osd_open = osd_open(event); diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index 7fdabb698..a5da5fe1a 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -100,7 +100,9 @@ int reset_iso_files() static int endswith(char *s1, char *mask) { - return strlen(s1) >= strlen(mask) && strncasecmp(s1+strlen(s1)-strlen(mask), mask, strlen(mask)); + int ss = strlen(s1); + int sm = strlen(mask); + return ss >= sm && strncasecmp(s1+ss-sm, mask, sm) == 0; } int load_iso_files(char *basedir, char files[][1024], int max_files, char *mask) From 677a50dda41c7f61f6269eb8418d6fe908d543b9 Mon Sep 17 00:00:00 2001 From: Valerio Date: Sun, 14 Sep 2025 11:58:14 +0200 Subject: [PATCH 012/113] maybe better on keyup --- src/unix/unix_osd.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index a5da5fe1a..527a1b6a9 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -353,10 +353,7 @@ int osd_handle(SDL_Event event) // debug: fprintf(stderr, "OSD HANDLE: escape\n"); return 0; } - } - if (event.type == SDL_KEYDOWN) - { if (state == STATE_MENU) { switch (event.key.keysym.sym) From 078368ba48aeaba2be1c4b921c586a71572d28b5 Mon Sep 17 00:00:00 2001 From: Valerio Date: Mon, 15 Sep 2025 16:34:45 +0200 Subject: [PATCH 013/113] no pause, last three media types, readme --- README-DEDICATED-PC.txt | 32 +++++++++++++++++++++++++++ src/unix/unix_osd.c | 49 +++++++++++++++++++++++++++++++++++------ 2 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 README-DEDICATED-PC.txt diff --git a/README-DEDICATED-PC.txt b/README-DEDICATED-PC.txt new file mode 100644 index 000000000..f11c776a0 --- /dev/null +++ b/README-DEDICATED-PC.txt @@ -0,0 +1,32 @@ +These are the steps to install a machine fully dedicated to 86Box and tuned to make it appear almost native. + +1) install a vanilla Debian Trixie with netinst and without any graphical environment + depending on the machine speed, this will make boot time extremely short + +2) apt update if necessary + +3) install git and almost all required packages + apt install git build-essential cmake extra-cmake-modules pkg-config ninja-build libfreetype-dev libsdl2-dev libpng-dev libopenal-dev librtmidi-dev libfluidsynth-dev libsndfile1-dev libserialport-dev libevdev-dev libxkbcommon-dev libxkbcommon-x11-dev libslirp-dev + +4) setup git and clone + git@github.com:Valefungo/86Box.git + git@github.com:86Box/roms.git + git checkout unix_ods + +5) build (128 => super speed, too much for a 2GB machine) + cd 86Box + mkdir build + cd build + cmake .. --preset regular -D QT=OFF -D PREFER_STATIC=ON + cmake --build regular -j 128 + cd ../../ + ln -s 86Box/build/regular/src/86Box 86Box.exe + +6) boot + as root so it can take complete ownership of the linux framebuffer + +7) notes: +- 86Box will complain to be unable to find readline, this is fine, we don't need the command line at all +- ALSOFT will complain it can't connect to PipeWire, no problem, sounds will come from standard ALSA + + diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index 527a1b6a9..f6037cbbd 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -48,7 +48,10 @@ static SDL_Texture *font_texture = NULL; typedef enum { STATE_MENU, STATE_FILESELECT_FLOPPY, - STATE_FILESELECT_CD + STATE_FILESELECT_CD, + STATE_FILESELECT_RDISK, + STATE_FILESELECT_CART, + STATE_FILESELECT_MO } AppState; static const char *menu_items[] = { @@ -63,7 +66,7 @@ static const char *menu_items[] = { "carteject - eject cartridge", "moeject - eject image from MO drive", "hardreset - hard reset the emulated system", - "pause - pause the the emulated system", + // "pause - pause the the emulated system", "fullscreen - toggle fullscreen", "version - print version and license information", "exit - exit 86Box", @@ -335,6 +338,16 @@ void osd_present() else if (state == STATE_FILESELECT_CD) { draw_file_selector(sdl_render, "SELECT CD ISO IMAGE", files, file_count, file_selected, scroll_offset, max_visible); } + else if (state == STATE_FILESELECT_RDISK) { + draw_file_selector(sdl_render, "SELECT REMOVABLE DISK IMAGE", files, file_count, file_selected, scroll_offset, max_visible); + } + else if (state == STATE_FILESELECT_CART) { + draw_file_selector(sdl_render, "SELECT CARTRIDGE IMAGE", files, file_count, file_selected, scroll_offset, max_visible); + } + else if (state == STATE_FILESELECT_MO) { + draw_file_selector(sdl_render, "SELECT MO IMAGE", files, file_count, file_selected, scroll_offset, max_visible); + } + #ifndef OSD_INSIDE_MAIN_LOOP SDL_UnlockMutex(sdl_mutex); @@ -388,14 +401,26 @@ int osd_handle(SDL_Event event) case 2 : // "rdiskload - Load removable disk image", reset_iso_files(); + file_count = load_iso_files(".", files, 100, ".img"); + file_count = load_iso_files("/mnt", files, 100, ".img"); + file_count = load_iso_files("/mnt/usbkey", files, 100, ".img"); + state = STATE_FILESELECT_RDISK; break; case 3 : // "cartload - Load cartridge image", reset_iso_files(); + file_count = load_iso_files(".", files, 100, ".img"); + file_count = load_iso_files("/mnt", files, 100, ".img"); + file_count = load_iso_files("/mnt/usbkey", files, 100, ".img"); + state = STATE_FILESELECT_CART; break; case 4 : // "moload - Load MO image", reset_iso_files(); + file_count = load_iso_files(".", files, 100, ".img"); + file_count = load_iso_files("/mnt", files, 100, ".img"); + file_count = load_iso_files("/mnt/usbkey", files, 100, ".img"); + state = STATE_FILESELECT_MO; break; case 5 : // "fddeject - eject disk from floppy drive", @@ -422,30 +447,32 @@ int osd_handle(SDL_Event event) osd_cmd_run("hardreset"); return 0; + /* better not pause ourself, we will be unable to get out of it case 11 : // "pause - pause the the emulated system", osd_cmd_run("pause"); return 0; + */ - case 12 : // "fullscreen - toggle fullscreen", + case 11 : // "fullscreen - toggle fullscreen", osd_cmd_run("fullscreen"); return 0; - case 13 : // "version - print version and license information", + case 12 : // "version - print version and license information", osd_cmd_run("version"); return 0; - case 14 : // "exit - exit 86Box", + case 13 : // "exit - exit 86Box", osd_cmd_run("exit"); return 0; - case 15 : // "close OSD" + case 14 : // "close OSD" // return zero does directly close the OSD return 0; } break; } } - else if (state == STATE_FILESELECT_FLOPPY || state == STATE_FILESELECT_CD) + else if (state == STATE_FILESELECT_FLOPPY || state == STATE_FILESELECT_CD || state == STATE_FILESELECT_RDISK || state == STATE_FILESELECT_CART || state == STATE_FILESELECT_MO) { if (file_count == 0) { @@ -476,15 +503,23 @@ int osd_handle(SDL_Event event) case SDLK_RETURN: case SDLK_KP_ENTER: + { char cmd[1280] = ""; if (state == STATE_FILESELECT_FLOPPY) sprintf(cmd, "fddload 0 %s 0", files[file_selected]); if (state == STATE_FILESELECT_CD) sprintf(cmd, "cdload 0 %s", files[file_selected]); + if (state == STATE_FILESELECT_RDISK) + sprintf(cmd, "rdiskload 0 %s 0", files[file_selected]); + if (state == STATE_FILESELECT_CART) + sprintf(cmd, "cartload 0 %s 0", files[file_selected]); + if (state == STATE_FILESELECT_MO) + sprintf(cmd, "moload 0 %s 0", files[file_selected]); unix_executeLine(cmd); state = STATE_MENU; + } return 0; case SDLK_ESCAPE: From 29665ee35d156cac4b4352a45c799633acfb89ff Mon Sep 17 00:00:00 2001 From: Valerio Vitali Date: Mon, 15 Sep 2025 20:18:35 +0200 Subject: [PATCH 014/113] explanation of udev --- README-DEDICATED-PC.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README-DEDICATED-PC.txt b/README-DEDICATED-PC.txt index f11c776a0..ba3dfa50c 100644 --- a/README-DEDICATED-PC.txt +++ b/README-DEDICATED-PC.txt @@ -29,4 +29,14 @@ These are the steps to install a machine fully dedicated to 86Box and tuned to m - 86Box will complain to be unable to find readline, this is fine, we don't need the command line at all - ALSOFT will complain it can't connect to PipeWire, no problem, sounds will come from standard ALSA +8) additional steps + add a new udev rule to automount any USB key to a known location so files in it can be listed in the OSD floppy/cd mount options + + create /etc/udev/rules.d/99-automount.rules + + with: + ACTION=="add", ENV{ID_BUS}=="usb", ENV{ID_TYPE}=="disk", ENV{ID_FS_TYPE}=="exfat", RUN+="/usr/bin/systemd-mount --no-block --automount=yes --collect /dev/%k '/mnt'" + + replicate this line for each filesystem you expect the usb key to be formatted, in this example "exfat" + this is going to conflict if multiple keys are inserted, don't do it From c293a2d7652eecca25bc2e974cd7e59cfd6ebf28 Mon Sep 17 00:00:00 2001 From: Valerio Date: Sun, 28 Sep 2025 11:37:36 +0200 Subject: [PATCH 015/113] touchpad events --- src/unix/unix.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/unix/unix.c b/src/unix/unix.c index 832aab7f3..4ee31f38a 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1373,6 +1373,20 @@ main(int argc, char **argv) } break; } + /* Touch events */ + /* SDL_FINGERDOWN, */ + /* SDL_FINGERUP, */ + case SDL_FINGERMOTION: + { + // See SDL_TouchFingerEvent + if (mouse_capture || video_fullscreen) { + SDL_LockMutex(mousemutex); + mouse_scale((int)(event.tfinger.dx * 10), (int)(event.tfinger.dy * 10)); + SDL_UnlockMutex(mousemutex); + } + break; + } + case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { From df8762cf6566f66d9f1d7434ce6413173648e849 Mon Sep 17 00:00:00 2001 From: Valerio Date: Sun, 28 Sep 2025 11:49:31 +0200 Subject: [PATCH 016/113] touchpad events --- src/unix/unix.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 4ee31f38a..a0820cba3 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1232,6 +1232,8 @@ monitor_thread(UNUSED(void *param)) #endif } +#define FINGER_MOTION_MULTIPLIER 100 + extern int gfxcard[GFXCARD_MAX]; int main(int argc, char **argv) @@ -1381,7 +1383,7 @@ main(int argc, char **argv) // See SDL_TouchFingerEvent if (mouse_capture || video_fullscreen) { SDL_LockMutex(mousemutex); - mouse_scale((int)(event.tfinger.dx * 10), (int)(event.tfinger.dy * 10)); + mouse_scale((int)(event.tfinger.dx * FINGER_MOTION_MULTIPLIER), (int)(event.tfinger.dy * FINGER_MOTION_MULTIPLIER)); SDL_UnlockMutex(mousemutex); } break; From ef33439e0b2305186f700bfd80954a09a64df8ab Mon Sep 17 00:00:00 2001 From: Valerio Date: Sun, 28 Sep 2025 12:05:49 +0200 Subject: [PATCH 017/113] touchpad events, try sdl emulation --- src/unix/unix.c | 2 ++ src/unix/unix_sdl.c | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/unix/unix.c b/src/unix/unix.c index a0820cba3..15d6b9b7e 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1378,6 +1378,7 @@ main(int argc, char **argv) /* Touch events */ /* SDL_FINGERDOWN, */ /* SDL_FINGERUP, */ + /* case SDL_FINGERMOTION: { // See SDL_TouchFingerEvent @@ -1388,6 +1389,7 @@ main(int argc, char **argv) } break; } + */ case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index 26115deff..806f71918 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -419,6 +419,10 @@ sdl_init_common(int flags) return (0); } + // Ensure mouse and touchpads behaves the same for us + SDL_SetHint(SDL_HINT_TOUCH_MOUSE_EVENTS, "1"); + SDL_SetHint(SDL_HINT_MOUSE_TOUCH_EVENTS, "1"); + if (flags & RENDERER_HARDWARE) { if (flags & RENDERER_OPENGL) { SDL_SetHint(SDL_HINT_RENDER_DRIVER, "OpenGL"); From a52b18f9e2d7743769fb032b90df3726498980e2 Mon Sep 17 00:00:00 2001 From: Valerio Date: Sun, 28 Sep 2025 12:11:38 +0200 Subject: [PATCH 018/113] touchpad events, try sdl emulation --- src/unix/unix.c | 4 ++-- src/unix/unix_sdl.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 15d6b9b7e..049c0ec9d 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1378,7 +1378,6 @@ main(int argc, char **argv) /* Touch events */ /* SDL_FINGERDOWN, */ /* SDL_FINGERUP, */ - /* case SDL_FINGERMOTION: { // See SDL_TouchFingerEvent @@ -1389,7 +1388,6 @@ main(int argc, char **argv) } break; } - */ case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: @@ -1424,6 +1422,8 @@ main(int argc, char **argv) case SDL_BUTTON_X2: buttonmask = 16; break; + default: + printf("Unknown mouse button %d\n", event.button.button); } SDL_LockMutex(mousemutex); if (event.button.state == SDL_PRESSED) diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index 806f71918..8d3a71002 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -419,7 +419,7 @@ sdl_init_common(int flags) return (0); } - // Ensure mouse and touchpads behaves the same for us + // Ensure mouse and touchpads behaves the same for us, dunno if these really do something SDL_SetHint(SDL_HINT_TOUCH_MOUSE_EVENTS, "1"); SDL_SetHint(SDL_HINT_MOUSE_TOUCH_EVENTS, "1"); From 340a43ad64426a0801ab16bd5ad277384b7ba048 Mon Sep 17 00:00:00 2001 From: Valerio Date: Sun, 28 Sep 2025 12:38:43 +0200 Subject: [PATCH 019/113] touchpad events, right button click --- src/unix/unix.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 049c0ec9d..e9c4c38aa 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -53,6 +53,8 @@ #define __USE_GNU 1 /* shouldn't be done, yet it is */ #include +extern SDL_Window *sdl_win; + static int first_use = 1; static uint64_t StartingTime; static uint64_t Frequency; @@ -1376,14 +1378,27 @@ main(int argc, char **argv) break; } /* Touch events */ - /* SDL_FINGERDOWN, */ - /* SDL_FINGERUP, */ + case SDL_FINGERDOWN: + { + // Trap these but ignore them for now + break; + } + case SDL_FINGERUP: + { + // Trap these but ignore them for now + break; + } case SDL_FINGERMOTION: { // See SDL_TouchFingerEvent if (mouse_capture || video_fullscreen) { SDL_LockMutex(mousemutex); - mouse_scale((int)(event.tfinger.dx * FINGER_MOTION_MULTIPLIER), (int)(event.tfinger.dy * FINGER_MOTION_MULTIPLIER)); + + // Real multiplier is the window size + int w, h; + SDL_GetWindowSize(sdl_win, &w, &h); + + mouse_scale((int)(event.tfinger.dx * w), (int)(event.tfinger.dy * h)); SDL_UnlockMutex(mousemutex); } break; @@ -1477,6 +1492,7 @@ main(int argc, char **argv) } keyboard_input(event.key.state == SDL_PRESSED, xtkey); + break; } case SDL_WINDOWEVENT: { @@ -1488,7 +1504,13 @@ main(int argc, char **argv) mouse_inside = 0; break; } + break; } + default: + { + printf("Unhandled SDL event: %d\n", event.type); + break; + } } } } From 3fb7bc1b564ed658fe045903697609db2406bfad Mon Sep 17 00:00:00 2001 From: Lili Kurek Date: Sun, 12 Oct 2025 09:56:22 +0000 Subject: [PATCH 020/113] Fix building with Qt 6.10 Fixes #6326. --- src/qt/CMakeLists.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index 1a004d958..1c61f5559 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -48,10 +48,12 @@ set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF) find_package(Threads REQUIRED) find_package(Qt${QT_MAJOR} COMPONENTS Core Widgets Network OpenGL Gui REQUIRED) find_package(Qt${QT_MAJOR}LinguistTools REQUIRED NO_CMAKE_FIND_ROOT_PATH) -if(NOT USE_QT6) - # For in src/qt/qt_mainwindow.cpp +if(USE_QT6) + set(QT_NO_PRIVATE_MODULE_WARNING ON) + find_package(Qt6 COMPONENTS GuiPrivate) +else() include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS}) -endif () +endif() # TODO: Is this the correct way to do this, and is it required on any # other platforms or with Qt 5? From 3485dd4676a5db7c7da8e82561871284137224ae Mon Sep 17 00:00:00 2001 From: kees-z Date: Tue, 14 Oct 2025 17:41:46 +0200 Subject: [PATCH 021/113] Fix typos and translation improvements (#6345) --- src/qt/languages/nl-NL.po | 132 +++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 68bcbc2bf..ee57f32a1 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -43,7 +43,7 @@ msgid "&Hide status bar" msgstr "&Statusbalk verbergen" msgid "Hide &toolbar" -msgstr "Verberg &toolbar" +msgstr "&Toolbar verbergen" msgid "&Resizeable window" msgstr "&Venster met aanpasbare grootte" @@ -109,7 +109,7 @@ msgid "Fi<er method" msgstr "Filtermethode" msgid "&Nearest" -msgstr "&Dichtsbijzijnde" +msgstr "&Dichtstbijzijnde" msgid "&Linear" msgstr "&Lineair" @@ -220,7 +220,7 @@ msgid "Begin trace" msgstr "Begin traceren" msgid "End trace" -msgstr "Traceren beëindigen" +msgstr "Beëindig traceren" msgid "&Help" msgstr "&Help" @@ -232,19 +232,19 @@ msgid "&About 86Box..." msgstr "&Over 86Box..." msgid "&New image..." -msgstr "&Nieuw image..." +msgstr "&Nieuw imagebestand..." msgid "&Existing image..." -msgstr "&Bestaande image..." +msgstr "&Bestaande imagebestand..." msgid "Existing image (&Write-protected)..." -msgstr "Bestaande image (&Schrijfbeveiligd)..." +msgstr "Bestaand imagebestand (&Schrijfbeveiligd)..." msgid "&Record" msgstr "&Opnemen" msgid "&Play" -msgstr "&Play" +msgstr "&Afspelen" msgid "&Rewind to the beginning" msgstr "&Terugspoelen naar het begin" @@ -256,19 +256,19 @@ msgid "E&ject" msgstr "&Uitwerpen" msgid "&Image..." -msgstr "&Image..." +msgstr "&Imagebestand..." msgid "E&xport to 86F..." msgstr "E&xporteer naar 86F..." msgid "&Mute" -msgstr "&Mute" +msgstr "&Dempen" msgid "E&mpty" -msgstr "E&mpty" +msgstr "&Leeg" msgid "Reload previous image" -msgstr "Herlaad vorige image" +msgstr "Herlaad vorig imagebestand" msgid "&Folder..." msgstr "&Map..." @@ -301,7 +301,7 @@ msgid "&Select shader..." msgstr "&Selecteer shader..." msgid "&Remove shader" -msgstr "&Remove shader" +msgstr "&Verwijder shader" msgid "Preferences" msgstr "Voorkeuren" @@ -310,7 +310,7 @@ msgid "Sound Gain" msgstr "Geluidsversterking" msgid "New Image" -msgstr "Nieuw image" +msgstr "Nieuw imagebestand" msgid "Settings" msgstr "Instellingen" @@ -343,7 +343,7 @@ msgid "RPM mode:" msgstr "RPM-modus:" msgid "Progress:" -msgstr "Vooruitgang:" +msgstr "Voortgang:" msgid "Width:" msgstr "Breedte:" @@ -352,7 +352,7 @@ msgid "Height:" msgstr "Hoogte:" msgid "Lock to this size" -msgstr "Leg vast op deze grootte" +msgstr "Vergrendel deze grootte" msgid "Machine type:" msgstr "Machinetype:" @@ -403,10 +403,10 @@ msgid "Dynamic Recompiler" msgstr "Dynamische Recompiler" msgid "CPU frame size" -msgstr "CPU frame grootte" +msgstr "CPU framegrootte" msgid "Larger frames (less smooth)" -msgstr "Groter frames (minder vloeiend)" +msgstr "Grotere frames (minder vloeiend)" msgid "Smaller frames (smoother)" msgstr "Kleinere frames (vloeiender)" @@ -430,7 +430,7 @@ msgid "IBM PS/55 Display Adapter Graphics" msgstr "IBM PS/55 Display Adapter Graphics" msgid "Keyboard:" -msgstr "Toetsenbord" +msgstr "Toetsenbord:" msgid "Keyboard" msgstr "Toetsenbord" @@ -472,13 +472,13 @@ msgid "Sound card #4:" msgstr "Geluidskaart #4:" msgid "MIDI Out Device:" -msgstr "MIDI Out-apparaat:" +msgstr "MIDI Uitvoerapparaat:" msgid "MIDI In Device:" -msgstr "MIDI In-apparaat:" +msgstr "MIDI Invoerapparaat:" msgid "MIDI Out:" -msgstr "Midi Out:" +msgstr "Midi Uit:" msgid "Standalone MPU-401" msgstr "Standalone MPU-401" @@ -649,7 +649,7 @@ msgid "Removable disks:" msgstr "Verwisselbare schijven:" msgid "Removable disk drives:" -msgstr "Verwisselbare schijfstations" +msgstr "Verwisselbare schijfstations:" msgid "ZIP 250" msgstr "ZIP 250" @@ -712,13 +712,13 @@ msgid "&Removable disk %1 (%2): %3" msgstr "&Verwijderbare schijf %1 (%2): %3" msgid "Removable disk images" -msgstr "Verwijderbare schijf image" +msgstr "Verwijderbaar schijfimagebestand" msgid "Image %1" msgstr "Image %1" msgid "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the \"roms\" directory." -msgstr "86Box kon geen bruikbare ROM images vinden.\n\nDownload een ROM set en pak deze uit in de map \"roms\"." +msgstr "86Box kon geen bruikbare ROM imagebestanden vinden.\n\nDownload een ROM set en pak deze uit in de map \"roms\"." msgid "(empty)" msgstr "(leeg)" @@ -814,7 +814,7 @@ msgid "Click to capture mouse" msgstr "Klik om muis vast te leggen" msgid "Press %1 to release mouse" -msgstr "Druk op %1 om de muis los te laten" +msgstr "Druk op %1 om de muis vrij te geven" msgid "Press %1 or middle button to release mouse" msgstr "Druk op %1 of middelste knop om de muis los te laten" @@ -973,7 +973,7 @@ msgid "Do you want to save the settings?" msgstr "Wil je de instellingen opslaan?" msgid "This will hard reset the emulated machine." -msgstr "Dit zal de geëmuleerde machine een hard reset geven." +msgstr "Dit zal de geëmuleerde machine een harde reset geven." msgid "Save" msgstr "Opslaan" @@ -1054,10 +1054,10 @@ msgid "Cartridge images" msgstr "Cartridge-images" msgid "Resume execution" -msgstr "Hervat executie" +msgstr "Hervat uitvoering" msgid "Pause execution" -msgstr "Pauze executie" +msgstr "Pauzeer uitvoering" msgid "Ctrl+Alt+Del" msgstr "Ctrl+Alt+Del" @@ -1084,7 +1084,7 @@ msgid "&Start" msgstr "&Start" msgid "Not running" -msgstr "Niet actied" +msgstr "Niet actief" msgid "Running" msgstr "Actief" @@ -1093,10 +1093,10 @@ msgid "Paused" msgstr "Gepauzeerd" msgid "Waiting" -msgstr "aan het wachtend" +msgstr "Aan het wachten" msgid "Powered Off" -msgstr "Sluit af" +msgstr "Uitgeschakeld" msgid "%n running" msgstr "%n actief" @@ -1126,7 +1126,7 @@ msgid "86Box configuration files (86box.cfg)" msgstr "86Box configuratiebestanden (86box.cfg)" msgid "Configuration read failed" -msgstr "Lezen configuratie mislukt" +msgstr "Lezen van configuratie mislukt" msgid "Unable to open the selected configuration file for reading: %1" msgstr "Openen van geselecteerd configuratiebestand voor lezen niet mogelijk: %1" @@ -1138,7 +1138,7 @@ msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM msgstr "%1 machine(s) zijn nu actief. Weet je zeker dat je de VM manager wil afsluiten?" msgid "Add new system wizard" -msgstr "Assistent voor toevoegen van nieuw systeem" +msgstr "Wizard toevoegen van nieuw systeem" msgid "Introduction" msgstr "Introductie" @@ -1186,13 +1186,13 @@ msgid "Directory does not exist" msgstr "Map bestaat niet" msgid "A new directory for the system will be created in the selected directory above" -msgstr "Een nieuwe map voor het systeem wordt aangemaakt in de boven geselecteerde map" +msgstr "Een nieuwe map voor het systeem wordt aangemaakt in de hierboven geselecteerde map" msgid "System location:" msgstr "Systeemlocatie:" msgid "System name and location" -msgstr "Systeemnaam en -locatie" +msgstr "Systeemnaam en locatie" msgid "Enter the name of the system and choose the location" msgstr "Voer de naam in van het systeem en kies een locatie" @@ -1252,7 +1252,7 @@ msgid "Failed to create directory for cloned VM" msgstr "Map aanmaken voor gekloonde VM mislukt" msgid "Failed to clone VM." -msgstr "Kolen van VM mislukt." +msgstr "Klonen van VM mislukt." msgid "Directory in use" msgstr "Map in gebruik" @@ -1303,7 +1303,7 @@ msgid "&Kill" msgstr "&Gedwongen beëindigen" msgid "Killing a virtual machine can cause data loss. Only do this if the 86Box process gets stuck.\n\nDo you really wish to kill the virtual machine \"%1\"?" -msgstr "Gedwongen beëindiging van een virtuele machine kan dataverlies veroorzaken. Doe dit alleen wanneer het 86Box process is vast gelopen.\n\nWeet je zeker dat je de virtuele machine \"%1\" wil beëindigen?" +msgstr "Gedwongen beëindiging van een virtuele machine kan dataverlies veroorzaken. Doe dit alleen wanneer het 86Box-proces is vast gelopen.\n\nWeet je zeker dat je de virtuele machine \"%1\" wil beëindigen?" msgid "&Delete" msgstr "&Verwijderen" @@ -1345,10 +1345,10 @@ msgid "Audio:" msgstr "Audio:" msgid "ACPI shutdown" -msgstr "ACPI uitschakeling" +msgstr "ACPI-uitschakeling" msgid "ACP&I shutdown" -msgstr "ACP&I uitschakeling" +msgstr "ACP&I-uitschakeling" msgid "Hard disk (%1)" msgstr "Harde schijf (%1)" @@ -1375,7 +1375,7 @@ msgid "Disk images cannot be larger than 127 GB." msgstr "Schijfimages kunnen niet groter zijn dan 127 GB." msgid "Hard disk images" -msgstr "Harde schijf-image" +msgstr "Harde schijf-images" msgid "Unable to read file" msgstr "Kan bestand niet lezen" @@ -1384,7 +1384,7 @@ msgid "Unable to write file" msgstr "Kan bestand niet schrijven" msgid "HDI or HDX images with a sector size other than 512 are not supported." -msgstr "HDI- of HDX-image met een andere sectorgrootte dan 512 worden niet ondersteund." +msgstr "HDI- of HDX-images met een andere sectorgrootte dan 512 worden niet ondersteund." msgid "Disk image file already exists" msgstr "Schijfimagebestand bestaat al" @@ -1432,7 +1432,7 @@ msgid "Fixed-size VHD" msgstr "VHD met vaste grootte" msgid "Dynamic-size VHD" -msgstr "VHD met dynamisch grootte" +msgstr "VHD met dynamische grootte" msgid "Differencing VHD" msgstr "Verschil-VHD" @@ -1453,7 +1453,7 @@ msgid "Fixed-size VHD (.vhd)" msgstr "VHD met vaste grootte (.vhd)" msgid "Dynamic-size VHD (.vhd)" -msgstr "VHD met dynamisch grootte (.vhd)" +msgstr "VHD met dynamische grootte (.vhd)" msgid "Differencing VHD (.vhd)" msgstr "Verschil-VHD (.vhd)" @@ -1639,7 +1639,7 @@ msgid "List of MCA devices:" msgstr "Lijst van MCA-apparaten:" msgid "&Tablet tool" -msgstr "Tablet-hulpmiddel" +msgstr "&Tablet-hulpmiddel" msgid "About &Qt" msgstr "Over &Qt" @@ -1648,10 +1648,10 @@ msgid "&MCA devices..." msgstr "MCA-apparaten..." msgid "Show non-&primary monitors" -msgstr "Toon niet-primaire monitors" +msgstr "Toon niet-primaire beeldschermen" msgid "Open screenshots &folder..." -msgstr "Map met schermafbeeldingen openen..." +msgstr "&Map met schermafbeeldingen openen..." msgid "Appl&y fullscreen stretch mode when maximized" msgstr "Schakel de volledig scherm-uitrekmodus in bij maximaliseren" @@ -1663,7 +1663,7 @@ msgid "&Pen" msgstr "&Pen" msgid "&Host CD/DVD Drive (%1:)" -msgstr "&Host cd/dvd-station (%1:)" +msgstr "&Host CD/DVD-station (%1:)" msgid "&Connected" msgstr "&Verbonden" @@ -1672,7 +1672,7 @@ msgid "Clear image &history" msgstr "Imagegeschiedenis verwijderen(&H)" msgid "Create..." -msgstr "Creëer..." +msgstr "Aanmaken..." msgid "Host CD/DVD Drive (%1)" msgstr "Host CD/DVD-station (%1)" @@ -1717,10 +1717,10 @@ msgid "Browse..." msgstr "Bladeren..." msgid "Couldn't create OpenGL context." -msgstr "Kan OpenGL context niet aanmaken." +msgstr "Kan OpenGL-context niet aanmaken." msgid "Couldn't switch to OpenGL context." -msgstr "Kan niet overschakelen naar OpenGL context." +msgstr "Kan niet overschakelen naar OpenGL-context." msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "OpenGL versie 3.0 of hoger is vereist. De huidige versie is %1.%2" @@ -1783,7 +1783,7 @@ msgid "VDE Socket:" msgstr "VDE-socket:" msgid "86Box Unit Tester" -msgstr "86Box apparaattester" +msgstr "86Box Apparaattester" msgid "Novell NetWare 2.x Key Card" msgstr "Novell NetWare 2.x Key Card" @@ -1855,7 +1855,7 @@ msgid "Default Baud rate" msgstr "Standaard baudrate" msgid "[COM] Standard Hayes-compliant Modem" -msgstr "COM] Standaard Hayes-compatibele modem " +msgstr "[COM] Standaard Hayes-compatibele modem " msgid "Roland MT-32 Emulation" msgstr "Roland MT-32-emulatie" @@ -1939,7 +1939,7 @@ msgid "Parallel port IRQ" msgstr "Parallelle poort IRQ" msgid "BIOS Revision" -msgstr "BIOS Revisie" +msgstr "BIOS-Revisie" msgid "BIOS Version" msgstr "BIOS-versie" @@ -2557,16 +2557,16 @@ msgid "Apply overscan deltas" msgstr "Overscan-delta’s toepassen" msgid "Mono Interlaced" -msgstr "Mono geïnterlaced " +msgstr "Mono Interlaced " msgid "Mono Non-Interlaced" -msgstr "Mono niet geïnterlaced" +msgstr "Mono Niet-Interlaced" msgid "Color Interlaced" -msgstr "Kleur interlaced" +msgstr "Kleur Interlaced" msgid "Color Non-Interlaced" -msgstr "Kleur niet geïnterlaced" +msgstr "Kleur Niet-Interlaced" msgid "3Dfx Voodoo Graphics" msgstr "3Dfx Voodoo Graphics" @@ -2653,7 +2653,7 @@ msgid "E&ject %1" msgstr "&Uitwerpen %1" msgid "&Unmute" -msgstr "&Geluid aanzetten" +msgstr "&Dempen opheffen" msgid "Softfloat FPU" msgstr "Softfloat FPU" @@ -2779,7 +2779,7 @@ msgid "Keybind" msgstr "Toetskoppeling" msgid "Clear binding" -msgstr "Wis koppelinh" +msgstr "Wis koppeling" msgid "Bind" msgstr "Koppel" @@ -2794,7 +2794,7 @@ msgid "Bind conflict" msgstr "Koppelconflict" msgid "This key combo is already in use." -msgstr "Deze toetsencombinatie is al in gebruik" +msgstr "Deze toetsencombinatie is al in gebruik." msgid "Send Control+Alt+Del" msgstr "Stuur Control+Alt+Del" @@ -2812,7 +2812,7 @@ msgid "Release mouse pointer" msgstr "Geef muis vrij" msgid "Toggle pause" -msgstr "Pause omschakelen" +msgstr "Pauzeren omschakelen" msgid "Toggle mute" msgstr "Geluiddemping omschakelen" @@ -2833,13 +2833,13 @@ msgid "Remote Switch" msgstr "Externe Switch" msgid "Switch:" -msgstr "Switch" +msgstr "Switch:" msgid "Hub Mode" msgstr "Hub-modus" msgid "Hostname:" -msgstr "Hostname" +msgstr "Hostnaam" msgid "ISA RAM:" msgstr "ISA RAM:" @@ -2863,10 +2863,10 @@ msgid "An error occurred trying to wipe the NVRAM contents of the virtual machin msgstr "Fout bij Wissen van NVRAM-inhoud van de virtuele machine \"%1\"" msgid "%1 VM Manager" -msgstr "%1 VM Manager" +msgstr "%1 VM Beheerder" msgid "%n disk(s)" -msgstr "%n schijf(en)" +msgstr "%n schijf/schijven" msgid "Unknown Status" msgstr "Onbekende Status" @@ -2875,7 +2875,7 @@ msgid "No Machines Found!" msgstr "Geen Machines Gevonden!" msgid "Check for updates on startup" -msgstr "Controleer op updates bij start" +msgstr "Controleer op updates bij starten" msgid "Unable to determine release information" msgstr "Kan release-informatie niet bepalen" From 33877c92b1cc14c820bf9db5a4e2af04902d947e Mon Sep 17 00:00:00 2001 From: Verloren50000 <110334428+Verloren50000@users.noreply.github.com> Date: Wed, 15 Oct 2025 15:37:33 +0800 Subject: [PATCH 022/113] Super I/O Chip Changes (October 15, 2025) (#6349) * sio_fdc37m60x.c: FDC37C93x -> FDC37M60x Rename the Super I/O chip name "SMC FDC37C93x Super I/O" to "SMC FDC37M60x Super I/O". * sio_w83977.c: SMC FDC37C93x -> Winbond W83977 Rename "SMC FDC37C93x Super I/O" to "Winbond W83977 Super I/O". * sio_w83977.c: W83977 -> W83977F/TF/EF --- src/sio/sio_fdc37m60x.c | 2 +- src/sio/sio_w83977.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sio/sio_fdc37m60x.c b/src/sio/sio_fdc37m60x.c index e6470a6ea..f3c2a0a7d 100644 --- a/src/sio/sio_fdc37m60x.c +++ b/src/sio/sio_fdc37m60x.c @@ -685,7 +685,7 @@ fdc37m60x_init(const device_t *info) } const device_t fdc37m60x_device = { - .name = "SMC FDC37C93x Super I/O", + .name = "SMC FDC37M60x Super I/O", .internal_name = "fdc37m60x", .flags = 0, .local = 0, diff --git a/src/sio/sio_w83977.c b/src/sio/sio_w83977.c index a14e50942..07fda5d4e 100644 --- a/src/sio/sio_w83977.c +++ b/src/sio/sio_w83977.c @@ -1330,7 +1330,7 @@ w83977_init(const device_t *info) } const device_t w83977_device = { - .name = "SMC FDC37C93x Super I/O", + .name = "Winbond W83977F/TF/EF Super I/O", .internal_name = "w83977", .flags = 0, .local = 0, From 812ee8d75a7205f4d7f551ce5e6aa67ea7275768 Mon Sep 17 00:00:00 2001 From: Maxwell Scott Date: Wed, 15 Oct 2025 14:37:52 +0700 Subject: [PATCH 023/113] ECS P6BXT-A+ overhaul + additional BIOSes for machines & a misc. change (#6347) * Added beta v4.51G BIOS to P5MP3 * Added the earliest 4.51PG BIOS to AX59 Pro Also internal_name corrections * Added the non-OEM(?) BIOS to 6110Zu * Added the non-OEM 4.51PG and unofficial 6.00PG BIOSes to Compaq Compaq ProSignia S31x, which is renamed into ECS P6BXT-A+. Also unblock Cyrix CPUs as well as unofficial 6.00PG BIOS supports them. * Removed the v4.51PG due to POST failure Also slightly changed the maximum voltage bus to 124MHz per unofficial v6.00 BIOS, corrected the BIOS name per the BIOS screen on that BIOS, and added the author credit. Also lowered the minimum memory on LG IBM MS-6106 to 8mb. * Added the 050591 BIOS to DataExpert 386WB * Renamed 386WB to 386C * Make configurations intact Per OBattler. --- src/include/86box/machine.h | 12 +++++ src/machine/m_at_386dx.c | 64 ++++++++++++++++++++++++-- src/machine/m_at_slot1.c | 65 ++++++++++++++++++++++++-- src/machine/m_at_slot1_socket370.c | 74 ++++++++++++++++++++++++++++-- src/machine/m_at_socket4.c | 65 ++++++++++++++++++++++++-- src/machine/m_at_socket5.c | 4 +- src/machine/m_at_socket7_3v.c | 4 +- src/machine/m_at_sockets7.c | 6 +-- src/machine/machine_table.c | 25 +++++----- 9 files changed, 279 insertions(+), 40 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 1f8aaeae3..7011841fc 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -635,6 +635,9 @@ extern int machine_at_tandy4000_init(const machine_t *); extern int machine_at_ecs386v_init(const machine_t *); /* OPTi 391 */ +#ifdef EMU_DEVICE_H +extern const device_t dataexpert386wb_device; +#endif extern int machine_at_dataexpert386wb_init(const machine_t *); /* OPTi 495SLC */ @@ -866,6 +869,9 @@ extern const device_t v12p_device; #endif extern int machine_at_v12p_init(const machine_t *); extern int machine_at_excaliburpci_init(const machine_t *); +#ifdef EMU_DEVICE_H +extern const device_t p5mp3_device; +#endif extern int machine_at_p5mp3_init(const machine_t *); extern int machine_at_opti560l_init(const machine_t *); extern void machine_at_award_common_init(const machine_t *); @@ -1213,6 +1219,9 @@ extern const device_t s1846_device; extern int machine_at_s1846_init(const machine_t *); /* i440ZX */ +#ifdef EMU_DEVICE_H +extern const device_t vei8_device; +#endif extern int machine_at_vei8_init(const machine_t *); extern int machine_at_ms6168_init(const machine_t *); extern int machine_at_borapro_init(const machine_t *); @@ -1240,6 +1249,9 @@ extern int machine_at_fw6400gx_init(const machine_t *); /* m_at_slot1_socket370.c */ /* i440BX */ +#ifdef EMU_DEVICE_H +extern const device_t prosignias31x_device; +#endif extern int machine_at_prosignias31x_bx_init(const machine_t *); extern int machine_at_s1857_init(const machine_t *); diff --git a/src/machine/m_at_386dx.c b/src/machine/m_at_386dx.c index 5816204ed..3070c19c1 100644 --- a/src/machine/m_at_386dx.c +++ b/src/machine/m_at_386dx.c @@ -332,17 +332,71 @@ machine_at_ecs386v_init(const machine_t *model) } /* OPTi 391 */ +static const device_config_t dataexpert386wb_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "dataexpert386wb", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "AMIBIOS 050591", + .internal_name = "ami386wb", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 65536, + .files = { "roms/machines/dataexpert386wb/386-OPTI-386WB-10.BIN", "" } + }, + { + .name = "MR BIOS V1.26", + .internal_name = "dataexpert386wb", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 65536, + .files = { "roms/machines/dataexpert386wb/st0386-wb-ver2-0-618f078c738cb397184464.bin", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t dataexpert386wb_device = { + .name = "DataExpert 386WB", + .internal_name = "dataexpert386wb_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = dataexpert386wb_config +}; + int machine_at_dataexpert386wb_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/dataexpert386wb/st0386-wb-ver2-0-618f078c738cb397184464.bin", - 0x000f0000, 65536, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000f0000, 65536, 0); + machine_at_common_init(model); device_add(&opti391_device); diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index 5345724d6..a89044af7 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -1085,18 +1085,73 @@ machine_at_s1846_init(const machine_t *model) return ret; } +static const device_config_t vei8_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "vei8", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Award Modular BIOS v6.00PG - Revision QHW.10.01 (HP Sherwood-B)", + .internal_name = "vei8", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/vei8/QHW1001.BIN", "" } + }, + { + .name = "Award Modular BIOS v6.00PG - Revision R804", + .internal_name = "6110zu", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/vei8/r804.bin", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t vei8_device = { + .name = "MiTAC/Trigon 6110Zu", + .internal_name = "vei8_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = vei8_config +}; + /* i440ZX */ int machine_at_vei8_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/vei8/QHW1001.BIN", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000c0000, 262144, 0); + device_context_restore(); + machine_at_common_init_ex(model, 2); pci_init(PCI_CONFIG_TYPE_1); diff --git a/src/machine/m_at_slot1_socket370.c b/src/machine/m_at_slot1_socket370.c index cf689fd08..a9006c5e7 100644 --- a/src/machine/m_at_slot1_socket370.c +++ b/src/machine/m_at_slot1_socket370.c @@ -39,17 +39,81 @@ #include <86box/snd_ac97.h> /* i440BX */ +static const device_config_t prosignias31x_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "prosignias31x_bx", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Award Modular BIOS v4.51PG - Revision 5.3", + .internal_name = "p6bxt", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/prosignias31x_bx/bxt53s.BIN", "" } + }, + { + .name = "Award Modular BIOS v4.51PG - Revision 5.5 (Compaq ProSignia/Deskpro 440BX)", + .internal_name = "prosignias31x_bx", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/prosignias31x_bx/p6bxt-ap-092600.bin", "" } + }, + { + .name = "Phoenix - AwardBIOS v6.00PG - Unofficial Version 6.0 (by rushieda)", + .internal_name = "p6bxt_600pg", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/prosignias31x_bx/p6bxtap-600-67b8bfdce5de3470118202.bin", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t prosignias31x_device = { + .name = "ECS P6BXT-A+", + .internal_name = "prosignias31x_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = prosignias31x_config +}; + int machine_at_prosignias31x_bx_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/prosignias31x_bx/p6bxt-ap-092600.bin", - 0x000c0000, 262144, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000c0000, 262144, 0); + device_context_restore(); + machine_at_common_init_ex(model, 2); pci_init(PCI_CONFIG_TYPE_1); diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index d518ac5dd..1d77d99a4 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -158,17 +158,72 @@ machine_at_excaliburpci_init(const machine_t *model) return ret; } +static const device_config_t p5mp3_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "p5mp3", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Award Modular BIOS v4.50 - Revision 0205", + .internal_name = "p5mp3", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/p5mp3/0205.bin", "" } + }, + { + .name = "Award Modular BIOS v4.51G - Revision 0402 (Beta)", + .internal_name = "p5mp3_beta", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/p5mp3/0402.001", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t p5mp3_device = { + .name = "ASUS P/I-P5MP3", + .internal_name = "p5mp3_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = p5mp3_config +}; + int machine_at_p5mp3_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/p5mp3/0205.bin", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000e0000, 131072, 0); + device_context_restore(); + machine_at_common_init(model); pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING); diff --git a/src/machine/m_at_socket5.c b/src/machine/m_at_socket5.c index 1d8f50a76..50a28a9c8 100644 --- a/src/machine/m_at_socket5.c +++ b/src/machine/m_at_socket5.c @@ -566,7 +566,7 @@ static const device_config_t pt2000_config[] = { .bios = { { .name = "Award Modular BIOS v4.50GP - Revision T1.01", - .internal_name = "pt2000_450gp", + .internal_name = "pt2000", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, @@ -575,7 +575,7 @@ static const device_config_t pt2000_config[] = { }, { .name = "Award Modular BIOS v4.51PG - Revision 3.072C806", - .internal_name = "pt2000", + .internal_name = "pt2000_451pg", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index fb24f5a43..02461d072 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -690,7 +690,7 @@ static const device_config_t ms5119_config[] = { }, { .name = "Award Modular BIOS v4.51PG - Release 2.3 (by Rainbow)", - .internal_name = "ms5119_v451pg", + .internal_name = "ms5119_451pg", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, @@ -871,7 +871,7 @@ static const device_config_t fmb_config[] = { }, { .name = "Award Modular BIOS v4.51PG - 2001 Release (by Rainbow)", - .internal_name = "fmb_v451pg", + .internal_name = "fmb_451pg", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, diff --git a/src/machine/m_at_sockets7.c b/src/machine/m_at_sockets7.c index 07b3c59af..550da59b9 100644 --- a/src/machine/m_at_sockets7.c +++ b/src/machine/m_at_sockets7.c @@ -200,7 +200,7 @@ static const device_config_t g5x_config[] = { }, { .name = "Phoenix - AwardBIOS v6.00PG - Release 4.1 (by eSupport)", - .internal_name = "5ax_esupport", + .internal_name = "5ax_600pg", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, @@ -312,7 +312,7 @@ static const device_config_t delhi3_config[] = { .bios = { { .name = "AMIBIOS 6 (071595) - Revision 1.01", - .internal_name = "delhi3", + .internal_name = "delhi3_nonoem", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, @@ -321,7 +321,7 @@ static const device_config_t delhi3_config[] = { }, { .name = "AMIBIOS 6 (071595) - Revision 1.20 (eMachines eTower 3__k)", - .internal_name = "etower", + .internal_name = "delhi3", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 7333e6846..e65db4fa4 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -6627,7 +6627,7 @@ const machine_t machines[] = { }, /* Has AMIKey 'F' KBC firmware. */ { - .name = "[OPTi 391] DataExpert 386WB", + .name = "[OPTi 391] DataExpert 386C", .internal_name = "dataexpert386wb", .type = MACHINE_TYPE_386DX, .chipset = MACHINE_CHIPSET_OPTI_391, @@ -6661,7 +6661,7 @@ const machine_t machines[] = { .kbc_p1 = 0x000004f0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &dataexpert386wb_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, @@ -11350,7 +11350,7 @@ const machine_t machines[] = { .kbc_p1 = 0x00000cf0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &p5mp3_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, @@ -17433,7 +17433,7 @@ const machine_t machines[] = { .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, /* Machine has internal SCSI: Adaptec AIC-7880U */ .ram = { - .min = 40960, + .min = 8192, .max = 524288, .step = 8192 }, @@ -18408,7 +18408,7 @@ const machine_t machines[] = { /* Has a SM(S)C FDC37M60x Super I/O chip with on-chip KBC with most likely AMIKey-2 KBC firmware. */ { - .name = "[i440ZX] HP Sherwood-B (MiTAC/Trigon 6110Zu)", + .name = "[i440ZX] MiTAC/Trigon 6110Zu", .internal_name = "vei8", .type = MACHINE_TYPE_SLOT1, .chipset = MACHINE_CHIPSET_INTEL_440ZX, @@ -18442,7 +18442,7 @@ const machine_t machines[] = { .kbc_p1 = 0x000044f0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &vei8_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, @@ -18910,13 +18910,12 @@ const machine_t machines[] = { /* Slot 1/Socket 370 machines */ /* 440BX */ - /* OEM version of ECS P6BXT-A+ REV 1.3x/2.2x. Has a Winbond W83977EF Super - I/O chip with on-chip KBC with AMIKey-2 KBC firmware.*/ + /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware.*/ { - .name = "[i440BX] Compaq ProSignia S316/318 (Intel)", + .name = "[i440BX] ECS P6BXT-A+", .internal_name = "prosignias31x_bx", .type = MACHINE_TYPE_SLOT1_370, - .chipset = MACHINE_CHIPSET_VIA_APOLLO_PRO_133, + .chipset = MACHINE_CHIPSET_INTEL_440BX, .init = machine_at_prosignias31x_bx_init, .p1_handler = machine_generic_p1_handler, .gpio_handler = NULL, @@ -18924,9 +18923,9 @@ const machine_t machines[] = { .gpio_acpi_handler = NULL, .cpu = { .package = CPU_PKG_SLOT1 | CPU_PKG_SOCKET370, - .block = CPU_BLOCK(CPU_PENTIUMPRO, CPU_CYRIX3S), /* Instability issues with PPro, and garbled text in POST with Cyrix */ + .block = CPU_BLOCK(CPU_PENTIUMPRO), /* Instability issues with PPro, and garbled text in POST with Cyrix (latter supported on unofficial v6.00PG BIOS) */ .min_bus = 66666667, - .max_bus = 100000000, + .max_bus = 124242424, .min_voltage = 1300, .max_voltage = 3500, .min_multi = 1.5, @@ -18947,7 +18946,7 @@ const machine_t machines[] = { .kbc_p1 = 0x00000cf0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &prosignias31x_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, From ae7191ed75ca785a01d43b22f5febc1699697931 Mon Sep 17 00:00:00 2001 From: Maxwell Scott Date: Wed, 15 Oct 2025 22:12:28 +0700 Subject: [PATCH 024/113] Reverted MS-6106 memory change and added note (#6351) --- src/machine/machine_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index e65db4fa4..aae2e6b9f 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -17433,7 +17433,7 @@ const machine_t machines[] = { .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, /* Machine has internal SCSI: Adaptec AIC-7880U */ .ram = { - .min = 8192, + .min = 40960, /* does not POST with lower than 40MB; Award and AMI retail BIOSes not affected(?) */ .max = 524288, .step = 8192 }, From 3493d5fc737e5d009f097f7bdd437a9059d881f9 Mon Sep 17 00:00:00 2001 From: bozoscum Date: Wed, 15 Oct 2025 23:12:39 +0800 Subject: [PATCH 025/113] add Multitech PC-900 BIOS ROM V2.07B and V3.01B (#6350) --- src/machine/m_at_286.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/machine/m_at_286.c b/src/machine/m_at_286.c index 20baec312..357a0f872 100644 --- a/src/machine/m_at_286.c +++ b/src/machine/m_at_286.c @@ -367,7 +367,26 @@ static const device_config_t pc900_config[] = { .local = 0, .size = 32768, .files = { "roms/machines/pc900/cbm_pc40_v207a_xc.bin", "" } - } + }, + { + .name = "BIOS V2.07B", + .internal_name = "pc900_v207b", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 32768, + .files = { "roms/machines/pc900/mpf_pc900_v207b.bin", "" } + }, + { + .name = "BIOS V3.01B", + .internal_name = "pc900_v301b", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 32768, + .files = { "roms/machines/pc900/cbm_pc40_v301b.bin", "" } + }, + { .files_no = 0 } }, }, { .name = "", .description = "", .type = CONFIG_END } From a8f98772d8ca1ff89caa50457adecd66b5ca5f26 Mon Sep 17 00:00:00 2001 From: WNT50 <173389620+WNT50@users.noreply.github.com> Date: Thu, 16 Oct 2025 22:45:28 +0800 Subject: [PATCH 026/113] Add IBM 512KB/2MB 286 Memory Expansion Adapter emulation (#6354) --- src/machine/m_ps2_mca.c | 118 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 116 insertions(+), 2 deletions(-) diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index f02dd265a..09241a2b4 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -99,6 +99,7 @@ static struct ps2_t { uint8_t mem_pos_regs[8]; uint8_t mem_2mb_pos_regs[8]; + uint8_t mem_2mb_pos_cache[1024]; int pending_cache_miss; @@ -1061,6 +1062,111 @@ ps2_mem_expansion_feedb(UNUSED(void *priv)) return (ps2.mem_pos_regs[2] & 1); } +static uint8_t +ps2_mem_2mb_cache_read(void) +{ + uint8_t cache_addr_lo = ps2.mem_2mb_pos_regs[6]; + uint8_t cache_addr_hi = ps2.mem_2mb_pos_regs[7]; + uint16_t cache_addr = (cache_addr_hi << 8) | cache_addr_lo; + + ps2_mca_log("ps2_mem_2mb_cache_read: addr=%04x %02x %04x:%04x\n", cache_addr, ps2.mem_2mb_pos_cache[cache_addr & 0x3ff], CS, cpu_state.pc); + return ps2.mem_2mb_pos_cache[cache_addr & 0x3ff]; +} + +static void +ps2_mem_2mb_cache_write(uint8_t val) +{ + uint8_t cache_addr_lo = ps2.mem_2mb_pos_regs[6]; + uint8_t cache_addr_hi = ps2.mem_2mb_pos_regs[7]; + uint16_t cache_addr = (cache_addr_hi << 8) | cache_addr_lo; + + ps2_mca_log("ps2_mem_2mb_cache_write: addr=%04x %02x %04x:%04x\n", cache_addr, val, CS, cpu_state.pc); + ps2.mem_2mb_pos_cache[cache_addr & 0x3ff] = val; +} + +static uint8_t +ps2_mem_2mb_expansion_read(int port, UNUSED(void *priv)) +{ + if (port == 0x103) + ps2.mem_2mb_pos_regs[3] = ps2_mem_2mb_cache_read(); + return ps2.mem_2mb_pos_regs[port & 7]; +} + +static void +ps2_mem_2mb_expansion_write(int port, uint8_t val, UNUSED(void *priv)) +{ + if (port < 0x102) + return; + + if (port == 0x103) + ps2_mem_2mb_cache_write(val); + else if (port == 0x102) + ps2.mem_2mb_pos_regs[2] = (ps2.mem_2mb_pos_regs[2] & 0xfe) | (val & 0x01); + else if (port == 0x105) + ps2.mem_2mb_pos_regs[5] = (ps2.mem_2mb_pos_regs[2] & 0x01) | (val & 0xfe); + else + ps2.mem_2mb_pos_regs[port & 7] = val; + + if (ps2.mem_2mb_pos_regs[2] & 1) + mem_mapping_enable(&ps2.expansion_mapping); + else + mem_mapping_disable(&ps2.expansion_mapping); +} + +static uint8_t +ps2_mem_2mb_expansion_feedb(UNUSED(void *priv)) +{ + return (ps2.mem_2mb_pos_regs[2] & 1); +} + +static void +ps2_mca_mem_fefe_init(int start_mb) +{ + uint32_t planar_size; + uint32_t expansion_start; + + planar_size = (start_mb - 1) << 20; + expansion_start = start_mb << 20; + + mem_mapping_set_addr(&ram_high_mapping, 0x100000, planar_size); + + ps2.mem_2mb_pos_regs[0] = 0xfe; + ps2.mem_2mb_pos_regs[1] = 0xfe; + + switch ((mem_size / 1024) - start_mb) { + case 0:/*256Kx2 = 11 11 11 10*/ + ps2.mem_2mb_pos_regs[2] = 0xfe; + ps2.mem_2mb_pos_regs[5] = 0xfe; + break; + case 1:/*256Kx4 = 11 11 10 10*/ + ps2.mem_2mb_pos_regs[2] = 0xfa; + ps2.mem_2mb_pos_regs[5] = 0xfe; + break; + case 2:/*256Kx8 = 10 10 10 10*/ + ps2.mem_2mb_pos_regs[2] = 0xaa; + ps2.mem_2mb_pos_regs[5] = 0xfe; + break; + + default: + break; + } + + mca_add(ps2_mem_2mb_expansion_read, ps2_mem_2mb_expansion_write, ps2_mem_2mb_expansion_feedb, NULL, NULL); + mem_mapping_add(&ps2.expansion_mapping, + expansion_start, + (mem_size - (start_mb << 10)) << 10, + mem_read_ram, + mem_read_ramw, + mem_read_raml, + mem_write_ram, + mem_write_ramw, + mem_write_raml, + &ram[expansion_start], + MEM_MAPPING_INTERNAL, + NULL); + mem_mapping_disable(&ps2.expansion_mapping); +} + static void ps2_mca_mem_fffc_init(int start_mb) { @@ -1188,7 +1294,11 @@ ps2_mca_board_model_50_init(void) if (mem_size > 2048) { /* Only 2 MB supported on planar, create a memory expansion card for the rest */ - ps2_mca_mem_fffc_init(2); + if (mem_size > 4096) { + ps2_mca_mem_fffc_init(2); + } else { + ps2_mca_mem_fefe_init(2); + } } if (gfxcard[0] == VID_INTERNAL) @@ -1235,7 +1345,11 @@ ps2_mca_board_model_60_init(void) if (mem_size > 4096) { /* Only 4 MB supported on planar, create a memory expansion card for the rest */ - ps2_mca_mem_fffc_init(4); + if (mem_size > 6144) { + ps2_mca_mem_fffc_init(4); + } else { + ps2_mca_mem_fefe_init(4); + } } device_add(&ps2_nvr_55ls_device); From a8b4aa0602a685865a347b737542c679590e7b11 Mon Sep 17 00:00:00 2001 From: WNT50 <173389620+WNT50@users.noreply.github.com> Date: Sat, 18 Oct 2025 07:11:09 +0800 Subject: [PATCH 027/113] Revert "Add IBM 512KB/2MB 286 Memory Expansion Adapter emulation (#6354)" (#6357) This reverts commit a8f98772d8ca1ff89caa50457adecd66b5ca5f26. --- src/machine/m_ps2_mca.c | 118 +--------------------------------------- 1 file changed, 2 insertions(+), 116 deletions(-) diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index 09241a2b4..f02dd265a 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -99,7 +99,6 @@ static struct ps2_t { uint8_t mem_pos_regs[8]; uint8_t mem_2mb_pos_regs[8]; - uint8_t mem_2mb_pos_cache[1024]; int pending_cache_miss; @@ -1062,111 +1061,6 @@ ps2_mem_expansion_feedb(UNUSED(void *priv)) return (ps2.mem_pos_regs[2] & 1); } -static uint8_t -ps2_mem_2mb_cache_read(void) -{ - uint8_t cache_addr_lo = ps2.mem_2mb_pos_regs[6]; - uint8_t cache_addr_hi = ps2.mem_2mb_pos_regs[7]; - uint16_t cache_addr = (cache_addr_hi << 8) | cache_addr_lo; - - ps2_mca_log("ps2_mem_2mb_cache_read: addr=%04x %02x %04x:%04x\n", cache_addr, ps2.mem_2mb_pos_cache[cache_addr & 0x3ff], CS, cpu_state.pc); - return ps2.mem_2mb_pos_cache[cache_addr & 0x3ff]; -} - -static void -ps2_mem_2mb_cache_write(uint8_t val) -{ - uint8_t cache_addr_lo = ps2.mem_2mb_pos_regs[6]; - uint8_t cache_addr_hi = ps2.mem_2mb_pos_regs[7]; - uint16_t cache_addr = (cache_addr_hi << 8) | cache_addr_lo; - - ps2_mca_log("ps2_mem_2mb_cache_write: addr=%04x %02x %04x:%04x\n", cache_addr, val, CS, cpu_state.pc); - ps2.mem_2mb_pos_cache[cache_addr & 0x3ff] = val; -} - -static uint8_t -ps2_mem_2mb_expansion_read(int port, UNUSED(void *priv)) -{ - if (port == 0x103) - ps2.mem_2mb_pos_regs[3] = ps2_mem_2mb_cache_read(); - return ps2.mem_2mb_pos_regs[port & 7]; -} - -static void -ps2_mem_2mb_expansion_write(int port, uint8_t val, UNUSED(void *priv)) -{ - if (port < 0x102) - return; - - if (port == 0x103) - ps2_mem_2mb_cache_write(val); - else if (port == 0x102) - ps2.mem_2mb_pos_regs[2] = (ps2.mem_2mb_pos_regs[2] & 0xfe) | (val & 0x01); - else if (port == 0x105) - ps2.mem_2mb_pos_regs[5] = (ps2.mem_2mb_pos_regs[2] & 0x01) | (val & 0xfe); - else - ps2.mem_2mb_pos_regs[port & 7] = val; - - if (ps2.mem_2mb_pos_regs[2] & 1) - mem_mapping_enable(&ps2.expansion_mapping); - else - mem_mapping_disable(&ps2.expansion_mapping); -} - -static uint8_t -ps2_mem_2mb_expansion_feedb(UNUSED(void *priv)) -{ - return (ps2.mem_2mb_pos_regs[2] & 1); -} - -static void -ps2_mca_mem_fefe_init(int start_mb) -{ - uint32_t planar_size; - uint32_t expansion_start; - - planar_size = (start_mb - 1) << 20; - expansion_start = start_mb << 20; - - mem_mapping_set_addr(&ram_high_mapping, 0x100000, planar_size); - - ps2.mem_2mb_pos_regs[0] = 0xfe; - ps2.mem_2mb_pos_regs[1] = 0xfe; - - switch ((mem_size / 1024) - start_mb) { - case 0:/*256Kx2 = 11 11 11 10*/ - ps2.mem_2mb_pos_regs[2] = 0xfe; - ps2.mem_2mb_pos_regs[5] = 0xfe; - break; - case 1:/*256Kx4 = 11 11 10 10*/ - ps2.mem_2mb_pos_regs[2] = 0xfa; - ps2.mem_2mb_pos_regs[5] = 0xfe; - break; - case 2:/*256Kx8 = 10 10 10 10*/ - ps2.mem_2mb_pos_regs[2] = 0xaa; - ps2.mem_2mb_pos_regs[5] = 0xfe; - break; - - default: - break; - } - - mca_add(ps2_mem_2mb_expansion_read, ps2_mem_2mb_expansion_write, ps2_mem_2mb_expansion_feedb, NULL, NULL); - mem_mapping_add(&ps2.expansion_mapping, - expansion_start, - (mem_size - (start_mb << 10)) << 10, - mem_read_ram, - mem_read_ramw, - mem_read_raml, - mem_write_ram, - mem_write_ramw, - mem_write_raml, - &ram[expansion_start], - MEM_MAPPING_INTERNAL, - NULL); - mem_mapping_disable(&ps2.expansion_mapping); -} - static void ps2_mca_mem_fffc_init(int start_mb) { @@ -1294,11 +1188,7 @@ ps2_mca_board_model_50_init(void) if (mem_size > 2048) { /* Only 2 MB supported on planar, create a memory expansion card for the rest */ - if (mem_size > 4096) { - ps2_mca_mem_fffc_init(2); - } else { - ps2_mca_mem_fefe_init(2); - } + ps2_mca_mem_fffc_init(2); } if (gfxcard[0] == VID_INTERNAL) @@ -1345,11 +1235,7 @@ ps2_mca_board_model_60_init(void) if (mem_size > 4096) { /* Only 4 MB supported on planar, create a memory expansion card for the rest */ - if (mem_size > 6144) { - ps2_mca_mem_fffc_init(4); - } else { - ps2_mca_mem_fefe_init(4); - } + ps2_mca_mem_fffc_init(4); } device_add(&ps2_nvr_55ls_device); From f7a3ca4ccdb2ab55b49cf364cdea6bf6e80eb85d Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sat, 18 Oct 2025 03:09:34 +0200 Subject: [PATCH 028/113] Corrections to displays (October 18th, 2025) (rebase) 1. In the STG code, separated the STG1703 without its built-in clock as 1702 while keeping the one with the clock as 1703. 2. Added the ICS2494AN-324 clock generator used by the et4000w32 series. 3. Return 0x98 as the ID of the ATT498 ramdac. 4. Corrected the pixel clocks of the IBM RGB528 while keeping its current compatibility and exactness of the refresh rates of its clocks. 5. Added a variable reference clock of the SDAC/GenDAC for future use. 6. The clocks of the TVP3026 have been implemented for a while. Some corrections have been made (plus color key r/w). 7. Mach64 enhanced mode doesn't use scrollcache (bits 0-3 of attrregs 0x13), fixes some pixels being off (mainly in win3.1x) 8. Reorganized the cirrus 54xx built-in clock for proper refresh rates. 9. Proper reorganization of the et4000w32 series of chipsets and their cards supporting them, from cursor to clocks to ramdacs plus a 24bpp acceleration fix for the w32p series (about pixels being processed in bitblt). 10. Removed the PCI videomagic card as its bios doesn't have the PCIR header while making sure the plain ISA/VLB w32 and ISA only w32i (now named Axis Microdevice) support 2mb of vram properly. 11. Added the Hercules Dynamite VL Pro based on the w32i chip (and VLB). 12. Initialize the et4000w32 cards with misc bit 0 set as well as crtc31 bit 6 for rs2 connection to the ramdac. 13. Refactored the S3 Pre-ViRGE code to have proper refresh rates and clocks and added the 805I as a member of the chips (ID 0xa8). 14. Replaced the S3 805I Elsa Winner 1000 ISA bios with a more supported one for our code using the SDAC. 15. Added proper 24bpp acceleration to the Visionx68 chips. 16. Fixed wrong colors in the 911/924 15/16bpp acceleration when used for the first time. 17. Match the ViRGE mapping to the pre-ViRGE one per manual/datasheet. 18. Correct as best as possible the TGUI9400 clocks. --- src/include/86box/vid_svga.h | 5 +- src/include/86box/video.h | 24 +- src/video/clockgen/vid_clockgen_ics2494.c | 35 +- src/video/ramdac/vid_ramdac_att20c49x.c | 8 +- src/video/ramdac/vid_ramdac_att2xc498.c | 6 +- src/video/ramdac/vid_ramdac_bt48x.c | 7 +- src/video/ramdac/vid_ramdac_sdac.c | 14 +- src/video/ramdac/vid_ramdac_stg1702.c | 47 +- src/video/ramdac/vid_ramdac_tvp3026.c | 51 +- src/video/vid_ati_mach64.c | 1 + src/video/vid_cl54xx.c | 61 +- src/video/vid_et4000w32.c | 698 ++++---- src/video/vid_s3.c | 1879 +++++++++++++++------ src/video/vid_s3_virge.c | 120 +- src/video/vid_table.c | 24 +- src/video/vid_tgui9440.c | 26 +- 16 files changed, 2072 insertions(+), 934 deletions(-) diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index 61a5697d5..e0ae5ed6f 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -474,6 +474,7 @@ extern uint8_t sc1502x_rs2_ramdac_in(uint16_t addr, int rs2, void *priv, svga_t extern void sdac_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *priv, svga_t *svga); extern uint8_t sdac_ramdac_in(uint16_t addr, int rs2, void *priv, svga_t *svga); extern float sdac_getclock(int clock, void *priv); +extern void sdac_set_ref_clock(void *priv, float ref_clock); extern void stg_ramdac_out(uint16_t addr, uint8_t val, void *priv, svga_t *svga); extern uint8_t stg_ramdac_in(uint16_t addr, void *priv, svga_t *svga); @@ -507,6 +508,7 @@ extern const device_t bt485a_ramdac_device; extern const device_t gendac_ramdac_device; extern const device_t ibm_rgb528_ramdac_device; extern const device_t ics2494an_305_device; +extern const device_t ics2494an_324_device; extern const device_t ati18810_28800_device; extern const device_t ati18811_0_28800_device; extern const device_t ati18811_1_28800_device; @@ -523,7 +525,8 @@ extern const device_t sc11484_nors2_ramdac_device; extern const device_t sc1502x_ramdac_device; extern const device_t sc1502x_rs2_ramdac_device; extern const device_t sdac_ramdac_device; -extern const device_t stg_ramdac_device; +extern const device_t stg1702_ramdac_device; +extern const device_t stg1703_ramdac_device; extern const device_t tkd8001_ramdac_device; extern const device_t tseng_ics5301_ramdac_device; extern const device_t tseng_ics5341_ramdac_device; diff --git a/src/include/86box/video.h b/src/include/86box/video.h index 840b95249..acaf7cdc4 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -436,20 +436,20 @@ extern const device_t et4000_kasan_isa_device; extern const device_t et4000_mca_device; /* Tseng ET4000-W32x */ -extern const device_t et4000w32_device; +extern const device_t et4000w32_machspeed_vga_gui_2400s_isa_device; +extern const device_t et4000w32_machspeed_vga_gui_2400s_vlb_device; extern const device_t et4000w32_onboard_device; -extern const device_t et4000w32i_isa_device; -extern const device_t et4000w32i_vlb_device; +extern const device_t et4000w32i_axis_microdevice_isa_device; +extern const device_t et4000w32i_hercules_dynamite_pro_vlb_device; extern const device_t et4000w32p_videomagic_revb_vlb_device; -extern const device_t et4000w32p_videomagic_revb_pci_device; -extern const device_t et4000w32p_revc_vlb_device; -extern const device_t et4000w32p_revc_pci_device; -extern const device_t et4000w32p_vlb_device; -extern const device_t et4000w32p_pci_device; -extern const device_t et4000w32p_noncardex_vlb_device; -extern const device_t et4000w32p_noncardex_pci_device; -extern const device_t et4000w32p_cardex_vlb_device; -extern const device_t et4000w32p_cardex_pci_device; +extern const device_t et4000w32p_cardex_revc_vlb_device; +extern const device_t et4000w32p_cardex_revc_pci_device; +extern const device_t et4000w32p_cardex_revd_vlb_device; +extern const device_t et4000w32p_cardex_revd_pci_device; +extern const device_t et4000w32p_diamond_revd_vlb_device; +extern const device_t et4000w32p_diamond_revd_pci_device; +extern const device_t et4000w32p_generic_revd_vlb_device; +extern const device_t et4000w32p_generic_revd_pci_device; /* MDSI Genius VHR */ extern const device_t genius_device; diff --git a/src/video/clockgen/vid_clockgen_ics2494.c b/src/video/clockgen/vid_clockgen_ics2494.c index f9f4fbcb1..0776d97ca 100644 --- a/src/video/clockgen/vid_clockgen_ics2494.c +++ b/src/video/clockgen/vid_clockgen_ics2494.c @@ -290,7 +290,7 @@ ics2494_init(const device_t *info) ics2494->freq[15] = 65000000.0; break; case 305: - /* ICS2494A(N)-205 for S3 86C924 */ + /* ICS2494A(N)-305 for S3 86C924 */ ics2494->freq[0x0] = 25175000.0; ics2494->freq[0x1] = 28322000.0; ics2494->freq[0x2] = 40000000.0; @@ -308,6 +308,25 @@ ics2494_init(const device_t *info) ics2494->freq[0xe] = 75000000.0; ics2494->freq[0xf] = 94500000.0; break; + case 324: + /* ICS2494A(N)-324 for Tseng ET4000/W32 series */ + ics2494->freq[0x0] = 50000000.0; + ics2494->freq[0x1] = 56644000.0; + ics2494->freq[0x2] = 65000000.0; + ics2494->freq[0x3] = 72000000.0; + ics2494->freq[0x4] = 80000000.0; + ics2494->freq[0x5] = 89800000.0; + ics2494->freq[0x6] = 63000000.0; + ics2494->freq[0x7] = 75000000.0; + ics2494->freq[0x8] = 83078000.0; + ics2494->freq[0x9] = 93463000.0; + ics2494->freq[0xa] = 100000000.0; + ics2494->freq[0xb] = 104000000.0; + ics2494->freq[0xc] = 108000000.0; + ics2494->freq[0xd] = 120000000.0; + ics2494->freq[0xe] = 130000000.0; + ics2494->freq[0xf] = 134700000.0; + break; default: break; @@ -339,6 +358,20 @@ const device_t ics2494an_305_device = { .config = NULL }; +const device_t ics2494an_324_device = { + .name = "ICS2494AN-324 Clock Generator", + .internal_name = "ics2494an_324", + .flags = 0, + .local = 324, + .init = ics2494_init, + .close = ics2494_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t ati18810_28800_device = { .name = "ATI 18810 (ATI 28800) Clock Generator", .internal_name = "ati18810_28800", diff --git a/src/video/ramdac/vid_ramdac_att20c49x.c b/src/video/ramdac/vid_ramdac_att20c49x.c index 2d8d6a304..3776e6616 100644 --- a/src/video/ramdac/vid_ramdac_att20c49x.c +++ b/src/video/ramdac/vid_ramdac_att20c49x.c @@ -42,12 +42,6 @@ att49x_ramdac_control(uint8_t val, void *priv, svga_t *svga) att49x_ramdac_t *ramdac = (att49x_ramdac_t *) priv; ramdac->ctrl = val; switch ((ramdac->ctrl >> 5) & 7) { - case 0: - case 1: - case 2: - case 3: - svga->bpp = 8; - break; case 4: case 5: svga->bpp = 15; @@ -60,10 +54,12 @@ att49x_ramdac_control(uint8_t val, void *priv, svga_t *svga) break; default: + svga->bpp = 8; break; } if (ramdac->type == ATT_490 || ramdac->type == ATT_491) svga_set_ramdac_type(svga, (val & 2) ? RAMDAC_8BIT : RAMDAC_6BIT); + svga_recalctimings(svga); } diff --git a/src/video/ramdac/vid_ramdac_att2xc498.c b/src/video/ramdac/vid_ramdac_att2xc498.c index 141ffa4b4..21c6770a3 100644 --- a/src/video/ramdac/vid_ramdac_att2xc498.c +++ b/src/video/ramdac/vid_ramdac_att2xc498.c @@ -45,7 +45,7 @@ att498_ramdac_control(uint8_t val, void *priv, svga_t *svga) svga->bpp = 8; break; case 1: - if (ramdac->ctrl & 4) + if (ramdac->ctrl & 0x04) svga->bpp = 15; else svga->bpp = 8; @@ -63,7 +63,7 @@ att498_ramdac_control(uint8_t val, void *priv, svga_t *svga) break; } - svga_set_ramdac_type(svga, (ramdac->ctrl & 2) ? RAMDAC_8BIT : RAMDAC_6BIT); + svga_set_ramdac_type(svga, (ramdac->ctrl & 0x02) ? RAMDAC_8BIT : RAMDAC_6BIT); svga_recalctimings(svga); } @@ -132,7 +132,7 @@ att498_ramdac_in(uint16_t addr, int rs2, void *priv, svga_t *svga) ramdac->state++; break; case 6: - temp = ramdac->ctrl; + temp = 0x98; ramdac->state = 0; break; default: diff --git a/src/video/ramdac/vid_ramdac_bt48x.c b/src/video/ramdac/vid_ramdac_bt48x.c index be6499990..64bc2b5b7 100644 --- a/src/video/ramdac/vid_ramdac_bt48x.c +++ b/src/video/ramdac/vid_ramdac_bt48x.c @@ -366,15 +366,14 @@ bt48x_recalctimings(void *priv, svga_t *svga) svga->clock_multiplier = 0; svga->multiplexing_rate = 0; svga->true_color_bypass = 0; - if (ramdac->cmd_r3 & 0x08) { /* x2 clock multiplier */ - //pclog("2x multiplier.\n"); + if (ramdac->cmd_r3 & 0x08) /* x2 clock multiplier */ svga->clock_multiplier = 1; - } + svga->multiplexing_rate = (ramdac->cmd_r1 & 0x60) >> 5; if (svga->bpp >= 15) svga->true_color_bypass = !!(ramdac->cmd_r1 & 0x10); - //pclog("CR0=%02x, CR1=%02x, CR2=%02x.\n", ramdac->cmd_r0, ramdac->cmd_r1, ramdac->cmd_r2); + pclog("CR0=%02x, CR1=%02x, CR2=%02x.\n", ramdac->cmd_r0, ramdac->cmd_r1, ramdac->cmd_r2); } void diff --git a/src/video/ramdac/vid_ramdac_sdac.c b/src/video/ramdac/vid_ramdac_sdac.c index 2b2890307..a88cdcaef 100644 --- a/src/video/ramdac/vid_ramdac_sdac.c +++ b/src/video/ramdac/vid_ramdac_sdac.c @@ -49,6 +49,7 @@ typedef struct sdac_ramdac_t { int rs2; uint8_t type; uint8_t command; + float ref_clock; } sdac_ramdac_t; static void @@ -275,11 +276,21 @@ sdac_getclock(int clock, void *priv) n1 = ((ramdac->regs[clock] >> 8) & 0x1f) + 2; n2 = ((ramdac->regs[clock] >> 13) & 0x07); n2 = (1 << n2); - t = (14318184.0f * (float) m) / (float) (n1 * n2); + t = (ramdac->ref_clock * (float) m) / (float) (n1 * n2); + //pclog("SDACClock=%d, regs val=%04x.\n", clock, ramdac->regs[clock]); return t; } +void +sdac_set_ref_clock(void *priv, float ref_clock) +{ + sdac_ramdac_t *ramdac = (sdac_ramdac_t *) priv; + + if (ramdac != NULL) + ramdac->ref_clock = ref_clock; +} + void * sdac_ramdac_init(const device_t *info) { @@ -288,6 +299,7 @@ sdac_ramdac_init(const device_t *info) ramdac->type = info->local; + ramdac->ref_clock = 14318184.0f; ramdac->regs[0] = 0x6128; ramdac->regs[1] = 0x623d; diff --git a/src/video/ramdac/vid_ramdac_stg1702.c b/src/video/ramdac/vid_ramdac_stg1702.c index 8a2d008dd..6c0945704 100644 --- a/src/video/ramdac/vid_ramdac_stg1702.c +++ b/src/video/ramdac/vid_ramdac_stg1702.c @@ -31,6 +31,7 @@ typedef struct stg_ramdac_t { int magic_count, index; uint8_t regs[256]; uint8_t command; + int type; } stg_ramdac_t; static int stg_state_read[2][8] = { @@ -46,6 +47,8 @@ stg_ramdac_set_bpp(svga_t *svga, stg_ramdac_t *ramdac) switch (ramdac->regs[3]) { default: case 0: + svga->bpp = 8; + break; case 5: case 7: svga->bpp = 8; @@ -176,7 +179,7 @@ stg_ramdac_in(uint16_t addr, void *priv, svga_t *svga) temp = 0x44; break; case 1: - temp = 0x03; + temp = ramdac->type; break; case 7: temp = 0x88; @@ -216,22 +219,24 @@ stg_getclock(int clock, void *priv) float t; int m; int n; - int n2; - const uint16_t *c; + int d; + int d2; + uint16_t c; if (clock == 0) return 25175000.0; if (clock == 1) return 28322000.0; - clock ^= 1; /*Clocks 2 and 3 seem to be reversed*/ - c = (uint16_t *) &ramdac->regs[0x20 + (clock << 1)]; - m = (*c & 0xff) + 2; /* B+2 */ - n = ((*c >> 8) & 0x1f) + 2; /* N1+2 */ - n2 = ((*c >> 13) & 0x07); /* D */ - n2 = (1 << n2); - t = (14318184.0f * (float) m) / (float) (n * n2); + c = ramdac->regs[0x20 + (clock << 1)]; + c |= (ramdac->regs[0x21 + (clock << 1)] << 8); + m = (c & 0xff) + 2; /* B+2 */ + n = ((c >> 8) & 0x1f) + 2; /* N1+2 */ + d = ((c >> 13) & 0x07); /* D */ + d2 = (1 << d); + t = (14318184.0f * (float) m) / (float) (n * d2); + //pclog("RAMDAC vclk val=0x%02x, vclk v=%d low, D=%d, t=%f.\n", ramdac->regs[0x20 + (clock << 1)], clock, d2, t); return t; } @@ -241,6 +246,8 @@ stg_ramdac_init(UNUSED(const device_t *info)) stg_ramdac_t *ramdac = (stg_ramdac_t *) malloc(sizeof(stg_ramdac_t)); memset(ramdac, 0, sizeof(stg_ramdac_t)); + ramdac->type = info->local & 0xff; + return ramdac; } @@ -253,11 +260,25 @@ stg_ramdac_close(void *priv) free(ramdac); } -const device_t stg_ramdac_device = { - .name = "SGS-Thompson STG170x RAMDAC", +const device_t stg1702_ramdac_device = { + .name = "SGS-Thompson STG1702 RAMDAC", .internal_name = "stg_ramdac", .flags = 0, - .local = 0, + .local = 2, + .init = stg_ramdac_init, + .close = stg_ramdac_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t stg1703_ramdac_device = { + .name = "SGS-Thompson STG1703 RAMDAC", + .internal_name = "stg_ramdac", + .flags = 0, + .local = 3, .init = stg_ramdac_init, .close = stg_ramdac_close, .reset = NULL, diff --git a/src/video/ramdac/vid_ramdac_tvp3026.c b/src/video/ramdac/vid_ramdac_tvp3026.c index 1958fa588..73af99075 100644 --- a/src/video/ramdac/vid_ramdac_tvp3026.c +++ b/src/video/ramdac/vid_ramdac_tvp3026.c @@ -9,7 +9,6 @@ * Emulation of the Texas Instruments TVP3026 true colour RAMDAC * family. * - * TODO: Clock and other parts. * * Authors: TheCollector1995, * @@ -49,6 +48,7 @@ typedef struct tvp3026_ramdac_t { uint8_t mode; uint8_t pll_addr; uint8_t clock_sel; + uint8_t color_key_ctrl; struct { uint8_t m; uint8_t n; @@ -171,25 +171,24 @@ tvp3026_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *priv, svg svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; svga->dac_hwcursor.ena = !!(val & 0x03); ramdac->mode = val & 0x03; + //pclog("0x09: DACEna=%02x, MainEna=%02x.\n", svga->dac_hwcursor.ena, svga->hwcursor.ena); } break; case 0x0a: /* Indexed Data (RS value = 1010) */ switch (ramdac->ind_idx) { case 0x06: /* Indirect Cursor Control */ ramdac->ccr = val; + svga->dac_hwcursor.cur_xsize = svga->dac_hwcursor.cur_ysize = 64; + svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.cur_xsize; + svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; if (!(ramdac->ccr & 0x80)) { - svga->dac_hwcursor.cur_xsize = svga->dac_hwcursor.cur_ysize = 64; - svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.cur_xsize; - svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; svga->dac_hwcursor.ena = !!(val & 0x03); ramdac->mode = val & 0x03; } else { - svga->dac_hwcursor.cur_xsize = svga->dac_hwcursor.cur_ysize = 64; - svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.cur_xsize; - svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; svga->dac_hwcursor.ena = !!(ramdac->dcc & 0x03); ramdac->mode = ramdac->dcc & 0x03; } + //pclog("0x0a, indirect 0x06: DACEna=%02x, MainEna=%02x.\n", svga->dac_hwcursor.ena, svga->hwcursor.ena); break; case 0x0f: /* Latch Control */ ramdac->latch_cntl = val; @@ -279,6 +278,9 @@ tvp3026_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *priv, svg } ramdac->pll_addr = ((ramdac->pll_addr + 0x10) & 0x30) | (ramdac->pll_addr & 0xcf); break; + case 0x38: /* Color-Key Control */ + ramdac->color_key_ctrl = val; + break; case 0x39: /* MCLK/Loop Clock Control */ ramdac->mclk = val; break; @@ -470,6 +472,9 @@ tvp3026_ramdac_in(uint16_t addr, int rs2, int rs3, void *priv, svga_t *svga) break; } break; + case 0x38: /* Color-Key Control */ + temp = ramdac->color_key_ctrl; + break; case 0x39: /* MCLK/Loop Clock Control */ temp = ramdac->mclk; break; @@ -516,11 +521,39 @@ tvp3026_recalctimings(void *priv, svga_t *svga) svga->interlace = !!(ramdac->ccr & 0x40); /* TODO: Figure out gamma correction for 15/16 bpp color. */ svga->lut_map = !!((svga->bpp >= 15 && (svga->bpp != 24)) && (ramdac->true_color & 0xf0) != 0x00); + svga->clock_multiplier = 0; + + //pclog("RAMDAC CLOCKSEL=%02x, MCR=%02x, LoopMCLK=%02x, Latch=%02x.\n", ramdac->clock_sel, ramdac->mcr, ramdac->mclk, ramdac->latch_cntl); if (!(ramdac->clock_sel & 0x70)) { if (ramdac->mcr != 0x98) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; + switch ((ramdac->clock_sel >> 4) & 7) { + case 0: + svga->clock_multiplier = 1; + break; + case 1: + svga->clock_multiplier = 2; + break; + case 2: + svga->clock_multiplier = 4; + break; + case 3: + svga->clock_multiplier = 8; + break; + case 4: + svga->clock_multiplier = 16; + break; + case 5: + svga->clock_multiplier = 32; + break; + case 6: + svga->clock_multiplier = 64; + break; + case 7: + default: + svga->clock_multiplier = 0; + break; + } } } } diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index bd65a1376..95a32dabe 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -547,6 +547,7 @@ mach64_recalctimings(svga_t *svga) svga->rowcount = mach64->crtc_gen_cntl & 1; svga->lut_map = (mach64->type >= MACH64_VT); svga->rowoffset <<= 1; + svga->attrregs[0x13] &= ~0x0f; if (mach64->type == MACH64_GX) ati68860_ramdac_set_render(svga->ramdac, svga); diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index abdde1622..95f9e7bf6 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -1824,6 +1824,9 @@ gd54xx_recalctimings(svga_t *svga) uint8_t clocksel; uint8_t rdmask; uint8_t linedbl = svga->dispend * 9 / 10 >= svga->hdisp; + uint8_t m = 0; + int d = 0; + int n = 0; svga->hblankstart = svga->crtc[2]; @@ -1865,6 +1868,34 @@ gd54xx_recalctimings(svga_t *svga) svga->interlace = 0; } + clocksel = (svga->miscout >> 2) & 3; + + if (!gd54xx->vclk_n[clocksel] || !gd54xx->vclk_d[clocksel]) + svga->clock = (cpuclock * (float) (1ULL << 32)) / + ((svga->miscout & 0xc) ? 28322000.0 : 25175000.0); + else { + n = gd54xx->vclk_n[clocksel] & 0x7f; + d = (gd54xx->vclk_d[clocksel] & 0x3e) >> 1; + m = gd54xx->vclk_d[clocksel] & 0x01 ? 2 : 1; + float freq = (14318184.0F * ((float) n / ((float) d * m))); + if (gd54xx_is_5422(svga)) { + switch (svga->seqregs[0x07] & (gd54xx_is_5434(svga) ? 0xe : 6)) { + case 2: + freq /= 2.0F; + break; + case 4: + if (!gd54xx_is_5434(svga)) + freq /= 3.0F; + break; + + default: + break; + } + } + svga->clock = (cpuclock * (double) (1ULL << 32)) / freq; + } + + svga->bpp = 8; svga->map8 = svga->pallook; if (svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA) { if (linedbl) @@ -1874,6 +1905,7 @@ gd54xx_recalctimings(svga_t *svga) if ((svga->dispend == 512) && !svga->interlace && gd54xx_is_5434(svga)) { svga->hdisp <<= 1; svga->dots_per_clock <<= 1; + svga->clock *= 2.0; } } } else if (svga->gdcreg[5] & 0x40) @@ -1881,8 +1913,6 @@ gd54xx_recalctimings(svga_t *svga) svga->memaddr_latch |= ((svga->crtc[0x1b] & 0x01) << 16) | ((svga->crtc[0x1b] & 0xc) << 15); - svga->bpp = 8; - if (gd54xx->ramdac.ctrl & 0x80) { if (gd54xx->ramdac.ctrl & 0x40) { if ((svga->crtc[0x27] >= CIRRUS_ID_CLGD5428) || (svga->crtc[0x27] == CIRRUS_ID_CLGD5426)) @@ -2023,33 +2053,6 @@ gd54xx_recalctimings(svga_t *svga) } } - clocksel = (svga->miscout >> 2) & 3; - - if (!gd54xx->vclk_n[clocksel] || !gd54xx->vclk_d[clocksel]) - svga->clock = (cpuclock * (float) (1ULL << 32)) / - ((svga->miscout & 0xc) ? 28322000.0 : 25175000.0); - else { - int n = gd54xx->vclk_n[clocksel] & 0x7f; - int d = (gd54xx->vclk_d[clocksel] & 0x3e) >> 1; - uint8_t m = gd54xx->vclk_d[clocksel] & 0x01 ? 2 : 1; - float freq = (14318184.0F * ((float) n / ((float) d * m))); - if (gd54xx_is_5422(svga)) { - switch (svga->seqregs[0x07] & (gd54xx_is_5434(svga) ? 0xe : 6)) { - case 2: - freq /= 2.0F; - break; - case 4: - if (!gd54xx_is_5434(svga)) - freq /= 3.0F; - break; - - default: - break; - } - } - svga->clock = (cpuclock * (double) (1ULL << 32)) / freq; - } - svga->vram_display_mask = (svga->crtc[0x1b] & 2) ? gd54xx->vram_mask : 0x3ffff; if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5430) diff --git a/src/video/vid_et4000w32.c b/src/video/vid_et4000w32.c index 05de0dbea..4b95ba04e 100644 --- a/src/video/vid_et4000w32.c +++ b/src/video/vid_et4000w32.c @@ -10,6 +10,8 @@ * * Known bugs: Accelerator doesn't work in planar modes * + * + * * Authors: Sarah Walker, * Miran Grca, * @@ -35,30 +37,46 @@ #include <86box/vid_svga.h> #include <86box/vid_svga_render.h> -#define BIOS_ROM_PATH_DIAMOND "roms/video/et4000w32/et4000w32.bin" -#define BIOS_ROM_PATH_CARDEX "roms/video/et4000w32/cardex.vbi" -#define BIOS_ROM_PATH_W32 "roms/video/et4000w32/ET4000W32VLB_bios_MX27C512.BIN" -#define BIOS_ROM_PATH_W32I_ISA "roms/video/et4000w32/ET4KW32I.VBI" -#define BIOS_ROM_PATH_W32I_VLB "roms/video/et4000w32/tseng.u41.bin" -#define BIOS_ROM_PATH_W32P_VIDEOMAGIC_REVB_VLB "roms/video/et4000w32/VideoMagic-BioS-HXIRTW32PWSRL.bin" -#define BIOS_ROM_PATH_W32P "roms/video/et4000w32/ET4K_W32.BIN" -#define BIOS_ROM_PATH_W32P_REVC "roms/video/et4000w32/et4000w32pcardex.BIN" +#define BIOS_ROM_PATH_W32_MACHSPEED_VGA_GUI_2400S "roms/video/et4000w32/ET4000W32VLB_bios_MX27C512.BIN" +#define BIOS_ROM_PATH_W32I_REVB_AXIS_MICRODEVICE "roms/video/et4000w32/ET4KW32I.VBI" +#define BIOS_ROM_PATH_W32I_REVB_HERCULES_DYNAMITE_VLB_PRO "roms/video/et4000w32/Hercules Dynamite VL Pro v8.00 c 1993 Hercules.bin" +#define BIOS_ROM_PATH_W32P_REVB_VIDEOMAGIC "roms/video/et4000w32/VideoMagic-BioS-HXIRTW32PWSRL.bin" +#define BIOS_ROM_PATH_W32P_REVC_CARDEX "roms/video/et4000w32/et4000w32pcardex.BIN" +#define BIOS_ROM_PATH_W32P_REVD "roms/video/et4000w32/ET4K_W32.BIN" +#define BIOS_ROM_PATH_W32P_REVD_CARDEX "roms/video/et4000w32/cardex.vbi" +#define BIOS_ROM_PATH_W32P_REVD_DIAMOND "roms/video/et4000w32/et4000w32.bin" #define ACL_WRST 1 #define ACL_RDST 2 #define ACL_XYST 4 #define ACL_SSO 8 +typedef enum { + ET4000W32 = 0, + ET4000W32I_REVB = 3, + ET4000W32P_REVB = 5, + ET4000W32P_REVC = 7, + ET4000W32P_REVD = 6 +} et4000w32_chip_type; + enum { - ET4000W32, - ET4000W32I, - ET4000W32P_REVC, - ET4000W32P_VIDEOMAGIC_REVB, - ET4000W32P, - ET4000W32P_CARDEX, - ET4000W32P_DIAMOND + MACHSPEED_VGA_GUI_2400S = 0, + AXIS_MICRODEVICE_ET4W32_5, + HERCULES_DYNAMITE_PRO_VLB, + VIDEOMAGIC_ETW32PVS, + CARDEX_REVC, + GENERIC_REVD, + CARDEX_REVD, + DIAMOND_STEALTH_32 }; +typedef enum { + BUILT_IN = 0, + ATT49X, + STG170X, + ET4K_SDAC +} et4000w32_ramdac_type; + typedef struct et4000w32p_t { mem_mapping_t linear_mapping; mem_mapping_t mmu_mapping; @@ -68,15 +86,21 @@ typedef struct et4000w32p_t { svga_t svga; uint8_t banking, banking2, adjust_cursor, rev, pci_slot; + uint8_t adjust_cursor_x; uint8_t regs[256], pci_regs[256]; int index, vlb, pci, interleaved, - bank, type; + bank; + int vram_size; uint32_t linearbase; uint32_t vram_mask; + int card_type; + et4000w32_chip_type chip_type; + et4000w32_ramdac_type ramdac_type; + /* Accelerator */ struct { struct { @@ -135,6 +159,7 @@ static void et4000w32_blit_start(et4000w32p_t *et4000); static void et4000w32p_blit_start(et4000w32p_t *et4000); static void et4000w32_blit(int count, int cpu_input, uint32_t src_dat, uint32_t mix_dat, et4000w32p_t *et4000); static void et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32p_t *et4000); +void et4000w32p_out(uint16_t addr, uint8_t val, void *priv); uint8_t et4000w32p_in(uint16_t addr, void *priv); #ifdef ENABLE_ET4000W32_LOG @@ -168,18 +193,28 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) switch (addr) { case 0x3c2: - if (et4000->type == ET4000W32P_DIAMOND) - icd2061_write(svga->clock_gen, (val >> 2) & 3); + if (svga->getclock == icd2061_getclock) + icd2061_write(svga->clock_gen, ((val >> 2) & 0x03) | ((svga->crtc[0x34] << 1) & 0x04)| ((svga->crtc[0x31] >> 3) & 0x08)); break; case 0x3c6: case 0x3c7: case 0x3c8: case 0x3c9: - if (et4000->type <= ET4000W32P_REVC) - sdac_ramdac_out(addr, 0, val, svga->ramdac, svga); - else - stg_ramdac_out(addr, val, svga->ramdac, svga); + switch (et4000->ramdac_type) { + case ATT49X: + att49x_ramdac_out(addr, !!(svga->crtc[0x31] & 0x40), val, svga->ramdac, svga); + break; + case STG170X: + stg_ramdac_out(addr, val, svga->ramdac, svga); + break; + case ET4K_SDAC: + sdac_ramdac_out(addr, !!(svga->crtc[0x31] & 0x40), val, svga->ramdac, svga); + break; + default: + svga_out(addr, val, svga); + break; + } return; case 0x3cb: /* Banking extension */ @@ -244,13 +279,13 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) } } if (svga->crtcreg == 0x30) { - if (et4000->pci && (et4000->rev != 5)) + if (et4000->pci && (et4000->rev != ET4000W32P_REVB)) et4000->linearbase = (et4000->linearbase & 0xc0000000) | ((val & 0xfc) << 22); else et4000->linearbase = val << 22; et4000w32p_recalcmapping(et4000); } - if (svga->crtcreg == 0x32 || svga->crtcreg == 0x36) + if ((svga->crtcreg == 0x32) || (svga->crtcreg == 0x36)) et4000w32p_recalcmapping(et4000); break; @@ -264,6 +299,7 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) case 0x217a: et4000->index = val; return; + case 0x210b: case 0x211b: case 0x212b: @@ -278,18 +314,29 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) svga->hwcursor.ena = !!(et4000->regs[0xF7] & 0x80); svga->hwcursor.xoff = et4000->regs[0xE2]; svga->hwcursor.yoff = et4000->regs[0xE6]; - svga->hwcursor.cur_xsize = svga->hwcursor.cur_ysize = ((et4000->regs[0xEF] & 4) || ((et4000->type == ET4000W32) && (et4000->regs[0xe2] >= 0x1f) && (et4000->regs[0xe6] >= 0x1f))) ? 128 : 64; + svga->hwcursor.cur_xsize = svga->hwcursor.cur_ysize = ((et4000->regs[0xEF] & 4) || ((et4000->rev == ET4000W32) && (et4000->regs[0xe2] >= 0x1f) && (et4000->regs[0xe6] >= 0x1f))) ? 128 : 64; - if (et4000->type == ET4000W32) { + if (et4000->rev == ET4000W32) { if ((svga->bpp == 15) || (svga->bpp == 16)) { svga->hwcursor.cur_xsize = svga->hwcursor.cur_ysize = 128; + if (et4000->adjust_cursor_x == 1) + svga->hwcursor.x += 0x100; + else if (et4000->adjust_cursor_x == 2) + svga->hwcursor.x += 8; + } + } else if (et4000->rev == ET4000W32I_REVB) { + if (((svga->bpp == 15) || (svga->bpp == 16))) { + if (et4000->adjust_cursor_x == 1) + svga->hwcursor.x += 0x100; + else if (et4000->adjust_cursor_x == 2) + svga->hwcursor.x += 8; } } - if ((et4000->type == ET4000W32) && (svga->hwcursor.cur_xsize == 128)) { + if ((et4000->rev == ET4000W32) && (svga->hwcursor.cur_xsize == 128)) { switch (svga->bpp) { case 8: - svga->hwcursor.xoff += 32; + svga->hwcursor.xoff += 0x20; break; default: @@ -300,16 +347,14 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) if (svga->hwcursor.cur_xsize == 128) { svga->hwcursor.xoff &= 0x7f; svga->hwcursor.yoff &= 0x7f; - if (et4000->type > ET4000W32P_REVC) { - if (svga->bpp == 24) { + if ((et4000->rev > ET4000W32P_REVC) || (et4000->rev == ET4000W32P_REVB)) { + if (svga->bpp == 24) et4000->adjust_cursor = 2; - } } } else { - if (et4000->type > ET4000W32P_REVC) { - if ((svga->bpp == 24) && et4000->adjust_cursor) { + if ((et4000->rev > ET4000W32P_REVC) || (et4000->rev == ET4000W32P_REVB)) { + if ((svga->bpp == 24) && et4000->adjust_cursor) et4000->adjust_cursor = 0; - } } svga->hwcursor.xoff &= 0x3f; svga->hwcursor.yoff &= 0x3f; @@ -332,6 +377,7 @@ et4000w32p_in(uint16_t addr, void *priv) { et4000w32p_t *et4000 = (et4000w32p_t *) priv; svga_t *svga = &et4000->svga; + uint8_t temp = 0x00; if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) addr ^= 0x60; @@ -346,10 +392,17 @@ et4000w32p_in(uint16_t addr, void *priv) case 0x3c7: case 0x3c8: case 0x3c9: - if (et4000->type <= ET4000W32P_REVC) - return sdac_ramdac_in(addr, 0, svga->ramdac, svga); - else - return stg_ramdac_in(addr, svga->ramdac, svga); + switch (et4000->ramdac_type) { + case ATT49X: + return att49x_ramdac_in(addr, !!(svga->crtc[0x31] & 0x40), svga->ramdac, svga); + case STG170X: + return stg_ramdac_in(addr, svga->ramdac, svga); + case ET4K_SDAC: + return sdac_ramdac_in(addr, !!(svga->crtc[0x31] & 0x40), svga->ramdac, svga); + default: + return svga_in(addr, svga); + } + break; case 0x3cb: return et4000->banking2; @@ -358,9 +411,22 @@ et4000w32p_in(uint16_t addr, void *priv) case 0x3d4: return svga->crtcreg; case 0x3d5: - if (et4000->type == ET4000W32) { - if (svga->crtcreg == 0x37) - return 0x09; + if ((et4000->card_type == MACHSPEED_VGA_GUI_2400S) || + (et4000->card_type == AXIS_MICRODEVICE_ET4W32_5)) { + if (svga->crtcreg == 0x37) { + temp = svga->crtc[0x37]; + temp &= ~0x09; + switch (et4000->vram_size) { + case 1: + temp |= 0x09; + break; + case 2: + break; + default: + break; + } + return temp; + } } return svga->crtc[svga->crtcreg]; @@ -368,15 +434,18 @@ et4000w32p_in(uint16_t addr, void *priv) uint8_t ret = 0xff; svga->attrff = 0; - /*Bit 1 of the Input Status Register is required by the OS/2 and NT ET4000W32/I drivers to be set otherwise - the guest will loop infinitely upon reaching the GUI*/ if (svga->cgastat & 0x01) - svga->cgastat &= ~0x32; + svga->cgastat &= ~0x30; else - svga->cgastat ^= 0x32; + svga->cgastat ^= 0x30; ret = svga->cgastat; + /*Bit 1 of the Input Status Register is required by the OS/2 and NT ET4000W32/I drivers to be set otherwise + the guest will loop infinitely upon reaching the GUI*/ + if (svga->hdisp_on) + ret |= 0x02; + if ((svga->fcr & 0x08) && svga->dispon) ret |= 0x08; @@ -396,17 +465,18 @@ et4000w32p_in(uint16_t addr, void *priv) case 0x216a: case 0x217a: return et4000->index; - case 0x210B: - case 0x211B: - case 0x212B: - case 0x213B: - case 0x214B: - case 0x215B: - case 0x216B: - case 0x217B: - if (et4000->index == 0xec) { + + case 0x210b: + case 0x211b: + case 0x212b: + case 0x213b: + case 0x214b: + case 0x215b: + case 0x216b: + case 0x217b: + if (et4000->index == 0xec) return (et4000->regs[0xec] & 0xf) | (et4000->rev << 4); - } + if (et4000->index == 0xee) { if (svga->bpp == 8) { if ((svga->gdcreg[5] & 0x60) >= 0x40) @@ -415,7 +485,7 @@ et4000w32p_in(uint16_t addr, void *priv) return 1; else return 2; - } else if (svga->bpp == 15 || svga->bpp == 16) + } else if ((svga->bpp == 15) || (svga->bpp == 16)) return 4; else break; @@ -439,6 +509,7 @@ void et4000w32p_recalctimings(svga_t *svga) { et4000w32p_t *et4000 = (et4000w32p_t *) svga->priv; + int clk_sel = ((svga->miscout >> 2) & 0x03) | ((svga->crtc[0x34] << 1) & 0x04)| ((svga->crtc[0x31] >> 3) & 0x08); svga->memaddr_latch |= (svga->crtc[0x33] & 0x7) << 16; @@ -463,36 +534,33 @@ et4000w32p_recalctimings(svga_t *svga) svga->dots_per_clock <<= 1; } - svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock((svga->miscout >> 2) & 3, svga->clock_gen); + et4000->adjust_cursor = 0; + et4000->adjust_cursor_x = 0; - if (et4000->type != ET4000W32P_DIAMOND && et4000->type != ET4000W32P_VIDEOMAGIC_REVB && et4000->type != ET4000W32P_CARDEX && et4000->type != ET4000W32P) { - if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { - if (svga->gdcreg[5] & 0x40) { - switch (svga->bpp) { - case 8: - svga->clock *= 2; - break; - case 15: - case 16: - svga->clock *= 3; - break; - case 24: - svga->clock *= 4; - break; - - default: - break; - } - } + svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clk_sel, svga->clock_gen); + if (svga->getclock == ics2494_getclock) { + if (et4000->card_type == HERCULES_DYNAMITE_PRO_VLB) { + if (clk_sel < 2) + svga->clock *= 2.0; } } - if (et4000->type == ET4000W32) { - if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { - if (svga->gdcreg[5] & 0x40) { + if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { + if (et4000->card_type != HERCULES_DYNAMITE_PRO_VLB) { + if (!(svga->crtc[0x35] & 0x80)) { + if (clk_sel >= 2) { + if (svga->seqregs[7] & 0x01) + svga->clock *= 4.0; + else if (svga->seqregs[7] & 0x40) + svga->clock *= 2.0; + } + } + } + if (svga->gdcreg[5] & 0x40) { + if (et4000->rev == ET4000W32) { switch (svga->bpp) { case 8: - if (svga->hdisp == 640 || svga->hdisp == 800 || svga->hdisp == 1024) + if ((svga->hdisp == 640) || (svga->hdisp == 800) || (svga->hdisp == 1024)) break; svga->hdisp -= 24; break; @@ -501,39 +569,45 @@ et4000w32p_recalctimings(svga_t *svga) break; } } + switch (svga->bpp) { + case 15: + case 16: + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + if (et4000->rev <= ET4000W32P_REVC) { + if (et4000->rev != ET4000W32P_REVB) { + if (et4000->rev == ET4000W32P_REVC) { + if (svga->hdisp != 1024) + et4000->adjust_cursor = 1; + } else { + et4000->adjust_cursor = 1; + if (et4000->rev <= ET4000W32I_REVB) { + if (svga->hdisp == 800) + et4000->adjust_cursor_x = 1; + else if (svga->hdisp == 640) + et4000->adjust_cursor_x = 2; + } + } + } + } + break; + case 24: + svga->hdisp /= 3; + svga->dots_per_clock /= 3; + if (et4000->rev <= ET4000W32P_REVC) { + if (et4000->rev != ET4000W32P_REVB) + et4000->adjust_cursor = 2; + } + if ((et4000->card_type == DIAMOND_STEALTH_32) && ((svga->hdisp == (640 / 2)) || (svga->hdisp == 1232))) + svga->hdisp = 640; + break; + default: + break; + } + //pclog("ClkSel=%d, crtc34 bits 0-1=%02x, crtc31 bits 6-7=%02x, seq7=%02x, interlace=%02x.\n", clk_sel, svga->crtc[0x34] & 0x03, svga->crtc[0x31] & 0xc0, svga->seqregs[7], svga->crtc[0x35] & 0x80); } - } - - et4000->adjust_cursor = 0; - - switch (svga->bpp) { - case 15: - case 16: - if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { - svga->hdisp >>= 1; - svga->dots_per_clock >>= 1; - } - if (et4000->type <= ET4000W32P_REVC) { - if (et4000->type == ET4000W32P_REVC) { - if (svga->hdisp != 1024) - et4000->adjust_cursor = 1; - } else - et4000->adjust_cursor = 1; - } - break; - case 24: - svga->hdisp /= 3; - svga->dots_per_clock /= 3; - if (et4000->type <= ET4000W32P_REVC) - et4000->adjust_cursor = 2; - if ((et4000->type == ET4000W32P_DIAMOND) && ((svga->hdisp == (640 / 2)) || (svga->hdisp == 1232))) { - svga->hdisp = 640; - } - break; - - default: - break; - } + }//else + // pclog("CLOCK translate=%02x, EGA VGA=%02x, clk=%d.\n", svga->crtc[0x34], svga->seqregs[7] & 0x80, clk_sel); svga->render = svga_render_blank; if (!svga->scrblank && svga->attr_palette_enable) { @@ -558,9 +632,7 @@ et4000w32p_recalctimings(svga_t *svga) break; case 0x40: case 0x60: /* 256+ colours */ - if (et4000->type <= ET4000W32P_REVC) - svga->clock /= 2; - + //pclog("BPP=%d.\n", svga->bpp); switch (svga->bpp) { case 8: svga->map8 = svga->pallook; @@ -638,6 +710,7 @@ et4000w32p_recalcmapping(et4000w32p_t *et4000) map |= 4; if (svga->crtc[0x36] & 0x08) map |= 8; + mem_mapping_disable(&et4000->linear_mapping); switch (map) { case 0x0: @@ -742,13 +815,13 @@ et4000w32p_accel_write_fifo(et4000w32p_t *et4000, uint32_t addr, uint8_t val) et4000->acl.queued.dest_off = (et4000->acl.queued.dest_off & 0x00ff) | (val << 8); break; case 0x8e: - if (et4000->type >= ET4000W32P_REVC) + if (et4000->rev >= ET4000W32P_REVB) et4000->acl.queued.pixel_depth = val & 0x30; else et4000->acl.queued.vbus = val & 0x03; break; case 0x8f: - if (et4000->type >= ET4000W32P_REVC) + if (et4000->rev >= ET4000W32P_REVB) et4000->acl.queued.xy_dir = val & 0xb7; else et4000->acl.queued.xy_dir = val & 0x03; @@ -772,7 +845,7 @@ et4000w32p_accel_write_fifo(et4000w32p_t *et4000, uint32_t addr, uint8_t val) et4000->acl.queued.count_y = (et4000->acl.queued.count_y & 0x00ff) | (val << 8); break; case 0x9c: - if (et4000->type >= ET4000W32P_REVC) + if (et4000->rev >= ET4000W32P_REVB) et4000->acl.queued.ctrl_routing = val & 0xdb; else et4000->acl.queued.ctrl_routing = val & 0xb7; @@ -798,14 +871,14 @@ et4000w32p_accel_write_fifo(et4000w32p_t *et4000, uint32_t addr, uint8_t val) case 0xa3: et4000->acl.queued.dest_addr = (et4000->acl.queued.dest_addr & 0x00ffffff) | (val << 24); et4000->acl.internal = et4000->acl.queued; - if (et4000->type >= ET4000W32P_REVC) { + if (et4000->rev >= ET4000W32P_REVB) { et4000w32p_blit_start(et4000); et4000w32_log("Destination Address write and start XY Block, xcnt = %i, ycnt = %i\n", et4000->acl.x_count + 1, et4000->acl.y_count + 1); if (!(et4000->acl.queued.ctrl_routing & 0x43)) { - et4000w32p_blit(0xffffff, ~0, 0, 0, et4000); + et4000w32p_blit(-1, 0xffffffff, 0, 0, et4000); } if ((et4000->acl.queued.ctrl_routing & 0x40) && !(et4000->acl.internal.ctrl_routing & 3)) { - et4000w32p_blit(4, ~0, 0, 0, et4000); + et4000w32p_blit(4, 0xffffffff, 0, 0, et4000); } } else { et4000w32_blit_start(et4000); @@ -862,7 +935,7 @@ et4000w32p_accel_write_fifo(et4000w32p_t *et4000, uint32_t addr, uint8_t val) static void et4000w32p_accel_write_mmu(et4000w32p_t *et4000, uint32_t addr, uint8_t val, uint8_t bank) { - if (et4000->type >= ET4000W32P_REVC) { + if (et4000->rev >= ET4000W32P_REVB) { if (!(et4000->acl.status & ACL_XYST)) { et4000w32_log("XY MMU block not started\n"); return; @@ -872,7 +945,7 @@ et4000w32p_accel_write_mmu(et4000w32p_t *et4000, uint32_t addr, uint8_t val, uin if ((et4000->acl.internal.ctrl_routing & 3) == 2) /*CPU data is Mix data*/ et4000w32p_blit(8 - (et4000->acl.mix_addr & 7), val >> (et4000->acl.mix_addr & 7), 0, 1, et4000); else if ((et4000->acl.internal.ctrl_routing & 3) == 1) /*CPU data is Source data*/ - et4000w32p_blit(1, ~0, val, 2, et4000); + et4000w32p_blit(1, 0xffffffff, val, 2, et4000); } } else { if (!(et4000->acl.status & ACL_XYST)) { @@ -885,9 +958,8 @@ et4000w32p_accel_write_mmu(et4000w32p_t *et4000, uint32_t addr, uint8_t val, uin if (!(et4000->acl.queued.ctrl_routing & 0x37)) { et4000->acl.mmu_start = 1; et4000w32_blit(-1, 0, 0, 0xffffffff, et4000); - } else { + } else et4000->acl.mmu_start = 0; - } } if (et4000->acl.internal.ctrl_routing & 7) { @@ -932,9 +1004,9 @@ et4000w32p_mmu_write(uint32_t addr, uint8_t val, void *priv) case 0x2000: /* MMU 1 */ case 0x4000: /* MMU 2 */ et4000->bank = (addr >> 13) & 3; - if (et4000->mmu.ctrl & (1 << et4000->bank)) { + if (et4000->mmu.ctrl & (1 << et4000->bank)) et4000w32p_accel_write_mmu(et4000, addr & 0x7fff, val, et4000->bank); - } else { + else { if (((addr & 0x1fff) + et4000->mmu.base[et4000->bank]) < svga->vram_max) { svga->vram[((addr & 0x1fff) + et4000->mmu.base[et4000->bank]) & et4000->vram_mask] = val; svga->changedvram[(((addr & 0x1fff) + et4000->mmu.base[et4000->bank]) & et4000->vram_mask) >> 12] = changeframecount; @@ -942,9 +1014,9 @@ et4000w32p_mmu_write(uint32_t addr, uint8_t val, void *priv) } break; case 0x6000: - if ((addr & 0xff) >= 0x80) { + if ((addr & 0xff) >= 0x80) et4000w32p_accel_write_fifo(et4000, addr & 0x7fff, val); - } else { + else { switch (addr & 0xff) { case 0x00: et4000->mmu.base[0] = (et4000->mmu.base[0] & 0xffffff00) | val; @@ -1069,6 +1141,7 @@ et4000w32p_mmu_read(uint32_t addr, void *priv) et4000->acl.fifo_queue = 0; } else et4000->acl.status &= ~ACL_RDST; + return et4000->acl.status; case 0x80: @@ -1100,8 +1173,9 @@ et4000w32p_mmu_read(uint32_t addr, void *priv) case 0x8d: return et4000->acl.internal.dest_off >> 8; case 0x8e: - if (et4000->type >= ET4000W32P_REVC) + if (et4000->rev >= ET4000W32P_REVB) return et4000->acl.internal.pixel_depth; + return et4000->acl.internal.vbus; case 0x8f: return et4000->acl.internal.xy_dir; @@ -1172,9 +1246,9 @@ et4000w32_blit_start(et4000w32p_t *et4000) et4000->acl.pattern_back = et4000->acl.pattern_addr; if (!(et4000->acl.internal.pattern_wrap & 0x40)) { - if ((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) == 0x00) { /*This is to avoid a division by zero crash*/ + if ((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) == 0x00) /*This is to avoid a division by zero crash*/ et4000->acl.pattern_y = (et4000->acl.pattern_addr / (0x7f + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7] - 1); - } else + else et4000->acl.pattern_y = (et4000->acl.pattern_addr / (et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7] - 1); et4000->acl.pattern_back &= ~(((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) * et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7]) - 1); } @@ -1187,9 +1261,9 @@ et4000w32_blit_start(et4000w32p_t *et4000) et4000->acl.source_back = et4000->acl.source_addr; if (!(et4000->acl.internal.source_wrap & 0x40)) { - if ((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) == 0x00) { /*This is to avoid a division by zero crash*/ + if ((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) == 0x00) /*This is to avoid a division by zero crash*/ et4000->acl.source_y = (et4000->acl.source_addr / (0x7f + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7] - 1); - } else + else et4000->acl.source_y = (et4000->acl.source_addr / (et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7] - 1); et4000->acl.source_back &= ~(((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) * et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7]) - 1); } @@ -1265,6 +1339,7 @@ et4000w32p_blit_start(et4000w32p_t *et4000) et4000w32_max_x[2] = (et4000->acl.internal.pixel_depth == 0x20) ? 3 : 4; et4000->acl.internal.count_x += (et4000->acl.internal.pixel_depth >> 4) & 3; + et4000->acl.x_count = et4000->acl.internal.count_x; et4000->acl.cpu_dat_pos = 0; et4000->acl.cpu_dat = 0; @@ -2278,9 +2353,8 @@ et4000w32_blit(int count, int cpu_input, uint32_t src_dat, uint32_t mix_dat, et4 return; } - if (cpu_input) { + if (cpu_input) return; - } } } } @@ -2293,7 +2367,7 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 uint8_t pattern; uint8_t source; uint8_t dest; - uint8_t out; + uint8_t out = 0; uint8_t rop; int mixdat; @@ -2307,14 +2381,15 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 while (count--) { et4000w32_log("%i,%i : ", et4000->acl.internal.pos_x, et4000->acl.internal.pos_y); pattern = svga->vram[(et4000->acl.pattern_addr + et4000->acl.pattern_x) & et4000->vram_mask]; - source = svga->vram[(et4000->acl.source_addr + et4000->acl.source_x) & et4000->vram_mask]; + et4000w32_log("%06X %06X ", (et4000->acl.pattern_addr + et4000->acl.pattern_x) & et4000->vram_mask, (et4000->acl.source_addr + et4000->acl.source_x) & et4000->vram_mask); if (cpu_input == 2) { source = sdat & 0xff; sdat >>= 8; - } + } else + source = svga->vram[(et4000->acl.source_addr + et4000->acl.source_x) & et4000->vram_mask]; + dest = svga->vram[et4000->acl.dest_addr & et4000->vram_mask]; - out = 0; et4000w32_log("%06X ", et4000->acl.dest_addr); if ((et4000->acl.internal.ctrl_routing & 0xa) == 8) { mixdat = svga->vram[(et4000->acl.mix_addr >> 3) & et4000->vram_mask] & (1 << (et4000->acl.mix_addr & 7)); @@ -2416,7 +2491,7 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 } } else { et4000w32_log("BitBLT: count = %i\n", count); - while (count-- && et4000->acl.y_count >= 0) { + while (count-- && (et4000->acl.y_count >= 0)) { pattern = svga->vram[(et4000->acl.pattern_addr + et4000->acl.pattern_x) & et4000->vram_mask]; if (cpu_input == 2) { @@ -2426,8 +2501,6 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 source = svga->vram[(et4000->acl.source_addr + et4000->acl.source_x) & et4000->vram_mask]; dest = svga->vram[et4000->acl.dest_addr & et4000->vram_mask]; - out = 0; - if ((et4000->acl.internal.ctrl_routing & 0xa) == 8) { mixdat = svga->vram[(et4000->acl.mix_addr >> 3) & et4000->vram_mask] & (1 << (et4000->acl.mix_addr & 7)); } else { @@ -2455,6 +2528,8 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 et4000->acl.x_count--; if (et4000->acl.x_count == 0xffff) { + et4000->acl.x_count = et4000->acl.internal.count_x; + if (et4000->acl.internal.xy_dir & 2) { et4000w32_decy(et4000); et4000->acl.mix_back = et4000->acl.mix_addr = et4000->acl.mix_back - (et4000->acl.internal.mix_off + 1); @@ -2469,7 +2544,6 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 et4000->acl.source_x = et4000->acl.source_x_back; et4000->acl.y_count--; - et4000->acl.x_count = et4000->acl.internal.count_x; if (et4000->acl.y_count == 0xffff) { et4000w32_log("BitBLT end\n"); et4000->acl.status &= ~(ACL_XYST | ACL_SSO); @@ -2481,7 +2555,7 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 if (et4000->acl.internal.ctrl_routing & 0x40) { if (et4000->acl.cpu_dat_pos & 3) - et4000->acl.cpu_dat_pos += 4 - (et4000->acl.cpu_dat_pos & 3); + et4000->acl.cpu_dat_pos += (4 - (et4000->acl.cpu_dat_pos & 3)); return; } } @@ -2505,7 +2579,7 @@ et4000w32p_hwcursor_draw(svga_t *svga, int displine) offset = svga->hwcursor_latch.xoff; - if ((et4000->type == ET4000W32) && (pitch == 32)) { + if ((et4000->rev == ET4000W32) && (pitch == 32)) { switch (svga->bpp) { case 8: minus_width = 0; @@ -2681,6 +2755,7 @@ et4000w32p_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) et4000w32p_io_set(et4000); else et4000w32p_io_remove(et4000); + et4000w32p_recalcmapping(et4000); break; @@ -2697,9 +2772,9 @@ et4000w32p_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) case 0x33: et4000->pci_regs[addr] = val; if (et4000->pci_regs[0x30] & 0x01) { - uint32_t addr = (et4000->pci_regs[0x32] << 16) | (et4000->pci_regs[0x33] << 24); - et4000w32_log("ET4000 bios_rom enabled at %08x\n", addr); - mem_mapping_set_addr(&et4000->bios_rom.mapping, addr, 0x8000); + uint32_t biosaddr = (et4000->pci_regs[0x32] << 16) | (et4000->pci_regs[0x33] << 24); + et4000w32_log("ET4000 bios_rom enabled at %08x\n", biosaddr); + mem_mapping_set_addr(&et4000->bios_rom.mapping, biosaddr, 0x8000); } else { et4000w32_log("ET4000 bios_rom disabled\n"); mem_mapping_disable(&et4000->bios_rom.mapping); @@ -2714,21 +2789,13 @@ et4000w32p_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) void * et4000w32p_init(const device_t *info) { - int vram_size; et4000w32p_t *et4000 = malloc(sizeof(et4000w32p_t)); memset(et4000, 0, sizeof(et4000w32p_t)); et4000->pci = (info->flags & DEVICE_PCI) ? 0x80 : 0x00; et4000->vlb = (info->flags & DEVICE_VLB) ? 0x40 : 0x00; - /*The ET4000/W32i ISA BIOS seems to not support 2MB of VRAM*/ - if ((info->local == ET4000W32) || ((info->local == ET4000W32I) && !(et4000->vlb))) - vram_size = 1; - else - vram_size = device_get_config_int("memory"); - - /*The interleaved VRAM was introduced by the ET4000/W32i*/ - et4000->interleaved = ((vram_size == 2) && (info->local != ET4000W32)) ? 1 : 0; + et4000->vram_size = device_get_config_int("memory"); if (info->flags & DEVICE_PCI) video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000w32_pci); @@ -2737,112 +2804,141 @@ et4000w32p_init(const device_t *info) else video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000w32_isa); - svga_init(info, &et4000->svga, et4000, vram_size << 20, + svga_init(info, &et4000->svga, et4000, et4000->vram_size << 20, et4000w32p_recalctimings, et4000w32p_in, et4000w32p_out, et4000w32p_hwcursor_draw, NULL); - et4000->vram_mask = (vram_size << 20) - 1; - et4000->svga.decode_mask = (vram_size << 20) - 1; + et4000->vram_mask = (et4000->vram_size << 20) - 1; + et4000->svga.decode_mask = (et4000->vram_size << 20) - 1; - et4000->type = info->local; + et4000->card_type = info->local & 0xff; + et4000->ramdac_type = BUILT_IN; + et4000->svga.crtc[0x31] = 0x40; + et4000->svga.miscout = 0x01; + et4000->svga.bpp = 8; - switch (et4000->type) { - case ET4000W32: + switch (et4000->card_type) { + case MACHSPEED_VGA_GUI_2400S: /* ET4000/W32 */ - et4000->rev = 0; + et4000->rev = ET4000W32; + et4000->ramdac_type = ET4K_SDAC; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32_MACHSPEED_VGA_GUI_2400S, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); et4000->svga.ramdac = device_add(&tseng_ics5301_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = sdac_getclock; + sdac_set_ref_clock(et4000->svga.ramdac, 14318184.0f); + svga_recalctimings(&et4000->svga); break; - case ET4000W32I: + case AXIS_MICRODEVICE_ET4W32_5: /* ET4000/W32i rev B */ - et4000->rev = 3; + et4000->rev = ET4000W32I_REVB; + et4000->ramdac_type = ET4K_SDAC; - if (et4000->vlb) { - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32I_VLB, 0xc0000, 0x8000, 0x7fff, 0, - MEM_MAPPING_EXTERNAL); - } else { - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32I_ISA, 0xc0000, 0x8000, 0x7fff, 0, - MEM_MAPPING_EXTERNAL); - } + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32I_REVB_AXIS_MICRODEVICE, 0xc0000, 0x8000, 0x7fff, 0, + MEM_MAPPING_EXTERNAL); et4000->svga.ramdac = device_add(&tseng_ics5301_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = sdac_getclock; + sdac_set_ref_clock(et4000->svga.ramdac, 14318184.0f); + svga_recalctimings(&et4000->svga); break; - case ET4000W32P_VIDEOMAGIC_REVB: - /* ET4000/W32p rev B */ - et4000->rev = 5; + case HERCULES_DYNAMITE_PRO_VLB: + /* ET4000/W32i rev B */ + et4000->rev = ET4000W32I_REVB; + et4000->ramdac_type = ATT49X; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_VIDEOMAGIC_REVB_VLB, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32I_REVB_HERCULES_DYNAMITE_VLB_PRO, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - et4000->svga.ramdac = device_add(&stg_ramdac_device); + et4000->svga.ramdac = device_add(&att490_ramdac_device); + et4000->svga.clock_gen = device_add(&ics2494an_324_device); + et4000->svga.getclock = ics2494_getclock; + break; + + case VIDEOMAGIC_ETW32PVS: + /* ET4000/W32p rev B */ + et4000->rev = ET4000W32P_REVB; + et4000->ramdac_type = STG170X; + + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVB_VIDEOMAGIC, 0xc0000, 0x8000, 0x7fff, 0, + MEM_MAPPING_EXTERNAL); + + et4000->svga.ramdac = device_add(&stg1703_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = stg_getclock; break; - case ET4000W32P_REVC: + case CARDEX_REVC: /* ET4000/W32p rev C */ - et4000->rev = 7; + et4000->rev = ET4000W32P_REVC; + et4000->ramdac_type = ET4K_SDAC; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVC, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVC_CARDEX, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); et4000->svga.ramdac = device_add(&tseng_ics5341_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = sdac_getclock; + sdac_set_ref_clock(et4000->svga.ramdac, 14318184.0f); + svga_recalctimings(&et4000->svga); break; - case ET4000W32P: + case CARDEX_REVD: /* ET4000/W32p rev D */ - et4000->rev = 6; + et4000->rev = ET4000W32P_REVD; + et4000->ramdac_type = STG170X; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVD_CARDEX, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - et4000->svga.ramdac = device_add(&stg_ramdac_device); + et4000->svga.ramdac = device_add(&stg1703_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = stg_getclock; break; - case ET4000W32P_CARDEX: + case DIAMOND_STEALTH_32: /* ET4000/W32p rev D */ - et4000->rev = 6; + et4000->rev = ET4000W32P_REVD; + et4000->ramdac_type = STG170X; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_CARDEX, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVD_DIAMOND, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - et4000->svga.ramdac = device_add(&stg_ramdac_device); - et4000->svga.clock_gen = et4000->svga.ramdac; - et4000->svga.getclock = stg_getclock; - break; - - case ET4000W32P_DIAMOND: - /* ET4000/W32p rev D */ - et4000->rev = 6; - - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_DIAMOND, 0xc0000, 0x8000, 0x7fff, 0, - MEM_MAPPING_EXTERNAL); - - et4000->svga.ramdac = device_add(&stg_ramdac_device); + et4000->svga.ramdac = device_add(&stg1702_ramdac_device); et4000->svga.clock_gen = device_add(&icd2061_device); et4000->svga.getclock = icd2061_getclock; icd2061_set_ref_clock(et4000->svga.ramdac, 14318184.0f); svga_recalctimings(&et4000->svga); break; + case GENERIC_REVD: + /* ET4000/W32p rev D */ + et4000->rev = ET4000W32P_REVD; + et4000->ramdac_type = STG170X; + + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVD, 0xc0000, 0x8000, 0x7fff, 0, + MEM_MAPPING_EXTERNAL); + + et4000->svga.ramdac = device_add(&stg1703_ramdac_device); + et4000->svga.clock_gen = et4000->svga.ramdac; + et4000->svga.getclock = stg_getclock; + break; + default: break; } + + /*The interleaved VRAM was introduced by the ET4000/W32i*/ + et4000->interleaved = ((et4000->vram_size == 2) && (et4000->rev != ET4000W32)) ? 1 : 0; + if (info->flags & DEVICE_PCI) mem_mapping_disable(&et4000->bios_rom.mapping); @@ -2875,51 +2971,51 @@ et4000w32p_init(const device_t *info) } int -et4000w32_available(void) +et4000w32_machspeed_vga_gui_2400s_available(void) { - return rom_present(BIOS_ROM_PATH_W32); + return rom_present(BIOS_ROM_PATH_W32_MACHSPEED_VGA_GUI_2400S); } int -et4000w32i_isa_available(void) +et4000w32i_axis_microdevice_available(void) { - return rom_present(BIOS_ROM_PATH_W32I_ISA); + return rom_present(BIOS_ROM_PATH_W32I_REVB_AXIS_MICRODEVICE); } int -et4000w32i_vlb_available(void) +et4000w32i_hercules_dynamite_pro_vlb_available(void) { - return rom_present(BIOS_ROM_PATH_W32I_VLB); + return rom_present(BIOS_ROM_PATH_W32I_REVB_HERCULES_DYNAMITE_VLB_PRO); } int -et4000w32p_videomagic_revb_vlb_available(void) +et4000w32p_videomagic_revb_available(void) { - return rom_present(BIOS_ROM_PATH_W32P_VIDEOMAGIC_REVB_VLB); + return rom_present(BIOS_ROM_PATH_W32P_REVB_VIDEOMAGIC); } int -et4000w32p_revc_available(void) +et4000w32p_cardex_revc_available(void) { - return rom_present(BIOS_ROM_PATH_W32P_REVC); + return rom_present(BIOS_ROM_PATH_W32P_REVC_CARDEX); } int -et4000w32p_noncardex_available(void) +et4000w32p_diamond_revd_available(void) { - return rom_present(BIOS_ROM_PATH_W32P); + return rom_present(BIOS_ROM_PATH_W32P_REVD_DIAMOND); } int -et4000w32p_available(void) +et4000w32p_cardex_revd_available(void) { - return rom_present(BIOS_ROM_PATH_DIAMOND); + return rom_present(BIOS_ROM_PATH_W32P_REVD_CARDEX); } int -et4000w32p_cardex_available(void) +et4000w32p_generic_revd_available(void) { - return rom_present(BIOS_ROM_PATH_CARDEX); + return rom_present(BIOS_ROM_PATH_W32P_REVD); } void @@ -2969,197 +3065,197 @@ static const device_config_t et4000w32p_config[] = { // clang-format on }; -const device_t et4000w32_device = { - .name = "Tseng Labs ET4000/w32 ISA", +const device_t et4000w32_machspeed_vga_gui_2400s_isa_device = { + .name = "Tseng Labs ET4000/w32 ISA (MachSpeed VGA GUI 2400S)", .internal_name = "et4000w32", .flags = DEVICE_ISA16, - .local = ET4000W32, + .local = MACHSPEED_VGA_GUI_2400S, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32_available, + .available = et4000w32_machspeed_vga_gui_2400s_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, - .config = NULL + .config = et4000w32p_config +}; + +const device_t et4000w32_machspeed_vga_gui_2400s_vlb_device = { + .name = "Tseng Labs ET4000/w32 VLB (MachSpeed VGA GUI 2400S)", + .internal_name = "et4000w32_vlb", + .flags = DEVICE_VLB, + .local = MACHSPEED_VGA_GUI_2400S, + .init = et4000w32p_init, + .close = et4000w32p_close, + .reset = NULL, + .available = et4000w32_machspeed_vga_gui_2400s_available, + .speed_changed = et4000w32p_speed_changed, + .force_redraw = et4000w32p_force_redraw, + .config = et4000w32p_config }; const device_t et4000w32_onboard_device = { - .name = "Tseng Labs ET4000/w32 (ISA) (On-Board)", + .name = "Tseng Labs ET4000/w32 ISA (On-Board)", .internal_name = "et4000w32_onboard", .flags = DEVICE_ISA16, - .local = ET4000W32, + .local = MACHSPEED_VGA_GUI_2400S | 0x100, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32_available, + .available = et4000w32_machspeed_vga_gui_2400s_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, - .config = NULL + .config = et4000w32p_config }; -const device_t et4000w32i_isa_device = { - .name = "Tseng Labs ET4000/w32i Rev. B ISA", +const device_t et4000w32i_axis_microdevice_isa_device = { + .name = "Tseng Labs ET4000/w32i Rev. B ISA (Axis MicroDevice)", .internal_name = "et4000w32i", .flags = DEVICE_ISA16, - .local = ET4000W32I, + .local = AXIS_MICRODEVICE_ET4W32_5, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32i_isa_available, + .available = et4000w32i_axis_microdevice_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, - .config = NULL + .config = et4000w32p_config }; -const device_t et4000w32i_vlb_device = { - .name = "Tseng Labs ET4000/w32i Rev. B VLB", +const device_t et4000w32i_hercules_dynamite_pro_vlb_device = { + .name = "Tseng Labs ET4000/w32i Rev. B VLB (Hercules Dynamite Pro)", .internal_name = "et4000w32i_vlb", .flags = DEVICE_VLB, - .local = ET4000W32I, + .local = HERCULES_DYNAMITE_PRO_VLB, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32i_vlb_available, + .available = et4000w32i_hercules_dynamite_pro_vlb_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; const device_t et4000w32p_videomagic_revb_vlb_device = { - .name = "Tseng Labs ET4000/w32p Rev. B VLB (VideoMagic)", + .name = "Tseng Labs ET4000/w32p Rev. B VLB (VideoMagic ETW32PVS)", .internal_name = "et4000w32p_videomagic_revb_vlb", .flags = DEVICE_VLB, - .local = ET4000W32P_VIDEOMAGIC_REVB, + .local = VIDEOMAGIC_ETW32PVS, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_videomagic_revb_vlb_available, + .available = et4000w32p_videomagic_revb_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_videomagic_revb_pci_device = { - .name = "Tseng Labs ET4000/w32p Rev. B PCI (VideoMagic)", - .internal_name = "et4000w32p_videomagic_revb_pci", - .flags = DEVICE_PCI, - .local = ET4000W32P_VIDEOMAGIC_REVB, - .init = et4000w32p_init, - .close = et4000w32p_close, - .reset = NULL, - .available = et4000w32p_videomagic_revb_vlb_available, - .speed_changed = et4000w32p_speed_changed, - .force_redraw = et4000w32p_force_redraw, - .config = et4000w32p_config -}; - -const device_t et4000w32p_revc_vlb_device = { +const device_t et4000w32p_cardex_revc_vlb_device = { .name = "Tseng Labs ET4000/w32p Rev. C VLB (Cardex)", .internal_name = "et4000w32p_revc_vlb", .flags = DEVICE_VLB, - .local = ET4000W32P_REVC, + .local = CARDEX_REVC, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_revc_available, + .available = et4000w32p_cardex_revc_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_revc_pci_device = { +const device_t et4000w32p_cardex_revc_pci_device = { .name = "Tseng Labs ET4000/w32p Rev. C PCI (Cardex)", - .internal_name = "et4000w32p_revc_pci", + .internal_name = "et4000w32p_revc_vlb", .flags = DEVICE_PCI, - .local = ET4000W32P_REVC, + .local = CARDEX_REVC, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_revc_available, + .available = et4000w32p_cardex_revc_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_noncardex_vlb_device = { - .name = "Tseng Labs ET4000/w32p Rev. D VLB", - .internal_name = "et4000w32p_nc_vlb", - .flags = DEVICE_VLB, - .local = ET4000W32P, - .init = et4000w32p_init, - .close = et4000w32p_close, - .reset = NULL, - .available = et4000w32p_noncardex_available, - .speed_changed = et4000w32p_speed_changed, - .force_redraw = et4000w32p_force_redraw, - .config = et4000w32p_config -}; - -const device_t et4000w32p_noncardex_pci_device = { - .name = "Tseng Labs ET4000/w32p Rev. D PCI", - .internal_name = "et4000w32p_nc_pci", - .flags = DEVICE_PCI, - .local = ET4000W32P, - .init = et4000w32p_init, - .close = et4000w32p_close, - .reset = NULL, - .available = et4000w32p_noncardex_available, - .speed_changed = et4000w32p_speed_changed, - .force_redraw = et4000w32p_force_redraw, - .config = et4000w32p_config -}; - -const device_t et4000w32p_cardex_vlb_device = { +const device_t et4000w32p_cardex_revd_vlb_device = { .name = "Tseng Labs ET4000/w32p Rev. D VLB (Cardex)", .internal_name = "et4000w32p_vlb", .flags = DEVICE_VLB, - .local = ET4000W32P_CARDEX, + .local = CARDEX_REVD, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_cardex_available, + .available = et4000w32p_cardex_revd_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_cardex_pci_device = { +const device_t et4000w32p_cardex_revd_pci_device = { .name = "Tseng Labs ET4000/w32p Rev. D PCI (Cardex)", .internal_name = "et4000w32p_pci", .flags = DEVICE_PCI, - .local = ET4000W32P_CARDEX, + .local = CARDEX_REVD, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_cardex_available, + .available = et4000w32p_cardex_revd_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_vlb_device = { +const device_t et4000w32p_diamond_revd_vlb_device = { .name = "Tseng Labs ET4000/w32p Rev. D VLB (Diamond Stealth32)", .internal_name = "stealth32_vlb", .flags = DEVICE_VLB, - .local = ET4000W32P_DIAMOND, + .local = DIAMOND_STEALTH_32, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_available, + .available = et4000w32p_diamond_revd_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_pci_device = { +const device_t et4000w32p_diamond_revd_pci_device = { .name = "Tseng Labs ET4000/w32p Rev. D PCI (Diamond Stealth32)", .internal_name = "stealth32_pci", .flags = DEVICE_PCI, - .local = ET4000W32P_DIAMOND, + .local = DIAMOND_STEALTH_32, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_available, + .available = et4000w32p_diamond_revd_available, + .speed_changed = et4000w32p_speed_changed, + .force_redraw = et4000w32p_force_redraw, + .config = et4000w32p_config +}; + +const device_t et4000w32p_generic_revd_vlb_device = { + .name = "Tseng Labs ET4000/w32p Rev. D VLB", + .internal_name = "et4000w32p_nc_vlb", + .flags = DEVICE_VLB, + .local = GENERIC_REVD, + .init = et4000w32p_init, + .close = et4000w32p_close, + .reset = NULL, + .available = et4000w32p_generic_revd_available, + .speed_changed = et4000w32p_speed_changed, + .force_redraw = et4000w32p_force_redraw, + .config = et4000w32p_config +}; + +const device_t et4000w32p_generic_revd_pci_device = { + .name = "Tseng Labs ET4000/w32p Rev. D PCI", + .internal_name = "et4000w32p_nc_pci", + .flags = DEVICE_PCI, + .local = GENERIC_REVD, + .init = et4000w32p_init, + .close = et4000w32p_close, + .reset = NULL, + .available = et4000w32p_generic_revd_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 2333d68b7..210a9f625 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -60,7 +60,7 @@ #define ROM_MIROCRYSTAL20SV_964_PCI "roms/video/s3/mirocrystal.VBI" #define ROM_MIROCRYSTAL20SD_864_VLB "roms/video/s3/Miro20SD.BIN" #define ROM_PHOENIX_86C80X "roms/video/s3/805.VBI" -#define ROM_WINNER1000_805 "roms/video/s3/v01_05_00-C.BIN" +#define ROM_WINNER1000_805 "roms/video/s3/W1000ISA 01.03.00-B.BIN" #define ROM_PARADISE_BAHAMAS64 "roms/video/s3/bahamas64.bin" #define ROM_PHOENIX_VISION864 "roms/video/s3/86c864p.bin" #define ROM_DIAMOND_STEALTH64_964 "roms/video/s3/964_107h.rom" @@ -138,6 +138,7 @@ enum { S3_86C928PCI = 0x06, S3_86C801 = 0x07, S3_86C805 = 0x08, + S3_86C805I = 0x09, S3_VISION964 = 0x18, S3_VISION968 = 0x20, S3_VISION864 = 0x28, @@ -291,6 +292,7 @@ typedef struct s3_t { int16_t px, py; int16_t sx, sy; int16_t dx, dy; + int16_t sx_inc; uint32_t src, dest, pattern; int poly_cx, poly_cx2; @@ -314,7 +316,7 @@ typedef struct s3_t { int color_16bit_check; int color_16bit_check_pixtrans; int16_t minus; - int16_t minus_src_24bpp; + int16_t blit_24bpp; int rd_mask_16bit_check; int start; int mix_dat_upper; @@ -528,8 +530,9 @@ s3_queue(s3_t *s3, uint32_t addr, uint32_t val, uint32_t type) if (FIFO_FULL) { thread_reset_event(s3->fifo_not_full_event); - if (FIFO_FULL) + if (FIFO_FULL) { thread_wait_event(s3->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ + } } fifo->val = val; @@ -656,7 +659,7 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) s3->accel_start(8, 1, val | (val << 16), 0, s3); } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cur_x & 0x400) val = (val >> 8) | (val << 8); @@ -671,7 +674,7 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) s3->accel_start(1, 1, 0xffffffff, val | (val << 16), s3); } } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cur_x & 0x400) val = (val >> 8) | (val << 8); @@ -723,6 +726,7 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) case 0x400: if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { + s3_log("WORD WritePIXTRANS 32=%04x, SX=%d, SY=%d.\n", val, s3->accel.sx, s3->accel.sy); if (s3->accel.cmd & 0x1000) val = (val >> 8) | (val << 8); @@ -794,8 +798,10 @@ s3_accel_out_pixtrans_l(s3_t *s3, uint32_t val) case 0x400: if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { + s3_log("LONG WritePIXTRANS 32=%08x.\n", val); if (s3->accel.cmd & 0x1000) val = ((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24); + s3->accel_start(32, 1, val, 0, s3); } else s3->accel_start(4, 1, 0xffffffff, val, s3); @@ -832,14 +838,15 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) switch (port) { case 0x8148: case 0x82e8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.cur_y = (s3->accel.cur_y & 0xf00) | val; s3->accel.poly_cy = s3->accel.cur_y; break; case 0x8149: case 0x82e9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.cur_y = (s3->accel.cur_y & 0xff) | ((val & 0x0f) << 8); s3->accel.poly_cy = s3->accel.cur_y; - s3_log("[%04X:%08X] OUT PORTB=%04x, valy=%d.\n", CS, cpu_state.pc, port - 1, s3->accel.cur_y); break; case 0x814a: case 0x82ea: @@ -854,18 +861,19 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0x8548: case 0x86e8: - s3->accel.cur_x = (s3->accel.cur_x & 0xf00) | val; + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); + s3->accel.cur_x = (s3->accel.cur_x & 0xf00) | val; s3->accel.cur_x_overflow = (s3->accel.cur_x_overflow & 0xff00) | val; - s3->accel.poly_cx = s3->accel.cur_x << 20; - s3->accel.poly_x = s3->accel.poly_cx >> 20; + s3->accel.poly_cx = s3->accel.cur_x << 20; + s3->accel.poly_x = s3->accel.poly_cx >> 20; break; case 0x8549: case 0x86e9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.cur_x = (s3->accel.cur_x & 0xff) | ((val & 0x0f) << 8); s3->accel.cur_x_overflow = (s3->accel.cur_x_overflow & 0xff) | (val << 8); s3->accel.poly_cx = s3->accel.poly_x = s3->accel.cur_x << 20; - s3->accel.poly_x = s3->accel.poly_cx >> 20; - s3_log("[%04X:%08X] OUT PORTB=%04x, valx=%d, valxover=%d.\n", CS, cpu_state.pc, port - 1, s3->accel.cur_x, s3->accel.cur_x_overflow); + s3->accel.poly_x = s3->accel.poly_cx >> 20; break; case 0x854a: case 0x86ea: @@ -881,15 +889,18 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xcae8: case 0x8948: case 0x8ae8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.desty_axstp = (s3->accel.desty_axstp & 0x3f00) | val; s3->accel.point_1_updated = 1; break; case 0xcae9: case 0x8949: case 0x8ae9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.desty_axstp = (s3->accel.desty_axstp & 0xff) | ((val & 0x3f) << 8); if (val & 0x20) s3->accel.desty_axstp |= ~0x3fff; + s3->accel.point_1_updated = 1; break; case 0x894a: @@ -902,21 +913,25 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) s3->accel.desty_axstp2 = (s3->accel.desty_axstp2 & 0xff) | ((val & 0x3f) << 8); if (val & 0x20) s3->accel.desty_axstp2 |= ~0x3fff; + s3->accel.point_2_updated = 1; break; case 0x8d48: case 0x8ee8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.destx_distp = (s3->accel.destx_distp & 0x3f00) | val; s3->accel.destx_overflow = (s3->accel.destx_overflow & 0xff00) | val; s3->accel.point_1_updated = 1; break; case 0x8d49: case 0x8ee9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.destx_distp = (s3->accel.destx_distp & 0xff) | ((val & 0x3f) << 8); s3->accel.destx_overflow = (s3->accel.destx_overflow & 0xff) | (val << 8); if (val & 0x20) s3->accel.destx_distp |= ~0x3fff; + s3->accel.point_1_updated = 1; break; case 0x8d4a: @@ -980,6 +995,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) s3->accel.cmd = (s3->accel.cmd & 0xff) | (val << 8); s3->accel.ssv_state = 0; if (s3->bpp == 3) { + s3_log("Command Misc1=%04x.\n", s3->accel.multifunc[0xe]); if (!(s3->accel.multifunc[0xe] & 0x200)) s3->accel.multifunc[0xe] &= ~0x10; } @@ -1235,6 +1251,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xa94a: case 0xaaea: + s3_log("[%04X:%08X] OUT PORTB=%04x (Write Mask), val=%02x.\n", CS, cpu_state.pc, port, val); if (s3->chip >= S3_VISION964) { if (s3->accel.multifunc[0xe] & 0x200) s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16); @@ -1515,14 +1532,26 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xb548: case 0xb6e8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); s3->accel.bkgd_mix = val; break; + case 0xb549: + case 0xb6e9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); + break; + case 0xb948: case 0xbae8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); s3->accel.frgd_mix = val; break; + case 0xb949: + case 0xbae9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); + break; + case 0xbd48: case 0xbee8: s3->accel.multifunc_cntl = (s3->accel.multifunc_cntl & 0xff00) | val; @@ -1598,18 +1627,22 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xe948: case 0xeae8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port, s3->accel.cmd); s3->accel.pat_y = (s3->accel.pat_y & 0xf00) | val; break; case 0xe949: case 0xeae9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port, s3->accel.cmd); s3->accel.pat_y = (s3->accel.pat_y & 0xff) | ((val & 0x0f) << 8); break; case 0xe94a: case 0xeaea: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port, s3->accel.cmd); s3->accel.pat_x = (s3->accel.pat_x & 0xf00) | val; break; case 0xe94b: case 0xeaeb: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port, s3->accel.cmd); s3->accel.pat_x = (s3->accel.pat_x & 0xff) | ((val & 0x0f) << 8); break; case 0xed48: @@ -1681,7 +1714,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) else s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0], s3); } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { s3->accel.pix_trans[1] = svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx - s3->accel.minus)) & s3->vram_mask]; if (s3->accel.cmd & 0x1000) { @@ -2177,7 +2210,9 @@ s3_accel_write_fifo_w(s3_t *s3, uint32_t addr, uint16_t val) s3_accel_out_fifo_w(s3, 0x9ee8, val); } else if (((addr & 0x1fffe) >= 0x8000) && (addr & 0x1fffe) < 0x10000) { if (((addr & 0x1fffe) == 0xe2e8) || ((addr & 0x1fffe) == 0xe2ea)) { - if ((s3->chip == S3_86C801) || (s3->chip == S3_86C805) || (s3->chip == S3_86C928) || (s3->chip == S3_86C928PCI)) + if ((s3->chip == S3_86C801) || (s3->chip == S3_86C805) || + (s3->chip == S3_86C928) || + (s3->chip == S3_86C928PCI)) s3_accel_out_pixtrans_w(s3, val); else { s3_accel_write_fifo(s3, addr, val); @@ -2306,9 +2341,10 @@ s3_hwcursor_draw(svga_t *svga, int displine) case 15: fg = video_15to32[s3->hwc_fg_col & 0xffff]; bg = video_15to32[s3->hwc_bg_col & 0xffff]; - if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805)) { + if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805I)) { if (!s3->color_16bit) { - if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805)) { + if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805) && + (s3->card_type != S3_WINNER1000_805)) { if (!(svga->crtc[0x45] & 0x04)) { shift = 2; width = 8; @@ -2331,9 +2367,10 @@ s3_hwcursor_draw(svga_t *svga, int displine) case 16: fg = video_16to32[s3->hwc_fg_col & 0xffff]; bg = video_16to32[s3->hwc_bg_col & 0xffff]; - if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805)) { + if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805I)) { if (!s3->color_16bit) { - if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805)) { + if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805) && + (s3->card_type != S3_WINNER1000_805)) { if (!(svga->crtc[0x45] & 0x04)) { shift = 2; width = 8; @@ -2357,7 +2394,7 @@ s3_hwcursor_draw(svga_t *svga, int displine) break; case 24: - if (s3->chip <= S3_86C805) { + if (s3->chip <= S3_86C805I) { fg = svga->pallook[svga->crtc[0xe]]; bg = svga->pallook[svga->crtc[0xf]]; } else { @@ -3131,7 +3168,7 @@ s3_out(uint16_t addr, uint8_t val, void *priv) case 0x50: s3->bpp = (svga->crtc[0x50] >> 4) & 3; - s3_log("S3 BPP=%d.\n", s3->bpp); + s3_log("S3 BPP=%d, VGA=%d, Misc1=%04x.\n", s3->bpp, svga->bpp, s3->accel.multifunc[0xe]); if (s3->bpp == 3) { if (!(s3->accel.multifunc[0xe] & 0x200)) /*On True Color mode change, reset bit 4 of Misc Index register*/ s3->accel.multifunc[0xe] &= ~0x10; @@ -3166,7 +3203,8 @@ s3_out(uint16_t addr, uint8_t val, void *priv) break; case 0x51: - if (s3->chip == S3_86C801 || s3->chip == S3_86C805) { + if ((s3->chip == S3_86C801) || (s3->chip == S3_86C805) || + (s3->chip == S3_86C805I)) { s3->bank = (s3->bank & 0x6f) | ((val & 0x4) << 2); s3->ma_ext = (s3->ma_ext & ~0x4) | ((val & 1) << 2); } else { @@ -3190,10 +3228,10 @@ s3_out(uint16_t addr, uint8_t val, void *priv) break; case 0x45: + s3_log("Write CRTC45=%02x.\n", val); if ((s3->chip == S3_VISION964) || (s3->chip == S3_VISION968)) break; svga->hwcursor.ena = val & 1; - s3_log("Write CRTC45=%02x.\n", val); break; case 0x46: case 0x47: @@ -3295,7 +3333,7 @@ s3_out(uint16_t addr, uint8_t val, void *priv) case 0x43: if (s3->chip < S3_VISION964) { - if (s3->chip <= S3_86C805) + if (s3->chip <= S3_86C805I) svga_recalctimings(svga); s3_io_remove_alt(s3); @@ -3423,8 +3461,8 @@ s3_in(uint16_t addr, void *priv) temp = att498_ramdac_in(addr, rs2, svga->ramdac, svga); break; case BT48X: - if (s3->chip == S3_86C928) - rs3 = !!(svga->crtc[0x55] & 0x28) || !!(svga->crtc[0x45] & 0x20) || !!(svga->crtc[0x55] & 0x02); /*Quite insane but Win95's S3 driver wants it set at all costs for 8bpp+ mode*/ + if (s3->card_type == S3_METHEUS_86C928) + rs3 = !!(svga->crtc[0x55] & 0x28) || !!(svga->crtc[0x45] & 0x20) || !!(svga->crtc[0x55] & 0x02); /*Quite insane but Win95's S3 driver wants it set at all costs for 8bpp+ mode in the Metheus card*/ else rs3 = !!(svga->crtc[0x55] & 0x02); @@ -3658,9 +3696,10 @@ s3_readl(uint32_t addr, void *priv) static void s3_recalctimings(svga_t *svga) { - s3_t *s3 = (s3_t *) svga->priv; - int clk_sel = (svga->miscout >> 2) & 3; + s3_t *s3 = (s3_t *) svga->priv; + int clk_sel = (svga->miscout >> 2) & 3; uint8_t mask = 0xc0; + int enhanced_8bpp_modes = 0x00; if (svga->crtc[0x33] & 0x20) { /* In this mode, the dots per clock are always 8 or 16, never 9 or 18. */ @@ -3737,12 +3776,12 @@ s3_recalctimings(svga_t *svga) break; } - if (s3->chip >= S3_TRIO32) { + if ((s3->chip >= S3_TRIO32) || (s3->chip == S3_86C805I)) { switch (svga->crtc[0x67] >> 4) { case 3: case 5: case 7: - svga->clock /= 2; + svga->clock /= 2.0; break; default: @@ -3750,7 +3789,38 @@ s3_recalctimings(svga_t *svga) } } - if (s3->chip <= S3_86C805) { + enhanced_8bpp_modes = !!((svga->crtc[0x3a] & 0x10) && !svga->lowres); + + if (s3->chip >= S3_86C928) { + if (s3->chip != S3_86C801) + mask |= 0x01; + + switch (svga->crtc[0x50] & mask) { + case 0x00: + s3->width = (svga->crtc[0x31] & 0x02) ? 2048 : 1024; + break; + case 0x01: + s3->width = 1152; + break; + case 0x40: + s3->width = 640; + break; + case 0x80: + /*For later chips, bit 2 of port 0x4ae8 means 1600x1200x4bpp if the original width is 800 (per Vision864 manual).*/ + s3->width = ((s3->chip > S3_86C805I) && (s3->accel.advfunc_cntl & 0x04) && !enhanced_8bpp_modes) ? 1600 : 800; + break; + case 0x81: + s3->width = 1600; + break; + case 0xc0: + s3->width = 1280; + break; + default: + break; + } + } + + if (s3->chip <= S3_86C805I) { s3->color_16bit = !!(svga->crtc[0x43] & 0x08); s3_log("Color 16bit=%x, bpp=%d, 256color=%x.\n", s3->color_16bit, svga->bpp, (svga->attrregs[0x10] & 0x40)); if ((svga->bpp == 24) || (svga->bpp == 8)) @@ -3764,36 +3834,6 @@ s3_recalctimings(svga_t *svga) } } - if (s3->chip >= S3_86C928) { - if (s3->chip != S3_86C801) - mask |= 0x01; - - switch (svga->crtc[0x50] & mask) { - case 0x00: - s3->width = (svga->crtc[0x31] & 0x02) ? 2048 : 1024; - if (s3->color_16bit) - s3->width = 1024; - break; - case 0x01: - s3->width = 1152; - break; - case 0x40: - s3->width = 640; - break; - case 0x80: - s3->width = ((s3->chip > S3_86C805) && (s3->accel.advfunc_cntl & 0x04)) ? 1600 : 800; - break; - case 0x81: - s3->width = 1600; - break; - case 0xc0: - s3->width = 1280; - break; - default: - break; - } - } - if (svga->crtc[0x33] & 0x20) { /* The S3 version of the Cirrus' special blanking mode, with identical behavior. */ svga->hblankstart = (((svga->crtc[0x5d] & 0x02) >> 1) << 8) + svga->crtc[1]/* + @@ -3822,11 +3862,11 @@ s3_recalctimings(svga_t *svga) } } - if ((svga->crtc[0x3a] & 0x10) && !svga->lowres) { + if (enhanced_8bpp_modes) { s3_log("BPP=%d, pitch=%d, width=%02x, double?=%x, 16bit?=%d, highres?=%d, " - "attr=%02x, hdisp=%d, dotsperclock=%x, clksel=%x, clockmultiplier=%d, multiplexingrate=%d.\n", svga->bpp, s3->width, svga->crtc[0x50], + "attr=%02x, hdisp=%d, dotsperclock=%x, clksel=%x, clockmultiplier=%d, multiplexingrate=%d, xadd=%d, overscanx=%d.\n", svga->bpp, s3->width, svga->crtc[0x50], svga->crtc[0x31] & 0x02, s3->color_16bit, s3->accel.advfunc_cntl & 0x04, - svga->attrregs[0x10] & 0x40, svga->hdisp, svga->dots_per_clock, clk_sel, svga->clock_multiplier, svga->multiplexing_rate); + svga->attrregs[0x10] & 0x40, svga->hdisp, svga->dots_per_clock, clk_sel, svga->clock_multiplier, svga->multiplexing_rate, svga->x_add, svga->monitor->mon_overscan_x); switch (svga->bpp) { case 8: svga->render = svga_render_8bpp_highres; @@ -3839,8 +3879,10 @@ s3_recalctimings(svga_t *svga) if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ if ((svga->clock_multiplier == 1) || (s3->width >= 1024)) { if (svga->multiplexing_rate == 2) { - svga->hdisp <<= 2; - svga->dots_per_clock <<= 2; + if (svga->clock_multiplier == 1) { + svga->hdisp <<= 2; + svga->dots_per_clock <<= 2; + } } else { if (!svga->clock_multiplier) { svga->hdisp <<= 1; @@ -3875,70 +3917,61 @@ s3_recalctimings(svga_t *svga) break; } break; + case S3_86C801: + case S3_86C805: + case S3_86C805I: case S3_86C928PCI: if (!svga->chain4) svga->chain4 |= 0x08; break; case S3_VISION964: - switch (s3->card_type) { - case S3_ELSAWIN2KPROX_964: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - default: - break; + switch (s3->ramdac_type) { + case BT48X: /*BT485 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + } + break; + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + break; + default: + break; + } + break; + case S3_VISION868: + switch (s3->ramdac_type) { + case ATT498: /*AT&T 498 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + if (s3->width >= 1024) + svga->clock /= 2.0; } break; - default: break; } break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_DIAMOND_STEALTH64_968: - case S3_NUMBER9_9FX_771: - case S3_PHOENIX_VISION968: - case S3_SPEA_MERCURY_P64V: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock *= 2.0; - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_ELSAWIN2KPROX: - s3_log("S3 width 8bpp=%d, hdisp=%d.\n", s3->width, svga->hdisp); - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; } break; - + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + s3_log("TVP3026 968 8bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; default: break; } @@ -3958,45 +3991,35 @@ s3_recalctimings(svga_t *svga) break; case S3_86C801: - switch (s3->card_type) { - case S3_PHOENIX_86C801: + case S3_86C805: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; break; - + case ATT49X: /*AT&T 490/1/2 RAMDAC*/ + if (svga->dots_per_clock != 16) { + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } else { + svga->clock *= 2.0; + svga->dots_per_clock >>= 2; + } + break; default: break; } break; - case S3_86C805: - switch (s3->card_type) { - case S3_MIROCRYSTAL8S_805: - case S3_MIROCRYSTAL10SD_805: - case S3_WINNER1000_805: - case S3_PHOENIX_86C805: - case S3_86C805_ONBOARD: + case S3_86C805I: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; break; - - case S3_SPEA_MIRAGE_86C805: - svga->hdisp >>= 1; - svga->dots_per_clock >>= 1; - switch (s3->width) { - case 800: - case 1024: - if (svga->hdisp == 400) { - /*SPEA specific drivers + its VBE RAM BIOS...*/ - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock /= 2.0; - } - break; - default: - break; - } - break; - default: break; } @@ -4085,93 +4108,62 @@ s3_recalctimings(svga_t *svga) case S3_VISION864: svga->hdisp >>= 1; svga->dots_per_clock >>= 1; + svga->clock /= 2.0; break; case S3_VISION964: - switch (s3->card_type) { - case S3_ELSAWIN2KPROX_964: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case BT48X: /*BT485 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); } break; - + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + break; default: break; } break; case S3_VISION868: - switch (s3->card_type) { - case S3_PHOENIX_VISION868: - case S3_NUMBER9_9FX_531: + switch (s3->ramdac_type) { + case ATT498: /*AT&T 498 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + svga->clock /= 2.0; + } + break; + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; svga->clock /= 2.0; break; - default: break; } break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_DIAMOND_STEALTH64_968: - case S3_NUMBER9_9FX_771: - case S3_PHOENIX_VISION968: - case S3_SPEA_MERCURY_P64V: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock *= 2.0; - /* TODO: Is this still needed? */ - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - - case S3_ELSAWIN2KPROX: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; } break; + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + s3_log("TVP3026 968 15bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; default: break; } @@ -4197,43 +4189,35 @@ s3_recalctimings(svga_t *svga) break; case S3_86C801: - switch (s3->card_type) { - case S3_PHOENIX_86C801: + case S3_86C805: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; break; - + case ATT49X: /*AT&T 490/1/2 RAMDAC*/ + if (svga->dots_per_clock != 16) { + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } else { + svga->clock *= 2.0; + svga->dots_per_clock >>= 2; + } + break; default: break; } break; - case S3_86C805: - switch (s3->card_type) { - case S3_MIROCRYSTAL8S_805: - case S3_MIROCRYSTAL10SD_805: - case S3_WINNER1000_805: - case S3_PHOENIX_86C805: - case S3_86C805_ONBOARD: + case S3_86C805I: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; break; - - case S3_SPEA_MIRAGE_86C805: - svga->hdisp >>= 1; - switch (s3->width) { - case 800: - case 1024: - if (svga->hdisp == 400) { - /*SPEA specific drivers + its VBE RAM BIOS...*/ - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - break; - default: - break; - } - break; - default: break; } @@ -4322,92 +4306,62 @@ s3_recalctimings(svga_t *svga) case S3_VISION864: svga->hdisp >>= 1; svga->dots_per_clock >>= 1; + svga->clock /= 2.0; break; case S3_VISION868: - switch (s3->card_type) { - case S3_PHOENIX_VISION868: - case S3_NUMBER9_9FX_531: + switch (s3->ramdac_type) { + case ATT498: /*AT&T 498 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + svga->clock /= 2.0; + } + break; + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; + svga->clock /= 2.0; break; - default: break; } break; case S3_VISION964: - switch (s3->card_type) { - case S3_ELSAWIN2KPROX_964: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case BT48X: /*BT485 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); } break; - + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + break; default: break; } break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_DIAMOND_STEALTH64_968: - case S3_NUMBER9_9FX_771: - case S3_PHOENIX_VISION968: - case S3_SPEA_MERCURY_P64V: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock *= 2.0; - /* TODO: Is this still needed? */ - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - - case S3_ELSAWIN2KPROX: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; } break; + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } + s3_log("TVP3026 968 16bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; default: break; } @@ -4440,26 +4394,15 @@ s3_recalctimings(svga_t *svga) } break; case S3_86C801: - switch (s3->card_type) { - case S3_PHOENIX_86C801: - case S3_SPEA_MIRAGE_86C801: - svga->hdisp = (svga->hdisp << 1) / 3; - svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; - break; - default: - break; - } - break; case S3_86C805: - switch (s3->card_type) { - case S3_MIROCRYSTAL8S_805: - case S3_MIROCRYSTAL10SD_805: - case S3_WINNER1000_805: - case S3_PHOENIX_86C805: - case S3_SPEA_MIRAGE_86C805: - case S3_86C805_ONBOARD: + case S3_86C805I: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: svga->hdisp = (svga->hdisp << 1) / 3; svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; + svga->clock = (svga->clock * 4.0) / 3.0; break; default: break; @@ -4470,21 +4413,24 @@ s3_recalctimings(svga_t *svga) svga->chain4 |= 0x08; break; case S3_86C928PCI: /*Technically the 928 cards don't support 24bpp.*/ - switch (s3->card_type) { - case S3_ELSAWIN1KPCI_86C928: - if (svga->dots_per_clock == 16) { - svga->dots_per_clock >>= 1; + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case SC1502X: /*SC15025 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + if (svga->dots_per_clock == 16) { + svga->dots_per_clock >>= 1; + svga->hdisp = (svga->hdisp << 1) / 3; + svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; + svga->clock = (svga->clock * 4.0) / 3.0; + if (svga->hdisp == 640) + s3->width = 640; + } + } else if (svga->getclock == av9194_getclock) { /*AV9194 clock chip*/ svga->hdisp = (svga->hdisp << 1) / 3; svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; - svga->clock /= (2.0 / 3.0); - if (svga->hdisp == 640) - s3->width = 640; } break; - case S3_SPEA_MERCURY_LITE_PCI: - svga->hdisp = (svga->hdisp << 1) / 3; - svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; - break; default: break; } @@ -4492,14 +4438,23 @@ s3_recalctimings(svga_t *svga) case S3_VISION864: svga->hdisp = (svga->hdisp << 1) / 3; svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; - svga->clock /= (2.0 / 3.0); + svga->clock = (svga->clock * 4.0) / 3.0; break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - svga->hdisp = (svga->hdisp / 3) << 2; - svga->dots_per_clock = (svga->hdisp / 3) << 2; + switch (s3->ramdac_type) { + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + svga->hdisp = (svga->hdisp << 1) / 3; + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock = (svga->clock * 4.0) / 3.0; + } + svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; + + s3_log("TVP3026 968 24bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (svga->hdisp == 832) + svga->hdisp -= 32; break; default: break; @@ -4519,6 +4474,25 @@ s3_recalctimings(svga_t *svga) case 32: svga->render = svga_render_32bpp_highres; switch (s3->chip) { + case S3_86C805I: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ + svga->hdisp >>= 2; + svga->dots_per_clock >>= 2; + if (s3->width == 800) { + if ((svga->crtc[0x67] >> 4) == 7) { + svga->clock *= 2.0; + s3_log("800x600: MEMLatch=%08x, htotal=%x.\n", svga->memaddr_latch, svga->htotal); + } + } + break; + default: + break; + } + break; + case S3_86C928: if (!svga->chain4) svga->chain4 |= 0x08; @@ -4576,103 +4550,54 @@ s3_recalctimings(svga_t *svga) case S3_VISION864: svga->hdisp >>= 2; svga->dots_per_clock >>= 2; + svga->clock /= 2.0; break; case S3_VISION868: - switch (s3->card_type) { - case S3_PHOENIX_VISION868: - case S3_NUMBER9_9FX_531: + switch (s3->ramdac_type) { + case ATT498: /*AT&T 498 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } + break; + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; - svga->clock /= 2.0; break; default: break; } break; case S3_VISION964: - switch (s3->card_type) { - case S3_MIROCRYSTAL20SV_964: - switch (s3->width) { - case 800: - case 1024: - svga->hdisp >>= 1; - svga->dots_per_clock >>= 1; - svga->clock /= 2.0; - break; - default: - break; - } - break; - case S3_ELSAWIN2KPROX_964: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; - } + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); break; default: break; } break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_DIAMOND_STEALTH64_968: - case S3_NUMBER9_9FX_771: - case S3_PHOENIX_VISION968: - case S3_SPEA_MERCURY_P64V: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock *= 2.0; - /* TODO: Is this still needed? */ - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - - case S3_ELSAWIN2KPROX: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; } break; + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + s3_log("TVP3026 968 32bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; default: break; } @@ -4703,10 +4628,13 @@ s3_recalctimings(svga_t *svga) svga->write_bank = 0; svga->read_bank = 0; } + /*In non-enhanced/IBM VGA modes, reset the misc index registers.*/ + s3->accel.multifunc[0xd] = 0xd000; + s3->accel.multifunc[0xe] = 0xe000; } } - if ((((s3->card_type == S3_ELSAWIN1K_86C928) || (s3->card_type == S3_ELSAWIN1KPCI_86C928)) && (svga->bpp == 32)) || + if ((s3->elsa_eeprom && (svga->bpp == 32)) || (s3->chip == S3_TRIO32) || (s3->chip == S3_TRIO64) || (s3->chip == S3_VISION864) || (s3->chip == S3_VISION868) || (s3->chip == S3_VISION968)) svga->hoverride = 1; else @@ -4976,7 +4904,7 @@ s3_updatemapping(s3_t *s3) if (s3->chip >= S3_86C928) { s3->linear_base = (svga->crtc[0x5a] << 16) | (svga->crtc[0x59] << 24); - if (s3->chip <= S3_86C805) { + if (s3->chip <= S3_86C805I) { if (s3->vlb) s3->linear_base &= 0x03ffffff; else if (!s3->pci) @@ -5036,8 +4964,8 @@ s3_updatemapping(s3_t *s3) } svga->fb_only = 1; } else { - svga->fb_only = 0; mem_mapping_disable(&s3->linear_mapping); + svga->fb_only = 0; } /* Memory mapped I/O. */ @@ -5122,11 +5050,10 @@ s3_accel_out(uint16_t port, uint8_t val, void *priv) case 0x4948: case 0x4ae8: s3->accel.advfunc_cntl = val; - if ((s3->chip > S3_86C805) && ((svga->crtc[0x50] & 0xc1) == 0x80)) { - s3->width = (val & 4) ? 1600 : 800; + if ((s3->chip > S3_86C805I) && ((svga->crtc[0x50] & 0xc1) == 0x80)) { svga->fullchange = svga->monitor->mon_changeframecount; svga_recalctimings(svga); - } else if (s3->chip <= S3_86C805) { + } else if (s3->chip <= S3_86C805I) { svga->fullchange = svga->monitor->mon_changeframecount; svga_recalctimings(svga); } @@ -6256,7 +6183,7 @@ s3_accel_in_w(uint16_t port, void *priv) s3->accel_start(8, 1, temp | (temp << 16), 0, s3); } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cur_x & 0x400) temp = (temp >> 8) | (temp << 8); @@ -6266,7 +6193,7 @@ s3_accel_in_w(uint16_t port, void *priv) s3->accel_start(1, 1, 0xffffffff, temp | (temp << 16), s3); } } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cur_x & 0x400) temp = (temp >> 8) | (temp << 8); @@ -6443,6 +6370,7 @@ s3_accel_write_w(uint32_t addr, uint16_t val, void *priv) s3_accel_write_fifo(s3, addr, val); break; default: + s3_log("FIFOWORD Write=%04x, val=%04x.\n", addr & (addr_mask - 1), val); s3_queue(s3, addr & addr_mask, val, FIFO_WRITE_WORD); break; } @@ -6607,6 +6535,7 @@ s3_accel_write_l(uint32_t addr, uint32_t val, void *priv) break; default: + s3_log("FIFOLONG Write=%04x, val=%08x.\n", addr & (addr_mask - 3), val); s3_queue(s3, addr & addr_mask, val, FIFO_WRITE_DWORD); break; } @@ -6962,7 +6891,7 @@ polygon_setup(s3_t *s3) } #define READ(addr, dat) \ - if (((s3->bpp == 0) && !s3->color_16bit) || (s3->bpp == 2)) \ + if (((s3->bpp == 0) && !s3->color_16bit)) \ dat = svga->vram[dword_remap(svga, addr) & s3->vram_mask]; \ else if ((s3->bpp == 1) || s3->color_16bit) \ dat = vram_w[dword_remap_w(svga, addr) & (s3->vram_mask >> 1)]; \ @@ -7807,12 +7736,10 @@ polygon_setup(s3_t *s3) { \ old_dest_dat = dest_dat; \ ROPMIX_READ(dest_dat, pat_dat, src_dat); \ - out = (out & s3->accel.wrt_mask) | (old_dest_dat & ~s3->accel.wrt_mask); \ - out &= 0xFFFFFF; \ } #define WRITE(addr, dat) \ - if (((s3->bpp == 0) && !s3->color_16bit) || (s3->bpp == 2)) { \ + if (((s3->bpp == 0) && !s3->color_16bit)) { \ svga->vram[dword_remap(svga, addr) & s3->vram_mask] = dat; \ svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; \ } else if ((s3->bpp == 1) || s3->color_16bit) { \ @@ -8041,7 +7968,7 @@ s3_visionx68_video_engine_op(uint32_t cpu_dat, s3_t *s3) s3->videoengine.busy = 1; if (host) { - if (idf == 0 && odf == 0) { + if ((idf == 0) && (odf == 0)) { if (s3->bpp == 0) count = 4; else if (s3->bpp == 1) @@ -8093,6 +8020,7 @@ s3_visionx68_video_engine_op(uint32_t cpu_dat, s3_t *s3) s3->videoengine.dx = 0.0; } + s3_log("VideoEngine count=%d.\n", count); while (count) { if (host) { /*Source data is CPU*/ src = cpu_dat; @@ -8235,6 +8163,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi int clip_r = s3->accel.multifunc[4] & 0xfff; int vram_mask = (s3->accel.multifunc[0xa] & 0xc0) == 0xc0; uint32_t mix_mask = 0; + uint8_t *vram_b = svga->vram; uint16_t *vram_w = (uint16_t *) svga->vram; uint32_t *vram_l = (uint32_t *) svga->vram; uint32_t compare = s3->accel.color_cmp; @@ -8279,21 +8208,23 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (!cpu_input) s3->accel.dat_count = 0; - if (cpu_input && (((s3->accel.multifunc[0xa] & 0xc0) != 0x80) || (!(s3->accel.cmd & 0x02)))) { - if ((s3->bpp == 3) && (count == 2)) { - if (s3->accel.dat_count) { - cpu_dat = ((cpu_dat & 0xffff) << 16) | s3->accel.dat_buf; - count = 4; - s3->accel.dat_count = 0; - } else { - s3->accel.dat_buf = cpu_dat & 0xffff; - s3->accel.dat_count = 1; + if (cpu_input) { + if (((s3->accel.multifunc[0xa] & 0xc0) != 0x80) || (!(s3->accel.cmd & 0x02))) { + if ((s3->bpp == 3) && (count == 2)) { + if (s3->accel.dat_count) { + cpu_dat = ((cpu_dat & 0xffff) << 16) | s3->accel.dat_buf; + count = 4; + s3->accel.dat_count = 0; + } else { + s3->accel.dat_buf = cpu_dat & 0xffff; + s3->accel.dat_count = 1; + } } + if ((s3->bpp == 1) || s3->color_16bit) + count >>= 1; + else if (s3->bpp == 3) + count >>= 2; } - if ((s3->bpp == 1) || s3->color_16bit) - count >>= 1; - else if (s3->bpp == 3) - count >>= 2; } if ((s3->bpp == 0) && !s3->color_16bit) @@ -8327,7 +8258,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi /*Bit 4 of the Command register is the draw yes bit, which enables writing to memory/reading from memory when enabled. When this bit is disabled, no writing to memory/reading from memory is allowed. (This bit is almost meaningless on the NOP command)*/ - s3_log("CMD=%d, full=%04x, s3bpp=%x, clr=%d, clb=%d, sourcedisplay=%02x, mmio=%02x, srcbase=%08x, dstbase=%08x, cpu=%04x, mix=%04x, count=%d, rd_mask=%04x, wrt_mask=%04x, width=%d, s=%d,%d, c=%d,%d, d=%d,%d, 16bitcolor=%x, frgdcolor=%04x, bkgdcolor=%04x, frgdsel=%d, bkgdsel=%d, frgdmix=%02x, curx=%d, cury=%d, cll=%d, b2e8pix=%x.\n", cmd, s3->accel.cmd, s3->bpp, clip_r, clip_b, s3->accel.multifunc[0x0a] & 0xc4, svga->crtc[0x53] & 0x18, srcbase, dstbase, cpu_dat & 0xffff, mix_dat & 0xffff, count, rd_mask, wrt_mask, s3->width, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->color_16bit, frgd_color, bkgd_color, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.cur_x, s3->accel.cur_y, clip_l, s3->accel.b2e8_pix); + s3_log("CMD=%d, full=%04x, cnt=%d, s3bpp=%x, clr=%d, clb=%d, sourcedisplay=%02x, mmio=%02x, srcbase=%08x, dstbase=%08x, cpu=%08x, mix=%08x, count=%d, rd_mask=%08x, wrt_mask=%08x, width=%d, s=%d,%d, c=%d,%d, d=%d,%d, 16bitcolor=%x, frgdcolor=%08x, bkgdcolor=%08x, frgdsel=%d, bkgdsel=%d, frgdmix=%02x, curx=%d, cury=%d, cll=%d, b2e8pix=%x.\n", cmd, s3->accel.cmd, count, s3->bpp, clip_r, clip_b, s3->accel.multifunc[0x0a] & 0xc4, svga->crtc[0x53] & 0x18, srcbase, dstbase, cpu_dat & 0xffffffff, mix_dat & 0xffffffff, count, rd_mask, wrt_mask, s3->width, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy, s3->accel.destx_distp, s3->accel.desty_axstp, s3->color_16bit, frgd_color, bkgd_color, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.cur_x, s3->accel.cur_y, clip_l, s3->accel.b2e8_pix); switch (cmd) { case 0: /*NOP (Short Stroke Vectors)*/ @@ -8444,6 +8375,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.cx *= 3; + s3->accel.cy *= 3; + } + s3->accel.sy = s3->accel.maj_axis_pcnt; if ((s3->bpp == 0) && s3->color_16bit) { s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00) && rd_mask; @@ -8468,7 +8404,120 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } if (s3->accel.cmd & 0x08) { /*Radial*/ - if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->bpp == 2) { + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if ((rd_mask == 0x0000ffff) || (rd_mask == 0x000000ff)) + rd_mask = 0xffffffff; + + while (count-- && (s3->accel.sy >= 0)) { + if ((s3->accel.cx & 0xfff) >= (clip_l * 3) && (s3->accel.cx & 0xfff) <= (clip_r * 3) && (s3->accel.cy & 0xfff) >= (clip_t * 3) && (s3->accel.cy & 0xfff) <= (clip_b * 3)) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = 0; + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + dest_dat = (*(uint32_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask]) & 0xffffff; + + old_dest_dat = dest_dat; + MIX + + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx + 1 - (s3->accel.minus * 3)) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx + 2 - (s3->accel.minus * 3)) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[(((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } + } + + mix_dat <<= 1; + mix_dat |= 1; + cpu_dat >>= 16; + + if (!s3->accel.sy) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) + s3->accel.color_16bit_check = 0; + else + s3->accel.color_16bit_check = 1; + } + break; + } + + switch (s3->accel.cmd & 0xe0) { + case 0x00: + s3->accel.cx += 3; + break; + case 0x20: + s3->accel.cx += 3; + s3->accel.cy -= 3; + break; + case 0x40: + s3->accel.cy -= 3; + break; + case 0x60: + s3->accel.cx -= 3; + s3->accel.cy -= 3; + break; + case 0x80: + s3->accel.cx -= 3; + break; + case 0xa0: + s3->accel.cx -= 3; + s3->accel.cy += 3; + break; + case 0xc0: + s3->accel.cy += 3; + break; + case 0xe0: + s3->accel.cx += 3; + s3->accel.cy += 3; + break; + + default: + break; + } + s3->accel.sy--; + s3->accel.cx &= 0xfff; + s3->accel.cy &= 0xfff; + } + s3->accel.cur_x = (s3->accel.cx / 3) & 0xfff; + s3->accel.cur_y = (s3->accel.cy / 3) & 0xfff; + break; + } + + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); @@ -8589,7 +8638,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Pattern on pixtrans (911/924)*/ count = s3->accel.maj_axis_pcnt + 1; s3->accel.temp_cnt = 16; - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); @@ -8605,7 +8654,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); @@ -8625,6 +8674,132 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (!s3->accel.b2e8_pix) s3_log("CMDFULL=%04x, FRGDMIX=%x, FRGDCOLR=%04x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, CLIPT=%d, CLIPB=%d.\n", s3->accel.cmd, frgd_mix, s3->accel.frgd_color, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, clip_t, clip_b); + if (s3->bpp == 2) { + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if ((rd_mask == 0x0000ffff) || (rd_mask == 0x000000ff)) + rd_mask = 0xffffffff; + + while (count-- && (s3->accel.sy >= 0)) { + if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { + mix_dat >>= 16; + s3->accel.temp_cnt = 16; + } + + if (s3->accel.minus) + s3_log("Total pixel cx=%d, cy=%d.\n", s3->accel.cx - s3->accel.minus, s3->accel.cy); + + if ((s3->accel.cx & 0xfff) >= (clip_l * 3) && (s3->accel.cx & 0xfff) <= (clip_r * 3) && (s3->accel.cy & 0xfff) >= (clip_t * 3) && (s3->accel.cy & 0xfff) <= (clip_b * 3)) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = 0; + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + dest_dat = (*(uint32_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask]) & 0xffffff; + + old_dest_dat = dest_dat; + MIX + + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx + 1 - (s3->accel.minus * 3)) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx + 2 - (s3->accel.minus * 3)) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[(((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } + } + + if (s3->accel.b2e8_pix && s3_cpu_src(s3)) { + if (s3->accel.temp_cnt > 0) { + s3->accel.temp_cnt--; + mix_dat <<= 1; + mix_dat |= 1; + } + } else { + mix_dat <<= 1; + mix_dat |= 1; + } + + cpu_dat >>= 16; + + if (!s3->accel.sy) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) + s3->accel.color_16bit_check = 0; + else + s3->accel.color_16bit_check = 1; + } + break; + } + + if (s3->accel.cmd & 0x40) { + if (s3->accel.cmd & 0x80) + s3->accel.cy += 3; + else + s3->accel.cy -= 3; + + if (s3->accel.err_term >= s3->accel.maj_axis_pcnt) { + s3->accel.err_term += s3->accel.destx_distp; + if (s3->accel.cmd & 0x20) + s3->accel.cx += 3; + else + s3->accel.cx -= 3; + } else + s3->accel.err_term += s3->accel.desty_axstp; + } else { + if (s3->accel.cmd & 0x20) + s3->accel.cx += 3; + else + s3->accel.cx -= 3; + + if (s3->accel.err_term >= s3->accel.maj_axis_pcnt) { + s3->accel.err_term += s3->accel.destx_distp; + if (s3->accel.cmd & 0x80) + s3->accel.cy += 3; + else + s3->accel.cy -= 3; + } else + s3->accel.err_term += s3->accel.desty_axstp; + } + + s3->accel.sy--; + s3->accel.cx &= 0xfff; + s3->accel.cy &= 0xfff; + } + s3->accel.cur_x = (s3->accel.cx / 3) & 0xfff; + s3->accel.cur_y = (s3->accel.cy / 3) & 0xfff; + break; + } while (count-- && (s3->accel.sy >= 0)) { if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { mix_dat >>= 16; @@ -8754,11 +8929,20 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.cx *= 3; + s3->accel.cy *= 3; + } else if ((s3->bpp == 0) && (svga->bpp == 24)) + s3_log("24bpp 80x rectfill: BKGDCOLOR=%04x, FRGDCOLOR=%04x.\n", bkgd_color, frgd_color); + s3->accel.dest = dstbase + s3->accel.cy * s3->width; if ((s3->bpp == 0) && s3->color_16bit) { + if (!rd_mask && (clip_r == 0x7ff)) + rd_mask = 0xff; + s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00) && rd_mask; - s3_log("CMD2: RDMASK16CHECK=%d, rdmask=%04x.\n", s3->accel.rd_mask_16bit_check, rd_mask); + s3_log("CMD2: %04X: RDMASK16CHECK=%d, rdmask=%04x, clip_r=%04x.\n", s3->accel.cmd, s3->accel.rd_mask_16bit_check, rd_mask, clip_r); if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cmd == 0x41b3) { if (frgd_mix == 0) { @@ -8822,19 +9006,21 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Pattern on pixtrans (911/924)*/ count = s3->accel.maj_axis_pcnt + 1; s3->accel.temp_cnt = 16; - if (s3->accel.rd_mask_16bit_check) { - if (s3->accel.minus) { - wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); - frgd_color = (s3->accel.frgd_color_actual[1] << 8); - bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); - } else { - wrt_mask = s3->accel.wrt_mask_actual[0]; - frgd_color = s3->accel.frgd_color_actual[0]; - bkgd_color = s3->accel.bkgd_color_actual[0]; - } - rd_mask &= 0x00ff; - } else if (!s3->accel.rd_mask_16bit_check && (s3->accel.cur_x & 0x400)) - break; + if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) { + wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); + frgd_color = (s3->accel.frgd_color_actual[1] << 8); + bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); + } else { + wrt_mask = s3->accel.wrt_mask_actual[0]; + frgd_color = s3->accel.frgd_color_actual[0]; + bkgd_color = s3->accel.bkgd_color_actual[0]; + } + rd_mask &= 0x00ff; + } else if (!s3->accel.rd_mask_16bit_check && (s3->accel.cur_x & 0x400)) + break; + } } else { if ((s3->bpp == 0) && s3->color_16bit) { if (s3->accel.cmd == 0x41b3) { @@ -8884,7 +9070,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3_log("FIXME: S3 911/924 15/16bpp documentation needed.\n"); } else { if (!cpu_input && (s3->accel.cur_x & 0x400)) { - s3_log("No Input.\n"); + s3_log("No Input on %04x.\n", s3->accel.cmd); break; } else if (cpu_input && (s3->accel.cmd == 0x53b3) && (s3->accel.cur_x & 0x400)) break; @@ -8896,6 +9082,123 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3_log("CMDFULL=%04x, FRGDSEL=%x, BKGDSEL=%x, FRGDMIX=%02x, BKGDMIX=%02x, MASKCHECK=%x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, DX=%d, DY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, OVERFLOW=%d, pitch=%d.\n", s3->accel.cmd, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.bkgd_mix & 0x0f, s3->accel.rd_mask_16bit_check, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, (s3->accel.destx_overflow & 0xc00) == 0xc00, s3->width); + if ((s3->bpp == 2) || (svga->bpp == 24)) { + int multiplier = 1; + if (s3->bpp == 2) { + multiplier = 3; + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if ((rd_mask == 0x0000ffff) || (rd_mask == 0x000000ff)) + rd_mask = 0xffffffff; + } + + while (count-- && (s3->accel.sy >= 0)) { + if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { + mix_dat >>= 16; + s3->accel.temp_cnt = 16; + } + + if ((((s3->accel.cx >= (clip_l * multiplier)) && (s3->accel.cx <= (clip_r * multiplier)) && (s3->accel.cy >= (clip_t * multiplier)) && (s3->accel.cy <= (clip_b * multiplier))) && !(s3->accel.multifunc[0xe] & 0x20)) || + (((s3->accel.cx < (clip_l * multiplier)) && (s3->accel.cx > (clip_r * multiplier)) && (s3->accel.cy < (clip_t * multiplier)) && (s3->accel.cy > (clip_b * multiplier))) && (s3->accel.multifunc[0xe] & 0x20)) ) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = 0; + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + if (s3->bpp == 2) + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask]) & 0xffffff; + else { + READ(s3->accel.dest + s3->accel.cx, dest_dat); + } + + old_dest_dat = dest_dat; + MIX + + if (s3->accel.cmd & 0x10) { + if (s3->bpp == 2) { + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.cx) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.cx + 1) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.cx + 2) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.cx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } else { + WRITE(s3->accel.dest + s3->accel.cx, dest_dat); + } + } + } + } + + mix_dat <<= 1; + mix_dat |= 1; + + cpu_dat >>= 16; + + if (s3->accel.cmd & 0x20) + s3->accel.cx += multiplier; + else + s3->accel.cx -= multiplier; + + s3->accel.cx &= 0xfff; + s3->accel.sx--; + if (s3->accel.sx < 0) { + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.cx *= multiplier; + + if (s3->accel.cmd & 0x80) + s3->accel.cy += multiplier; + else + s3->accel.cy -= multiplier; + + s3->accel.cy &= 0xfff; + s3->accel.dest = dstbase + s3->accel.cy * s3->width; + + s3->accel.sy--; + + if (cpu_input) + return; + + if (s3->accel.sy < 0) { + s3->accel.cur_x = s3->accel.cx / multiplier; + s3->accel.cur_y = s3->accel.cy / multiplier; + return; + } + } + } + break; + } + while (count-- && (s3->accel.sy >= 0)) { if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { mix_dat >>= 16; @@ -9151,7 +9454,6 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi case 6: /*BitBlt*/ if (!cpu_input) { /*!cpu_input is trigger to start operation*/ s3->accel.minus = 0; - s3->accel.minus_src_24bpp = 0; s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; s3->accel.sy = s3->accel.multifunc[0] & 0xfff; @@ -9161,6 +9463,18 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.dx *= 3; + s3->accel.dy *= 3; + s3->accel.cx *= 3; + s3->accel.cy *= 3; + s3->accel.blit_24bpp = 0; + } else if ((s3->bpp == 0) && (svga->bpp == 24)) { + s3_log("BitBLT bpp%d: 24bpp params=%04x, dwidth=%d, dheight=%d, swidth=%d, sheight=%d, lwidth=%d, lheight=%d, srcbase=%08x, dstbase=%08x, blit24 times=%d, moddx=%d, modcx=%d.\n", s3->bpp, s3->accel.cmd, s3->accel.dx / 3, s3->accel.dy, s3->accel.cx / 3, s3->accel.cy, s3->accel.sx / 3, s3->accel.sy, srcbase, dstbase, s3->accel.blit_24bpp, s3->accel.dx % 3, s3->accel.cx % 3); + s3->accel.blit_24bpp = (s3->accel.blit_24bpp + 1) & 3; + } else + s3->accel.blit_24bpp = 0; + if ((s3->bpp == 0) && s3->color_16bit) { s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00) && rd_mask; s3_log("CMD6: RDMASK16CHECK=%d.\n", s3->accel.rd_mask_16bit_check); @@ -9193,7 +9507,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/ - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit)) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); @@ -9211,6 +9525,203 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3_log("CMDFULL=%04x, FRGDSEL=%x, BKGDSEL=%x, FRGDMIX=%02x, BKGDMIX=%02x, MASKCHECK=%x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, DX=%d, DY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, OVERFLOW=%d, pitch=%d.\n", s3->accel.cmd, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.bkgd_mix & 0x0f, s3->accel.rd_mask_16bit_check, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, (s3->accel.destx_overflow & 0xc00) == 0xc00, s3->width); + if ((s3->bpp == 2) || (svga->bpp == 24)) { + int multiplier = 1; + if (s3->bpp == 2) { + multiplier = 3; + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if (rd_mask == 0x0000ffff) + rd_mask = 0xffffffff; + } + + if (!cpu_input && (frgd_mix == 3) && !vram_mask && !(s3->accel.multifunc[0xe] & 0x100) && ((s3->accel.cmd & 0xa0) == 0xa0) && ((s3->accel.frgd_mix & 0xf) == 7) && ((s3->accel.bkgd_mix & 0xf) == 7)) { + s3_log("Special BitBLT24, wrtmask=%04x.\n", wrt_mask); + while (1) { + if ((s3->accel.dx >= (clip_l * multiplier)) && (s3->accel.dx <= (clip_r * multiplier)) && (s3->accel.dy >= (clip_t * multiplier)) && (s3->accel.dy <= (clip_b * multiplier))) { + if (s3->bpp == 2) { + src_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask]) & 0xffffff; + } else { + READ(s3->accel.src + s3->accel.cx, src_dat); + READ(s3->accel.dest + s3->accel.dx, dest_dat); + } + dest_dat = (src_dat & wrt_mask) | (dest_dat & ~wrt_mask); + + if (s3->accel.cmd & 0x10) { + s3_log("CMD6 special bitblt24 bpp%d: dest=%02x, src=%06x, dx=%d, dy=%d, cx=%d, cy=%d, sx=%d, sy=%d.\n", s3->bpp, dest_dat, src_dat, s3->accel.dx, s3->accel.dy, s3->accel.cx, s3->accel.cy, s3->accel.sx, s3->accel.sy); + if (s3->bpp == 2) { + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 1) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 2) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.dx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } else { + WRITE(s3->accel.dest + s3->accel.dx, dest_dat); + } + } + } + + s3->accel.cx += multiplier; + s3->accel.dx += multiplier; + s3->accel.sx--; + + s3->accel.dx &= 0xfff; + + if (s3->accel.sx < 0) { + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.dx = s3->accel.destx_distp & 0xfff; + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + + s3->accel.cx *= multiplier; + s3->accel.dx *= multiplier; + + s3->accel.cy += multiplier; + s3->accel.dy += multiplier; + + s3->accel.src = srcbase + (s3->accel.cy * s3->width); + s3->accel.dest = dstbase + (s3->accel.dy * s3->width); + + s3->accel.sy--; + + if (s3->accel.sy < 0) { + s3->accel.destx_distp = s3->accel.dx / multiplier; + s3->accel.desty_axstp = s3->accel.dy / multiplier; + return; + } + } + } + } else { + s3_log("Normal24 blit, srcbase=%08x, dstbase=%08x, full=%04x, wrt_mask=%08x, extmultifunc0e=%03x, frgdmixval=%02x.\n", srcbase, dstbase, s3->accel.cmd, wrt_mask, s3->accel.multifunc[0x0e] & 0x180, s3->accel.frgd_mix); + while (count-- && (s3->accel.sy >= 0)) { + if ((s3->accel.dx >= (clip_l * multiplier)) && (s3->accel.dx <= (clip_r * multiplier)) && ((s3->accel.dy >= clip_t * multiplier)) && (s3->accel.dy <= (clip_b * multiplier))) { + if (vram_mask && (s3->accel.cmd & 0x10)) { + if (s3->bpp == 2) + mix_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + else { + READ(s3->accel.src + s3->accel.cx, mix_dat); + } + mix_dat = ((mix_dat & rd_mask) == rd_mask); + mix_dat = mix_dat ? mix_mask : 0; + } + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + if (s3->bpp == 2) + src_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + else { + READ(s3->accel.src + s3->accel.cx, src_dat); + } + if (vram_mask && (s3->accel.cmd & 0x10)) + src_dat = ((src_dat & rd_mask) == rd_mask); + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + if (s3->bpp == 2) + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask]) & 0xffffff; + else { + READ(s3->accel.dest + s3->accel.dx, dest_dat); + } + + old_dest_dat = dest_dat; + MIX + + if ((!(s3->accel.cmd & 0x10) && vram_mask) || (s3->accel.cmd & 0x10)) { + s3_log("CMD6 %04x: normal bitblt24 bpp%d: dest=%02x, src=%02x, old=%02x, dx=%d, dy=%d, cx=%d, cy=%d, sx=%d, sy=%d, moddx=%d, modcx=%d, frgdmix=%02x, bkgdmix=%02x.\n", s3->accel.cmd, s3->bpp, dest_dat, src_dat, old_dest_dat, s3->accel.dx / 3, s3->accel.dy, s3->accel.cx / 3, s3->accel.cy, s3->accel.sx / 3, s3->accel.sy, s3->accel.dx % 3, s3->accel.cx % 3, s3->accel.frgd_mix, s3->accel.bkgd_mix); + if (s3->bpp == 2) { + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 1) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 2) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.dx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } else { + if (s3->accel.blit_24bpp == 5) { + WRITE(s3->accel.dest + s3->accel.dx, dest_dat); + } + } + } + } + } + + mix_dat <<= 1; + mix_dat |= 1; + + cpu_dat >>= 16; + + if (s3->accel.cmd & 0x20) { + s3->accel.cx += multiplier; + s3->accel.dx += multiplier; + } else { + s3->accel.cx -= multiplier; + s3->accel.dx -= multiplier; + } + + s3->accel.dx &= 0xfff; + + s3->accel.sx--; + if (s3->accel.sx < 0) { + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.dx = s3->accel.destx_distp & 0xfff; + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + + s3->accel.cx *= multiplier; + s3->accel.dx *= multiplier; + + if (s3->accel.cmd & 0x80) { + s3->accel.cy += multiplier; + s3->accel.dy += multiplier; + } else { + s3->accel.cy -= multiplier; + s3->accel.dy -= multiplier; + } + + s3->accel.src = srcbase + s3->accel.cy * s3->width; + s3->accel.dest = dstbase + s3->accel.dy * s3->width; + + s3->accel.sy--; + + if (cpu_input) + return; + + if (s3->accel.sy < 0) { + s3->accel.destx_distp = s3->accel.dx / multiplier; + s3->accel.desty_axstp = s3->accel.dy / multiplier; + return; + } + } + } + } + break; + } + if (!cpu_input && (frgd_mix == 3) && !vram_mask && !(s3->accel.multifunc[0xe] & 0x100) && ((s3->accel.cmd & 0xa0) == 0xa0) && ((s3->accel.frgd_mix & 0xf) == 7) && ((s3->accel.bkgd_mix & 0xf) == 7)) { s3_log("Special BitBLT.\n"); while (1) { @@ -9398,6 +9909,13 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.dx *= 3; + s3->accel.dy *= 3; + s3->accel.cx *= 3; + s3->accel.cy *= 3; + } + /*Align source with destination*/ s3->accel.pattern = (s3->accel.cy * s3->width) + s3->accel.cx; s3->accel.dest = dstbase + s3->accel.dy * s3->width; @@ -9411,6 +9929,119 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/ + if (s3->bpp == 2) { + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if (rd_mask == 0x0000ffff) + rd_mask = 0xffffffff; + + while (count-- && (s3->accel.sy >= 0)) { + if ((s3->accel.dx >= (clip_l * 3)) && (s3->accel.dx <= (clip_r * 3)) && (s3->accel.dy >= (clip_t * 3)) && (s3->accel.dy <= (clip_b * 3))) { + if (vram_mask) { + mix_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + mix_dat = ((mix_dat & rd_mask) == rd_mask); + mix_dat = mix_dat ? mix_mask : 0; + } + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + if (vram_mask) + src_dat = ((src_dat & rd_mask) == rd_mask); + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask]) & 0xffffff; + + old_dest_dat = dest_dat; + MIX + + if (s3->accel.cmd & 0x10) { + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 1) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 2) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.dx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } + } + } + + mix_dat <<= 1; + mix_dat |= 1; + cpu_dat >>= 16; + + if (s3->accel.cmd & 0x20) { + s3->accel.cx = ((s3->accel.cx + 3) & 7) | (s3->accel.cx & ~7); + s3->accel.dx += 3; + } else { + s3->accel.cx = ((s3->accel.cx - 3) & 7) | (s3->accel.cx & ~7); + s3->accel.dx -= 3; + } + s3->accel.dx &= 0xfff; + s3->accel.sx--; + if (s3->accel.sx < 0) { + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.dx = s3->accel.destx_distp & 0xfff; + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + + s3->accel.cx *= 3; + s3->accel.dx *= 3; + + if (s3->accel.cmd & 0x80) { + s3->accel.cy = ((s3->accel.cy + 3) & 7) | (s3->accel.cy & ~7); + s3->accel.dy += 3; + } else { + s3->accel.cy = ((s3->accel.cy - 3) & 7) | (s3->accel.cy & ~7); + s3->accel.dy -= 3; + } + + s3->accel.src = srcbase + s3->accel.pattern + (s3->accel.cy * s3->width); + s3->accel.dest = dstbase + s3->accel.dy * s3->width; + + s3->accel.sy--; + + if (cpu_input) + return; + + if (s3->accel.sy < 0) { + s3->accel.destx_distp = s3->accel.dx / 3; + s3->accel.desty_axstp = s3->accel.dy / 3; + return; + } + } + } + break; + } + while (count-- && (s3->accel.sy >= 0)) { if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { if (vram_mask) { @@ -9756,8 +10387,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi case 14: /*ROPBlt (Vision868/968 only)*/ ; - uint32_t mono_pattern[64] = { 0 }; - if (s3->chip != S3_VISION968 && s3->chip != S3_VISION868) + uint32_t mono_pattern[8][8] = { 0 }; + int use_rop_mix = 0; + uint32_t vram_dat = 0; + + if ((s3->chip != S3_VISION968) && (s3->chip != S3_VISION868)) break; if (!cpu_input) /*!cpu_input is trigger to start operation*/ @@ -9774,18 +10408,26 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.px = s3->accel.pat_x & 0xfff; s3->accel.py = s3->accel.pat_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.dx *= 3; + s3->accel.dy *= 3; + s3->accel.cx *= 3; + s3->accel.cy *= 3; + s3->accel.px *= 3; + s3->accel.py *= 3; + } + s3->accel.dest = dstbase + (s3->accel.dy * s3->width); s3->accel.src = srcbase + (s3->accel.cy * s3->width); s3->accel.pattern = (s3->accel.py * s3->width); - s3_log("ROPBLT=%04x, PIXCntl=%04x, Misc1=%04x, PATBKGDCOL=%08x, PATFRGDCOL=%08x, COLBKGDCOL=%08x, COLFRGDCOL=%08x, PX=%d, PY=%d, DX=%d, DY=%d, CX=%d, CY=%d, FRGDSEL=%x, BKGDSEL=%x, RDMASK=%08x, WRTMASK=%08x, ROPMIX=%03x, pitch=%d.\n", s3->accel.cmd, s3->accel.multifunc[0xa], s3->accel.multifunc[0xe], s3->accel.pat_bg_color, s3->accel.pat_fg_color, s3->accel.bkgd_color, s3->accel.frgd_color, s3->accel.px, s3->accel.py, s3->accel.dx, s3->accel.dy, s3->accel.cx, s3->accel.cy, frgd_mix, bkgd_mix, s3->accel.rd_mask, s3->accel.wrt_mask, s3->accel.ropmix, s3->width); + + s3_log("ROPBLT=%04x, BPP=%d, PIXCntl=%04x, Misc1=%04x, PATBKGDCOL=%08x, PATFRGDCOL=%08x, COLBKGDCOL=%08x, COLFRGDCOL=%08x, SX=%d, SY=%d, PX=%d, PY=%d, DX=%d, DY=%d, CX=%d, CY=%d, FRGDSEL=%02x, BKGDSEL=%02x, RDMASK=%08x, WRTMASK=%08x, ROPMIX=%03x, pitch=%d.\n", s3->accel.cmd, s3->bpp, s3->accel.multifunc[0xa], s3->accel.multifunc[0xe], s3->accel.pat_bg_color, s3->accel.pat_fg_color, s3->accel.bkgd_color, s3->accel.frgd_color, s3->accel.sx, s3->accel.sy, s3->accel.pat_x, s3->accel.pat_y, s3->accel.dx, s3->accel.dy, s3->accel.cx, s3->accel.cy, s3->accel.frgd_mix, s3->accel.bkgd_mix, s3->accel.rd_mask, s3->accel.wrt_mask, s3->accel.ropmix, s3->width); } if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/ if (s3->accel.ropmix & 0x100) { - int x; - int y; switch (s3->accel.cmd & 0x600) { case 0x000: case 0x600: @@ -9798,13 +10440,246 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } - for (y = 0; y < 8; y++) { - for (x = 0; x < 8; x++) { - mono_pattern[y * 8 + (7 - x)] = (mix_dat & (1 << (x + y * 8))) & 0x80000000; + if (cpu_input) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { + if ((frgd_mix < 2) || (bkgd_mix < 2)) + use_rop_mix = 3; + } else { + if ((frgd_mix == 2) || (bkgd_mix == 2)) + use_rop_mix = 2; + } + } else { + if ((s3->accel.multifunc[0xa] & 0xc0) != 0x80) { + if ((frgd_mix == 3) || (bkgd_mix == 3)) + use_rop_mix = 1; + } + } + + if (use_rop_mix == 3) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + mono_pattern[y][7 - x] = (mix_dat & (1 << (x + y * 8))) & 0x80000000; + } + } + } else if (use_rop_mix == 2) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + mono_pattern[y][7 - x] = (cpu_dat & (1 << (x + y * 8))) & 0x80000000; + } + } + } else if (use_rop_mix <= 1) { + if (use_rop_mix == 0) + frgd_mix = 3; + + if (s3->bpp == 2) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + vram_dat = (*(uint32_t *) &vram_b[(((s3->accel.py + (y * 3)) * s3->width) + s3->accel.px + (x * 3)) & s3->vram_mask]) & 0xffffff; + if ((s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x800000; + else if (!(s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x800000); + else if ((s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x800000); + else if (!(s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x800000; + + if (s3->accel.pat_bg_color != s3->accel.pat_fg_color) + s3_log("MonoPattern Screen=%08x, y=%d, x=%d, sel=%08x, vram=%08x.\n", mono_pattern[y][7 - x], y, 7 - x, vram_dat & 0x800000, vram_dat); + } + } + } else if (s3->bpp == 1) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + vram_dat = vram_w[(((s3->accel.py + y) * s3->width) + s3->accel.px + x) & (s3->vram_mask >> 1)]; + if ((s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x8000; + else if (!(s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x8000); + else if ((s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x8000); + else if (!(s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x80000; + } + } + } else if (s3->bpp == 3) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + vram_dat = vram_l[(((s3->accel.py + y) * s3->width) + s3->accel.px + x) & (s3->vram_mask >> 2)]; + if ((s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x80000000; + else if (!(s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x80000000); + else if ((s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x80000000); + else if (!(s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x80000000; + } + } + } else { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + vram_dat = svga->vram[(((s3->accel.py + y) * s3->width) + s3->accel.px + x) & s3->vram_mask]; + if ((s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x800; + else if (!(s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x80); + else if ((s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x80); + else if (!(s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x80; + } + } } } } - while (count-- && s3->accel.sy >= 0) { + + if (s3->bpp == 2) { + wrt_mask = s3->accel.wrt_mask; + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + + while (count-- && (s3->accel.sy >= 0)) { + if ((s3->accel.dx >= (clip_l * 3)) && (s3->accel.dx <= (clip_r * 3)) && (s3->accel.dy >= (clip_t * 3)) && (s3->accel.dy <= (clip_b * 3))) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = s3->accel.bkgd_color; + break; + case 1: + src_dat = s3->accel.frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + break; + + default: + break; + } + + if (s3->accel.ropmix & 0x100) { /*Mono pattern used*/ + if (use_rop_mix <= 1) { + pat_dat = mono_pattern[(s3->accel.py / 3) & 7][(s3->accel.px / 3) & 7] ? s3->accel.pat_fg_color : s3->accel.pat_bg_color; + if (s3->accel.pat_bg_color != s3->accel.pat_fg_color) + s3_log("PatternData=%06x, PX=%d, PY=%d, MonoSel=%06x.\n", pat_dat, (s3->accel.px / 3) & 7, (s3->accel.py / 3) & 7, vram_dat); + } else { + switch (mono_pattern[(s3->accel.py / 3) & 7][(s3->accel.px / 3) & 7] ? (frgd_mix & 1) : (bkgd_mix & 1)) { + case 0: + pat_dat = s3->accel.pat_bg_color; + break; + case 1: + pat_dat = s3->accel.pat_fg_color; + break; + default: + break; + } + } + } else { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + pat_dat = s3->accel.bkgd_color; + break; + case 1: + pat_dat = s3->accel.frgd_color; + break; + case 2: + pat_dat = cpu_dat; + break; + case 3: + pat_dat = (*(uint32_t *) &vram_b[(s3->accel.pattern + s3->accel.px) & s3->vram_mask]) & 0xffffff; + break; + + default: + break; + } + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask]) & 0xffffff; + + ROPMIX + out = (out & wrt_mask) | (old_dest_dat & ~wrt_mask); + + if (s3->accel.cmd & 0x10) { + s3_log("ROPBLT24 ROPSET=%03x, DX=%d, DY=%d, OUT=%02x, SRCC=%08x, DSTC=%08x.\n", s3->accel.ropmix, s3->accel.dx, s3->accel.dy, out, (s3->accel.src + s3->accel.cx) & (s3->vram_mask >> 2), (s3->accel.dest + s3->accel.dx) & (s3->vram_mask >> 2)); + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask] = out & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 1) & s3->vram_mask] = (out >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 2) & s3->vram_mask] = (out >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.dx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } + } + } + + mix_dat <<= 1; + mix_dat |= 1; + + cpu_dat >>= 16; + + if (s3->accel.cmd & 0x20) { + s3->accel.cx += 3; + s3->accel.dx += 3; + s3->accel.px += 3; + } else { + s3->accel.cx -= 3; + s3->accel.dx -= 3; + s3->accel.px -= 3; + } + s3->accel.sx--; + if (s3->accel.sx < 0) { + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + s3->accel.dx = s3->accel.destx_distp & 0xfff; + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.px = s3->accel.pat_x & 0xfff; + + s3->accel.dx *= 3; + s3->accel.cx *= 3; + s3->accel.px *= 3; + + if (s3->accel.cmd & 0x80) { + s3->accel.cy += 3; + s3->accel.dy += 3; + s3->accel.py += 3; + } else { + s3->accel.cy -= 3; + s3->accel.dy -= 3; + s3->accel.py -= 3; + } + s3->accel.dest = dstbase + (s3->accel.dy * s3->width); + s3->accel.src = srcbase + (s3->accel.cy * s3->width); + s3->accel.pattern = (s3->accel.py * s3->width); + + s3->accel.sy--; + + if (cpu_input) + return; + + if (s3->accel.sy < 0) { + s3->accel.destx_distp = s3->accel.dx / 3; + s3->accel.desty_axstp = s3->accel.dy / 3; + return; + } + } + } + break; + } + while (count-- && (s3->accel.sy >= 0)) { if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: @@ -9825,17 +10700,20 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } if (s3->accel.ropmix & 0x100) { /*Mono pattern used*/ - switch (mono_pattern[(s3->accel.py & 7) * 8 + (s3->accel.px & 7)] ? (frgd_mix & 1) : (bkgd_mix & 1)) { - case 0: - pat_dat = s3->accel.pat_bg_color; - break; - case 1: - pat_dat = s3->accel.pat_fg_color; - break; - default: - break; + if (use_rop_mix <= 1) + pat_dat = mono_pattern[s3->accel.py & 7][s3->accel.px & 7] ? s3->accel.pat_fg_color : s3->accel.pat_bg_color; + else { + switch (mono_pattern[s3->accel.py & 7][s3->accel.px & 7] ? (frgd_mix & 1) : (bkgd_mix & 1)) { + case 0: + pat_dat = s3->accel.pat_bg_color; + break; + case 1: + pat_dat = s3->accel.pat_fg_color; + break; + default: + break; + } } - s3_log("MonoMIX=%08x, PX=%d, PY=%d.\n", mix_dat, s3->accel.px & 7, s3->accel.py & 7); } else { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: @@ -9875,8 +10753,8 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi READ(s3->accel.dest + s3->accel.dx, dest_dat); ROPMIX + out = (out & s3->accel.wrt_mask) | (old_dest_dat & ~s3->accel.wrt_mask); - s3_log("Destination=%08x, Source=%08x, Pattern=%08x, OUT=%08x, mix=%08x, count=%d.\n", dest_dat, src_dat, pat_dat, out, mix_dat, count); if (s3->accel.cmd & 0x10) { WRITE(s3->accel.dest + s3->accel.dx, out); } @@ -9928,8 +10806,9 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.sy--; - if (cpu_input /* && (s3->accel.multifunc[0xa] & 0xc0) == 0x80*/) + if (cpu_input) return; + if (s3->accel.sy < 0) { s3->accel.destx_distp = s3->accel.dx; s3->accel.desty_axstp = s3->accel.dy; @@ -10293,7 +11172,7 @@ s3_init(const device_t *info) break; case S3_WINNER1000_805: bios_fn = ROM_WINNER1000_805; - chip = S3_86C801; + chip = S3_86C805I; video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_86c801); break; case S3_86C805_ONBOARD: @@ -10731,7 +11610,6 @@ s3_init(const device_t *info) s3->id_ext = stepping; s3->id_ext_pci = 0; s3->packed_mmio = 0; - s3->accel.rd_mask = 0xff; svga->ramdac = device_add(&sc11483_ramdac_device); s3->ramdac_type = SC1148X; @@ -10754,7 +11632,6 @@ s3_init(const device_t *info) s3->id_ext = stepping; s3->id_ext_pci = 0; s3->packed_mmio = 0; - s3->accel.rd_mask = 0xff; svga->ramdac = device_add(&sc11483_ramdac_device); s3->ramdac_type = SC1148X; @@ -10776,11 +11653,12 @@ s3_init(const device_t *info) s3->ramdac_type = S3_SDAC; svga->clock_gen = svga->ramdac; svga->getclock = sdac_getclock; + sdac_set_ref_clock(svga->ramdac, 14318184.0f); + svga_recalctimings(svga); break; case S3_SPEA_MIRAGE_86C801: case S3_SPEA_MIRAGE_86C805: - case S3_WINNER1000_805: svga->decode_mask = (2 << 20) - 1; stepping = 0xa2; /*86C801/86C805*/ s3->id = stepping; @@ -10793,8 +11671,24 @@ s3_init(const device_t *info) s3->ramdac_type = ATT49X; svga->clock_gen = device_add(&av9194_device); svga->getclock = av9194_getclock; - if (info->local == S3_WINNER1000_805) - s3->elsa_eeprom = 1; + break; + + case S3_WINNER1000_805: + svga->decode_mask = (2 << 20) - 1; + stepping = 0xa8; /*86C801I/86C805I*/ + s3->id = stepping; + s3->id_ext = stepping; + s3->id_ext_pci = 0; + s3->packed_mmio = 0; + svga->crtc[0x5a] = 0x0a; + + svga->ramdac = device_add(&sdac_ramdac_device); + s3->ramdac_type = S3_SDAC; + svga->clock_gen = svga->ramdac; + svga->getclock = sdac_getclock; + s3->elsa_eeprom = 1; + sdac_set_ref_clock(svga->ramdac, 14318184.0f); + svga_recalctimings(svga); break; case S3_86C805_ONBOARD: @@ -10924,6 +11818,8 @@ s3_init(const device_t *info) s3->ramdac_type = S3_SDAC; svga->clock_gen = svga->ramdac; svga->getclock = sdac_getclock; + sdac_set_ref_clock(svga->ramdac, 14318184.0f); + svga_recalctimings(svga); break; case S3_DIAMOND_STEALTH64_964: @@ -11031,13 +11927,14 @@ s3_init(const device_t *info) svga->clock_gen = device_add(&icd2061_device); svga->getclock = icd2061_getclock; icd2061_set_ref_clock(svga->ramdac, 14318184.0f); - svga_recalctimings(svga); } else { svga->ramdac = device_add(&sdac_ramdac_device); s3->ramdac_type = S3_SDAC; svga->clock_gen = svga->ramdac; svga->getclock = sdac_getclock; + sdac_set_ref_clock(svga->ramdac, 14318184.0f); } + svga_recalctimings(svga); break; case S3_PHOENIX_TRIO32: diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index daf59aea6..dcf380ff8 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -1063,32 +1063,49 @@ s3_virge_updatemapping(virge_t *virge) return; } - switch (svga->gdcreg[6] & 0xc) { /*Banked framebuffer*/ - case 0x0: /*128k at A0000*/ - mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000); - svga->banked_mask = 0xffff; - break; - case 0x4: /*64k at A0000*/ - mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); - svga->banked_mask = 0xffff; - if (xga_active && (svga->xga != NULL)) { - xga->on = 0; - mem_mapping_set_handler(&svga->mapping, svga->read, svga->readw, svga->readl, svga->write, svga->writew, svga->writel); - } - break; - case 0x8: /*32k at B0000*/ - mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000); - svga->banked_mask = 0x7fff; - break; - case 0xC: /*32k at B8000*/ - mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000); - svga->banked_mask = 0x7fff; - break; - } + /*Banked framebuffer*/ + if (svga->crtc[0x31] & 0x08) /*Enhanced mode mappings*/ + { + /* Enhanced mode forces 64kb at 0xa0000*/ + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); + svga->banked_mask = 0xffff; + if (xga_active && (svga->xga != NULL)) { + xga->on = 0; + mem_mapping_set_handler(&svga->mapping, svga->read, svga->readw, svga->readl, svga->write, svga->writew, svga->writel); + } + } else + switch (svga->gdcreg[6] & 0xc) { /*VGA mapping*/ + case 0x0: /*128k at A0000*/ + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000); + svga->banked_mask = 0xffff; + break; + case 0x4: /*64k at A0000*/ + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); + svga->banked_mask = 0xffff; + if (xga_active && (svga->xga != NULL)) { + xga->on = 0; + mem_mapping_set_handler(&svga->mapping, svga->read, svga->readw, svga->readl, svga->write, svga->writew, svga->writel); + } + break; + case 0x8: /*32k at B0000*/ + mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000); + svga->banked_mask = 0x7fff; + break; + case 0xC: /*32k at B8000*/ + mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000); + svga->banked_mask = 0x7fff; + break; + + default: + break; + } virge->linear_base = (svga->crtc[0x5a] << 16) | (svga->crtc[0x59] << 24); if ((svga->crtc[0x58] & 0x10) || (virge->advfunc_cntl & 0x10)) { /*Linear framebuffer*/ + /*Linear framebuffer*/ + mem_mapping_disable(&svga->mapping); + switch (svga->crtc[0x58] & 7) { case 0: /*64k*/ virge->linear_size = 0x10000; @@ -1110,11 +1127,19 @@ s3_virge_updatemapping(virge_t *virge) break; } virge->linear_base &= ~(virge->linear_size - 1); - if (virge->linear_base == 0xa0000) { - mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); + //pclog("CR58 & 7=%x, base=%08x.\n", svga->crtc[0x58] & 7, virge->linear_base); + if ((virge->linear_base == 0xa0000) || (virge->linear_size == 0x10000)) { mem_mapping_disable(&virge->linear_mapping); - } else - mem_mapping_set_addr(&virge->linear_mapping, virge->linear_base, virge->linear_size); + if (!(svga->crtc[0x53] & 0x10)) { + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); + svga->banked_mask = 0xffff; + } + } else { + if (virge->linear_base) + mem_mapping_set_addr(&virge->linear_mapping, virge->linear_base, virge->linear_size); + else + mem_mapping_disable(&virge->linear_mapping); + } svga->fb_only = 1; } else { mem_mapping_disable(&virge->linear_mapping); @@ -1122,6 +1147,7 @@ s3_virge_updatemapping(virge_t *virge) } if ((svga->crtc[0x53] & 0x10) || (virge->advfunc_cntl & 0x20)) { /*Old MMIO*/ + mem_mapping_disable(&svga->mapping); if (svga->crtc[0x53] & 0x20) mem_mapping_set_addr(&virge->mmio_mapping, 0xb8000, 0x8000); else @@ -1129,9 +1155,12 @@ s3_virge_updatemapping(virge_t *virge) } else mem_mapping_disable(&virge->mmio_mapping); - if (svga->crtc[0x53] & 0x08) /*New MMIO*/ - mem_mapping_set_addr(&virge->new_mmio_mapping, virge->linear_base + 0x1000000, 0x10000); - else + if (svga->crtc[0x53] & 0x08) { /*New MMIO*/ + if (virge->linear_base) + mem_mapping_set_addr(&virge->new_mmio_mapping, virge->linear_base + 0x1000000, 0x10000); + else + mem_mapping_disable(&virge->new_mmio_mapping); + } else mem_mapping_disable(&virge->new_mmio_mapping); } @@ -1946,9 +1975,9 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) break; case 0x8190: virge->streams.sec_ctrl = val; - virge->streams.dda_horiz_accumulator = val & 0x7ff; - if (val & 0x800) - virge->streams.dda_horiz_accumulator |= ~0x7ff; + virge->streams.dda_horiz_accumulator = val & 0xfff; + if (val & 0x1000) + virge->streams.dda_horiz_accumulator |= ~0xfff; virge->streams.sdif = (val >> 24) & 7; break; @@ -1961,9 +1990,9 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) if (val & 0x800) virge->streams.k1_horiz_scale |= ~0x7ff; - virge->streams.k2_horiz_scale = (val >> 16) & 0x3ff; - if ((val >> 16) & 0x400) - virge->streams.k2_horiz_scale |= ~0x3ff; + virge->streams.k2_horiz_scale = (val >> 16) & 0x7ff; + if ((val >> 16) & 0x800) + virge->streams.k2_horiz_scale |= ~0x7ff; svga_recalctimings(svga); svga->fullchange = changeframecount; @@ -2019,14 +2048,14 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) virge->streams.k1_vert_scale |= ~0x7ff; break; case 0x81e4: - virge->streams.k2_vert_scale = val & 0x3ff; - if (val & 0x400) - virge->streams.k2_vert_scale |= ~0x3ff; + virge->streams.k2_vert_scale = val & 0x7ff; + if (val & 0x800) + virge->streams.k2_vert_scale |= ~0x7ff; break; case 0x81e8: - virge->streams.dda_vert_accumulator = val & 0x7ff; - if (val & 0x800) - virge->streams.dda_vert_accumulator |= ~0x7ff; + virge->streams.dda_vert_accumulator = val & 0xfff; + if (val & 0x1000) + virge->streams.dda_vert_accumulator |= ~0xfff; svga_recalctimings(svga); svga->fullchange = changeframecount; @@ -3124,7 +3153,7 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) case 0: case CMD_SET_MS: READ(src_addr, source); - if ((virge->s3d.cmd_set & CMD_SET_TP) && source == src_fg_clr) + if ((virge->s3d.cmd_set & CMD_SET_TP) && (source == src_fg_clr)) update = 0; break; case CMD_SET_IDS: @@ -3150,7 +3179,7 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) count = 0; } } - if ((virge->s3d.cmd_set & CMD_SET_TP) && source == src_fg_clr) + if ((virge->s3d.cmd_set & CMD_SET_TP) && (source == src_fg_clr)) update = 0; break; case CMD_SET_IDS | CMD_SET_MS: @@ -4829,7 +4858,7 @@ s3_virge_colorkey(virge_t* virge, uint32_t x, uint32_t y) return true; else if (!(virge->streams.chroma_ctrl & (1 << 28))) return true; - + comp_r = (virge->streams.chroma_ctrl >> 16) & 0xFF; comp_g = (virge->streams.chroma_ctrl >> 8) & 0xFF; comp_b = (virge->streams.chroma_ctrl) & 0xFF; @@ -4853,7 +4882,7 @@ s3_virge_colorkey(virge_t* virge, uint32_t x, uint32_t y) */ uint8_t index = virge->streams.chroma_ctrl & 0xFF; alpha_key = (virge->chip < S3_VIRGEGX2) ? (virge->streams.chroma_ctrl & (1 << 29)) : ((virge->streams.chroma_ctrl >> 29) & 3) == 1; - + if (alpha_key) { comp_r = comp_g = comp_b = index; comp_r_h = comp_g_h = comp_b_h = index; @@ -5188,6 +5217,7 @@ s3_virge_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) svga->crtc[0x59] = (svga->crtc[0x59] & 0x01) | (val & 0xfe); else svga->crtc[0x59] = (svga->crtc[0x59] & 0x03) | (val & 0xfc); + s3_virge_updatemapping(virge); return; diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 35f42c2ee..db8b33e18 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -134,8 +134,8 @@ video_cards[] = { { .device = &s3_phoenix_86c801_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_spea_mirage_86c801_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_winner1000_805_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32i_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32_machspeed_vga_gui_2400s_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32i_axis_microdevice_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, /* MCA */ { .device = &mach32_mca_device, .flags = VIDEO_FLAG_TYPE_8514 }, { .device = &gd5426_mca_device, .flags = VIDEO_FLAG_TYPE_NONE }, @@ -145,12 +145,13 @@ video_cards[] = { /* VLB */ { .device = &mach32_vlb_device, .flags = VIDEO_FLAG_TYPE_8514 }, { .device = &mach64gx_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32i_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32_machspeed_vga_gui_2400s_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32i_hercules_dynamite_pro_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &et4000w32p_videomagic_revb_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_revc_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_cardex_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_noncardex_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_cardex_revc_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_generic_revd_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_cardex_revd_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_diamond_revd_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &gd5424_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &gd5426_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &gd5428_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, @@ -196,11 +197,10 @@ video_cards[] = { { .device = &gd5446_pci_device, .flags = VIDEO_FLAG_TYPE_SECONDARY }, { .device = &gd5446_stb_pci_device, .flags = VIDEO_FLAG_TYPE_SECONDARY }, { .device = &gd5480_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_videomagic_revb_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_revc_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_cardex_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_noncardex_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_cardex_revc_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_generic_revd_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_cardex_revd_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_diamond_revd_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_elsa_winner1000_86c928_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_spea_mercury_lite_86c928_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_diamond_stealth64_964_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index 2fd4ba482..30f76abfa 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -692,6 +692,7 @@ tgui_recalctimings(svga_t *svga) const tgui_t *tgui = (tgui_t *) svga->priv; uint8_t ger22lower = (tgui->accel.ger22 & 0xff); uint8_t ger22upper = (tgui->accel.ger22 >> 8); + int std_vga_clock = 1; if (tgui->type >= TGUI_9440) { if ((svga->crtc[0x38] & 0x19) == 0x09) @@ -767,10 +768,11 @@ tgui_recalctimings(svga_t *svga) svga->clock = (cpuclock * (double) (1ULL << 32)) / (((tgui->clock_n + 8) * 14318180.0) / ((tgui->clock_m + 2) * (1 << tgui->clock_k))); if (svga->gdcreg[0xf] & 0x08) - svga->clock *= 2; + svga->clock *= 2.0; else if (svga->gdcreg[0xf] & 0x40) - svga->clock *= 3; + svga->clock *= 3.0; } else { + //pclog("TGUI9400CXi: Clock double=%d.\n", (((svga->miscout >> 2) & 3) | ((tgui->newctrl2 << 2) & 4) | ((tgui->newctrl2 >> 3) & 8))); switch (((svga->miscout >> 2) & 3) | ((tgui->newctrl2 << 2) & 4) | ((tgui->newctrl2 >> 3) & 8)) { case 0x02: svga->clock = (cpuclock * (double) (1ULL << 32)) / 44900000.0; @@ -816,6 +818,7 @@ tgui_recalctimings(svga_t *svga) break; default: + std_vga_clock = 0; break; } @@ -823,6 +826,9 @@ tgui_recalctimings(svga_t *svga) svga->htotal <<= 1; svga->hdisp <<= 1; svga->hdisp_time <<= 1; + svga->dots_per_clock <<= 1; + if (std_vga_clock) + svga->clock /= 2.0; } } @@ -843,6 +849,7 @@ tgui_recalctimings(svga_t *svga) svga->htotal <<= 1; svga->hdisp <<= 1; svga->hdisp_time <<= 1; + svga->dots_per_clock <<= 1; break; default: break; @@ -866,6 +873,7 @@ tgui_recalctimings(svga_t *svga) svga->htotal <<= 1; svga->hdisp <<= 1; svga->hdisp_time <<= 1; + svga->dots_per_clock <<= 1; } switch (svga->hdisp) { case 640: @@ -880,18 +888,24 @@ tgui_recalctimings(svga_t *svga) break; case 15: svga->render = svga_render_15bpp_highres; - if (tgui->type < TGUI_9440) + if (tgui->type < TGUI_9440) { svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } break; case 16: svga->render = svga_render_16bpp_highres; - if (tgui->type < TGUI_9440) + if (tgui->type < TGUI_9440) { svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } break; case 24: svga->render = svga_render_24bpp_highres; - if (tgui->type < TGUI_9440) - svga->hdisp = (svga->hdisp << 1) / 3; + if (tgui->type < TGUI_9440) { + svga->hdisp /= 3; + svga->dots_per_clock /= 3; + } break; case 32: if (svga->rowoffset == 0x100) From 6e282068b98da8dd5451a3d0ff163b3602724368 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sat, 18 Oct 2025 03:26:11 +0200 Subject: [PATCH 029/113] Corrections to displays (October 18th, 2025) (rebase) (#6358) 1. In the STG code, separated the STG1703 without its built-in clock as 1702 while keeping the one with the clock as 1703. 2. Added the ICS2494AN-324 clock generator used by the et4000w32 series. 3. Return 0x98 as the ID of the ATT498 ramdac. 4. Corrected the pixel clocks of the IBM RGB528 while keeping its current compatibility and exactness of the refresh rates of its clocks. 5. Added a variable reference clock of the SDAC/GenDAC for future use. 6. The clocks of the TVP3026 have been implemented for a while. Some corrections have been made (plus color key r/w). 7. Mach64 enhanced mode doesn't use scrollcache (bits 0-3 of attrregs 0x13), fixes some pixels being off (mainly in win3.1x) 8. Reorganized the cirrus 54xx built-in clock for proper refresh rates. 9. Proper reorganization of the et4000w32 series of chipsets and their cards supporting them, from cursor to clocks to ramdacs plus a 24bpp acceleration fix for the w32p series (about pixels being processed in bitblt). 10. Removed the PCI videomagic card as its bios doesn't have the PCIR header while making sure the plain ISA/VLB w32 and ISA only w32i (now named Axis Microdevice) support 2mb of vram properly. 11. Added the Hercules Dynamite VL Pro based on the w32i chip (and VLB). 12. Initialize the et4000w32 cards with misc bit 0 set as well as crtc31 bit 6 for rs2 connection to the ramdac. 13. Refactored the S3 Pre-ViRGE code to have proper refresh rates and clocks and added the 805I as a member of the chips (ID 0xa8). 14. Replaced the S3 805I Elsa Winner 1000 ISA bios with a more supported one for our code using the SDAC. 15. Added proper 24bpp acceleration to the Visionx68 chips. 16. Fixed wrong colors in the 911/924 15/16bpp acceleration when used for the first time. 17. Match the ViRGE mapping to the pre-ViRGE one per manual/datasheet. 18. Correct as best as possible the TGUI9400 clocks. --- src/include/86box/vid_svga.h | 5 +- src/include/86box/video.h | 24 +- src/video/clockgen/vid_clockgen_ics2494.c | 35 +- src/video/ramdac/vid_ramdac_att20c49x.c | 8 +- src/video/ramdac/vid_ramdac_att2xc498.c | 6 +- src/video/ramdac/vid_ramdac_bt48x.c | 7 +- src/video/ramdac/vid_ramdac_sdac.c | 14 +- src/video/ramdac/vid_ramdac_stg1702.c | 47 +- src/video/ramdac/vid_ramdac_tvp3026.c | 51 +- src/video/vid_ati_mach64.c | 1 + src/video/vid_cl54xx.c | 61 +- src/video/vid_et4000w32.c | 698 ++++---- src/video/vid_s3.c | 1879 +++++++++++++++------ src/video/vid_s3_virge.c | 120 +- src/video/vid_table.c | 24 +- src/video/vid_tgui9440.c | 26 +- 16 files changed, 2072 insertions(+), 934 deletions(-) diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index 61a5697d5..e0ae5ed6f 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -474,6 +474,7 @@ extern uint8_t sc1502x_rs2_ramdac_in(uint16_t addr, int rs2, void *priv, svga_t extern void sdac_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *priv, svga_t *svga); extern uint8_t sdac_ramdac_in(uint16_t addr, int rs2, void *priv, svga_t *svga); extern float sdac_getclock(int clock, void *priv); +extern void sdac_set_ref_clock(void *priv, float ref_clock); extern void stg_ramdac_out(uint16_t addr, uint8_t val, void *priv, svga_t *svga); extern uint8_t stg_ramdac_in(uint16_t addr, void *priv, svga_t *svga); @@ -507,6 +508,7 @@ extern const device_t bt485a_ramdac_device; extern const device_t gendac_ramdac_device; extern const device_t ibm_rgb528_ramdac_device; extern const device_t ics2494an_305_device; +extern const device_t ics2494an_324_device; extern const device_t ati18810_28800_device; extern const device_t ati18811_0_28800_device; extern const device_t ati18811_1_28800_device; @@ -523,7 +525,8 @@ extern const device_t sc11484_nors2_ramdac_device; extern const device_t sc1502x_ramdac_device; extern const device_t sc1502x_rs2_ramdac_device; extern const device_t sdac_ramdac_device; -extern const device_t stg_ramdac_device; +extern const device_t stg1702_ramdac_device; +extern const device_t stg1703_ramdac_device; extern const device_t tkd8001_ramdac_device; extern const device_t tseng_ics5301_ramdac_device; extern const device_t tseng_ics5341_ramdac_device; diff --git a/src/include/86box/video.h b/src/include/86box/video.h index 840b95249..acaf7cdc4 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -436,20 +436,20 @@ extern const device_t et4000_kasan_isa_device; extern const device_t et4000_mca_device; /* Tseng ET4000-W32x */ -extern const device_t et4000w32_device; +extern const device_t et4000w32_machspeed_vga_gui_2400s_isa_device; +extern const device_t et4000w32_machspeed_vga_gui_2400s_vlb_device; extern const device_t et4000w32_onboard_device; -extern const device_t et4000w32i_isa_device; -extern const device_t et4000w32i_vlb_device; +extern const device_t et4000w32i_axis_microdevice_isa_device; +extern const device_t et4000w32i_hercules_dynamite_pro_vlb_device; extern const device_t et4000w32p_videomagic_revb_vlb_device; -extern const device_t et4000w32p_videomagic_revb_pci_device; -extern const device_t et4000w32p_revc_vlb_device; -extern const device_t et4000w32p_revc_pci_device; -extern const device_t et4000w32p_vlb_device; -extern const device_t et4000w32p_pci_device; -extern const device_t et4000w32p_noncardex_vlb_device; -extern const device_t et4000w32p_noncardex_pci_device; -extern const device_t et4000w32p_cardex_vlb_device; -extern const device_t et4000w32p_cardex_pci_device; +extern const device_t et4000w32p_cardex_revc_vlb_device; +extern const device_t et4000w32p_cardex_revc_pci_device; +extern const device_t et4000w32p_cardex_revd_vlb_device; +extern const device_t et4000w32p_cardex_revd_pci_device; +extern const device_t et4000w32p_diamond_revd_vlb_device; +extern const device_t et4000w32p_diamond_revd_pci_device; +extern const device_t et4000w32p_generic_revd_vlb_device; +extern const device_t et4000w32p_generic_revd_pci_device; /* MDSI Genius VHR */ extern const device_t genius_device; diff --git a/src/video/clockgen/vid_clockgen_ics2494.c b/src/video/clockgen/vid_clockgen_ics2494.c index f9f4fbcb1..0776d97ca 100644 --- a/src/video/clockgen/vid_clockgen_ics2494.c +++ b/src/video/clockgen/vid_clockgen_ics2494.c @@ -290,7 +290,7 @@ ics2494_init(const device_t *info) ics2494->freq[15] = 65000000.0; break; case 305: - /* ICS2494A(N)-205 for S3 86C924 */ + /* ICS2494A(N)-305 for S3 86C924 */ ics2494->freq[0x0] = 25175000.0; ics2494->freq[0x1] = 28322000.0; ics2494->freq[0x2] = 40000000.0; @@ -308,6 +308,25 @@ ics2494_init(const device_t *info) ics2494->freq[0xe] = 75000000.0; ics2494->freq[0xf] = 94500000.0; break; + case 324: + /* ICS2494A(N)-324 for Tseng ET4000/W32 series */ + ics2494->freq[0x0] = 50000000.0; + ics2494->freq[0x1] = 56644000.0; + ics2494->freq[0x2] = 65000000.0; + ics2494->freq[0x3] = 72000000.0; + ics2494->freq[0x4] = 80000000.0; + ics2494->freq[0x5] = 89800000.0; + ics2494->freq[0x6] = 63000000.0; + ics2494->freq[0x7] = 75000000.0; + ics2494->freq[0x8] = 83078000.0; + ics2494->freq[0x9] = 93463000.0; + ics2494->freq[0xa] = 100000000.0; + ics2494->freq[0xb] = 104000000.0; + ics2494->freq[0xc] = 108000000.0; + ics2494->freq[0xd] = 120000000.0; + ics2494->freq[0xe] = 130000000.0; + ics2494->freq[0xf] = 134700000.0; + break; default: break; @@ -339,6 +358,20 @@ const device_t ics2494an_305_device = { .config = NULL }; +const device_t ics2494an_324_device = { + .name = "ICS2494AN-324 Clock Generator", + .internal_name = "ics2494an_324", + .flags = 0, + .local = 324, + .init = ics2494_init, + .close = ics2494_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t ati18810_28800_device = { .name = "ATI 18810 (ATI 28800) Clock Generator", .internal_name = "ati18810_28800", diff --git a/src/video/ramdac/vid_ramdac_att20c49x.c b/src/video/ramdac/vid_ramdac_att20c49x.c index 2d8d6a304..3776e6616 100644 --- a/src/video/ramdac/vid_ramdac_att20c49x.c +++ b/src/video/ramdac/vid_ramdac_att20c49x.c @@ -42,12 +42,6 @@ att49x_ramdac_control(uint8_t val, void *priv, svga_t *svga) att49x_ramdac_t *ramdac = (att49x_ramdac_t *) priv; ramdac->ctrl = val; switch ((ramdac->ctrl >> 5) & 7) { - case 0: - case 1: - case 2: - case 3: - svga->bpp = 8; - break; case 4: case 5: svga->bpp = 15; @@ -60,10 +54,12 @@ att49x_ramdac_control(uint8_t val, void *priv, svga_t *svga) break; default: + svga->bpp = 8; break; } if (ramdac->type == ATT_490 || ramdac->type == ATT_491) svga_set_ramdac_type(svga, (val & 2) ? RAMDAC_8BIT : RAMDAC_6BIT); + svga_recalctimings(svga); } diff --git a/src/video/ramdac/vid_ramdac_att2xc498.c b/src/video/ramdac/vid_ramdac_att2xc498.c index 141ffa4b4..21c6770a3 100644 --- a/src/video/ramdac/vid_ramdac_att2xc498.c +++ b/src/video/ramdac/vid_ramdac_att2xc498.c @@ -45,7 +45,7 @@ att498_ramdac_control(uint8_t val, void *priv, svga_t *svga) svga->bpp = 8; break; case 1: - if (ramdac->ctrl & 4) + if (ramdac->ctrl & 0x04) svga->bpp = 15; else svga->bpp = 8; @@ -63,7 +63,7 @@ att498_ramdac_control(uint8_t val, void *priv, svga_t *svga) break; } - svga_set_ramdac_type(svga, (ramdac->ctrl & 2) ? RAMDAC_8BIT : RAMDAC_6BIT); + svga_set_ramdac_type(svga, (ramdac->ctrl & 0x02) ? RAMDAC_8BIT : RAMDAC_6BIT); svga_recalctimings(svga); } @@ -132,7 +132,7 @@ att498_ramdac_in(uint16_t addr, int rs2, void *priv, svga_t *svga) ramdac->state++; break; case 6: - temp = ramdac->ctrl; + temp = 0x98; ramdac->state = 0; break; default: diff --git a/src/video/ramdac/vid_ramdac_bt48x.c b/src/video/ramdac/vid_ramdac_bt48x.c index be6499990..64bc2b5b7 100644 --- a/src/video/ramdac/vid_ramdac_bt48x.c +++ b/src/video/ramdac/vid_ramdac_bt48x.c @@ -366,15 +366,14 @@ bt48x_recalctimings(void *priv, svga_t *svga) svga->clock_multiplier = 0; svga->multiplexing_rate = 0; svga->true_color_bypass = 0; - if (ramdac->cmd_r3 & 0x08) { /* x2 clock multiplier */ - //pclog("2x multiplier.\n"); + if (ramdac->cmd_r3 & 0x08) /* x2 clock multiplier */ svga->clock_multiplier = 1; - } + svga->multiplexing_rate = (ramdac->cmd_r1 & 0x60) >> 5; if (svga->bpp >= 15) svga->true_color_bypass = !!(ramdac->cmd_r1 & 0x10); - //pclog("CR0=%02x, CR1=%02x, CR2=%02x.\n", ramdac->cmd_r0, ramdac->cmd_r1, ramdac->cmd_r2); + pclog("CR0=%02x, CR1=%02x, CR2=%02x.\n", ramdac->cmd_r0, ramdac->cmd_r1, ramdac->cmd_r2); } void diff --git a/src/video/ramdac/vid_ramdac_sdac.c b/src/video/ramdac/vid_ramdac_sdac.c index 2b2890307..a88cdcaef 100644 --- a/src/video/ramdac/vid_ramdac_sdac.c +++ b/src/video/ramdac/vid_ramdac_sdac.c @@ -49,6 +49,7 @@ typedef struct sdac_ramdac_t { int rs2; uint8_t type; uint8_t command; + float ref_clock; } sdac_ramdac_t; static void @@ -275,11 +276,21 @@ sdac_getclock(int clock, void *priv) n1 = ((ramdac->regs[clock] >> 8) & 0x1f) + 2; n2 = ((ramdac->regs[clock] >> 13) & 0x07); n2 = (1 << n2); - t = (14318184.0f * (float) m) / (float) (n1 * n2); + t = (ramdac->ref_clock * (float) m) / (float) (n1 * n2); + //pclog("SDACClock=%d, regs val=%04x.\n", clock, ramdac->regs[clock]); return t; } +void +sdac_set_ref_clock(void *priv, float ref_clock) +{ + sdac_ramdac_t *ramdac = (sdac_ramdac_t *) priv; + + if (ramdac != NULL) + ramdac->ref_clock = ref_clock; +} + void * sdac_ramdac_init(const device_t *info) { @@ -288,6 +299,7 @@ sdac_ramdac_init(const device_t *info) ramdac->type = info->local; + ramdac->ref_clock = 14318184.0f; ramdac->regs[0] = 0x6128; ramdac->regs[1] = 0x623d; diff --git a/src/video/ramdac/vid_ramdac_stg1702.c b/src/video/ramdac/vid_ramdac_stg1702.c index 8a2d008dd..6c0945704 100644 --- a/src/video/ramdac/vid_ramdac_stg1702.c +++ b/src/video/ramdac/vid_ramdac_stg1702.c @@ -31,6 +31,7 @@ typedef struct stg_ramdac_t { int magic_count, index; uint8_t regs[256]; uint8_t command; + int type; } stg_ramdac_t; static int stg_state_read[2][8] = { @@ -46,6 +47,8 @@ stg_ramdac_set_bpp(svga_t *svga, stg_ramdac_t *ramdac) switch (ramdac->regs[3]) { default: case 0: + svga->bpp = 8; + break; case 5: case 7: svga->bpp = 8; @@ -176,7 +179,7 @@ stg_ramdac_in(uint16_t addr, void *priv, svga_t *svga) temp = 0x44; break; case 1: - temp = 0x03; + temp = ramdac->type; break; case 7: temp = 0x88; @@ -216,22 +219,24 @@ stg_getclock(int clock, void *priv) float t; int m; int n; - int n2; - const uint16_t *c; + int d; + int d2; + uint16_t c; if (clock == 0) return 25175000.0; if (clock == 1) return 28322000.0; - clock ^= 1; /*Clocks 2 and 3 seem to be reversed*/ - c = (uint16_t *) &ramdac->regs[0x20 + (clock << 1)]; - m = (*c & 0xff) + 2; /* B+2 */ - n = ((*c >> 8) & 0x1f) + 2; /* N1+2 */ - n2 = ((*c >> 13) & 0x07); /* D */ - n2 = (1 << n2); - t = (14318184.0f * (float) m) / (float) (n * n2); + c = ramdac->regs[0x20 + (clock << 1)]; + c |= (ramdac->regs[0x21 + (clock << 1)] << 8); + m = (c & 0xff) + 2; /* B+2 */ + n = ((c >> 8) & 0x1f) + 2; /* N1+2 */ + d = ((c >> 13) & 0x07); /* D */ + d2 = (1 << d); + t = (14318184.0f * (float) m) / (float) (n * d2); + //pclog("RAMDAC vclk val=0x%02x, vclk v=%d low, D=%d, t=%f.\n", ramdac->regs[0x20 + (clock << 1)], clock, d2, t); return t; } @@ -241,6 +246,8 @@ stg_ramdac_init(UNUSED(const device_t *info)) stg_ramdac_t *ramdac = (stg_ramdac_t *) malloc(sizeof(stg_ramdac_t)); memset(ramdac, 0, sizeof(stg_ramdac_t)); + ramdac->type = info->local & 0xff; + return ramdac; } @@ -253,11 +260,25 @@ stg_ramdac_close(void *priv) free(ramdac); } -const device_t stg_ramdac_device = { - .name = "SGS-Thompson STG170x RAMDAC", +const device_t stg1702_ramdac_device = { + .name = "SGS-Thompson STG1702 RAMDAC", .internal_name = "stg_ramdac", .flags = 0, - .local = 0, + .local = 2, + .init = stg_ramdac_init, + .close = stg_ramdac_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t stg1703_ramdac_device = { + .name = "SGS-Thompson STG1703 RAMDAC", + .internal_name = "stg_ramdac", + .flags = 0, + .local = 3, .init = stg_ramdac_init, .close = stg_ramdac_close, .reset = NULL, diff --git a/src/video/ramdac/vid_ramdac_tvp3026.c b/src/video/ramdac/vid_ramdac_tvp3026.c index 1958fa588..73af99075 100644 --- a/src/video/ramdac/vid_ramdac_tvp3026.c +++ b/src/video/ramdac/vid_ramdac_tvp3026.c @@ -9,7 +9,6 @@ * Emulation of the Texas Instruments TVP3026 true colour RAMDAC * family. * - * TODO: Clock and other parts. * * Authors: TheCollector1995, * @@ -49,6 +48,7 @@ typedef struct tvp3026_ramdac_t { uint8_t mode; uint8_t pll_addr; uint8_t clock_sel; + uint8_t color_key_ctrl; struct { uint8_t m; uint8_t n; @@ -171,25 +171,24 @@ tvp3026_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *priv, svg svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; svga->dac_hwcursor.ena = !!(val & 0x03); ramdac->mode = val & 0x03; + //pclog("0x09: DACEna=%02x, MainEna=%02x.\n", svga->dac_hwcursor.ena, svga->hwcursor.ena); } break; case 0x0a: /* Indexed Data (RS value = 1010) */ switch (ramdac->ind_idx) { case 0x06: /* Indirect Cursor Control */ ramdac->ccr = val; + svga->dac_hwcursor.cur_xsize = svga->dac_hwcursor.cur_ysize = 64; + svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.cur_xsize; + svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; if (!(ramdac->ccr & 0x80)) { - svga->dac_hwcursor.cur_xsize = svga->dac_hwcursor.cur_ysize = 64; - svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.cur_xsize; - svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; svga->dac_hwcursor.ena = !!(val & 0x03); ramdac->mode = val & 0x03; } else { - svga->dac_hwcursor.cur_xsize = svga->dac_hwcursor.cur_ysize = 64; - svga->dac_hwcursor.x = ramdac->hwc_x - svga->dac_hwcursor.cur_xsize; - svga->dac_hwcursor.y = ramdac->hwc_y - svga->dac_hwcursor.cur_ysize; svga->dac_hwcursor.ena = !!(ramdac->dcc & 0x03); ramdac->mode = ramdac->dcc & 0x03; } + //pclog("0x0a, indirect 0x06: DACEna=%02x, MainEna=%02x.\n", svga->dac_hwcursor.ena, svga->hwcursor.ena); break; case 0x0f: /* Latch Control */ ramdac->latch_cntl = val; @@ -279,6 +278,9 @@ tvp3026_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *priv, svg } ramdac->pll_addr = ((ramdac->pll_addr + 0x10) & 0x30) | (ramdac->pll_addr & 0xcf); break; + case 0x38: /* Color-Key Control */ + ramdac->color_key_ctrl = val; + break; case 0x39: /* MCLK/Loop Clock Control */ ramdac->mclk = val; break; @@ -470,6 +472,9 @@ tvp3026_ramdac_in(uint16_t addr, int rs2, int rs3, void *priv, svga_t *svga) break; } break; + case 0x38: /* Color-Key Control */ + temp = ramdac->color_key_ctrl; + break; case 0x39: /* MCLK/Loop Clock Control */ temp = ramdac->mclk; break; @@ -516,11 +521,39 @@ tvp3026_recalctimings(void *priv, svga_t *svga) svga->interlace = !!(ramdac->ccr & 0x40); /* TODO: Figure out gamma correction for 15/16 bpp color. */ svga->lut_map = !!((svga->bpp >= 15 && (svga->bpp != 24)) && (ramdac->true_color & 0xf0) != 0x00); + svga->clock_multiplier = 0; + + //pclog("RAMDAC CLOCKSEL=%02x, MCR=%02x, LoopMCLK=%02x, Latch=%02x.\n", ramdac->clock_sel, ramdac->mcr, ramdac->mclk, ramdac->latch_cntl); if (!(ramdac->clock_sel & 0x70)) { if (ramdac->mcr != 0x98) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; + switch ((ramdac->clock_sel >> 4) & 7) { + case 0: + svga->clock_multiplier = 1; + break; + case 1: + svga->clock_multiplier = 2; + break; + case 2: + svga->clock_multiplier = 4; + break; + case 3: + svga->clock_multiplier = 8; + break; + case 4: + svga->clock_multiplier = 16; + break; + case 5: + svga->clock_multiplier = 32; + break; + case 6: + svga->clock_multiplier = 64; + break; + case 7: + default: + svga->clock_multiplier = 0; + break; + } } } } diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index bd65a1376..95a32dabe 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -547,6 +547,7 @@ mach64_recalctimings(svga_t *svga) svga->rowcount = mach64->crtc_gen_cntl & 1; svga->lut_map = (mach64->type >= MACH64_VT); svga->rowoffset <<= 1; + svga->attrregs[0x13] &= ~0x0f; if (mach64->type == MACH64_GX) ati68860_ramdac_set_render(svga->ramdac, svga); diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index abdde1622..95f9e7bf6 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -1824,6 +1824,9 @@ gd54xx_recalctimings(svga_t *svga) uint8_t clocksel; uint8_t rdmask; uint8_t linedbl = svga->dispend * 9 / 10 >= svga->hdisp; + uint8_t m = 0; + int d = 0; + int n = 0; svga->hblankstart = svga->crtc[2]; @@ -1865,6 +1868,34 @@ gd54xx_recalctimings(svga_t *svga) svga->interlace = 0; } + clocksel = (svga->miscout >> 2) & 3; + + if (!gd54xx->vclk_n[clocksel] || !gd54xx->vclk_d[clocksel]) + svga->clock = (cpuclock * (float) (1ULL << 32)) / + ((svga->miscout & 0xc) ? 28322000.0 : 25175000.0); + else { + n = gd54xx->vclk_n[clocksel] & 0x7f; + d = (gd54xx->vclk_d[clocksel] & 0x3e) >> 1; + m = gd54xx->vclk_d[clocksel] & 0x01 ? 2 : 1; + float freq = (14318184.0F * ((float) n / ((float) d * m))); + if (gd54xx_is_5422(svga)) { + switch (svga->seqregs[0x07] & (gd54xx_is_5434(svga) ? 0xe : 6)) { + case 2: + freq /= 2.0F; + break; + case 4: + if (!gd54xx_is_5434(svga)) + freq /= 3.0F; + break; + + default: + break; + } + } + svga->clock = (cpuclock * (double) (1ULL << 32)) / freq; + } + + svga->bpp = 8; svga->map8 = svga->pallook; if (svga->seqregs[0x07] & CIRRUS_SR7_BPP_SVGA) { if (linedbl) @@ -1874,6 +1905,7 @@ gd54xx_recalctimings(svga_t *svga) if ((svga->dispend == 512) && !svga->interlace && gd54xx_is_5434(svga)) { svga->hdisp <<= 1; svga->dots_per_clock <<= 1; + svga->clock *= 2.0; } } } else if (svga->gdcreg[5] & 0x40) @@ -1881,8 +1913,6 @@ gd54xx_recalctimings(svga_t *svga) svga->memaddr_latch |= ((svga->crtc[0x1b] & 0x01) << 16) | ((svga->crtc[0x1b] & 0xc) << 15); - svga->bpp = 8; - if (gd54xx->ramdac.ctrl & 0x80) { if (gd54xx->ramdac.ctrl & 0x40) { if ((svga->crtc[0x27] >= CIRRUS_ID_CLGD5428) || (svga->crtc[0x27] == CIRRUS_ID_CLGD5426)) @@ -2023,33 +2053,6 @@ gd54xx_recalctimings(svga_t *svga) } } - clocksel = (svga->miscout >> 2) & 3; - - if (!gd54xx->vclk_n[clocksel] || !gd54xx->vclk_d[clocksel]) - svga->clock = (cpuclock * (float) (1ULL << 32)) / - ((svga->miscout & 0xc) ? 28322000.0 : 25175000.0); - else { - int n = gd54xx->vclk_n[clocksel] & 0x7f; - int d = (gd54xx->vclk_d[clocksel] & 0x3e) >> 1; - uint8_t m = gd54xx->vclk_d[clocksel] & 0x01 ? 2 : 1; - float freq = (14318184.0F * ((float) n / ((float) d * m))); - if (gd54xx_is_5422(svga)) { - switch (svga->seqregs[0x07] & (gd54xx_is_5434(svga) ? 0xe : 6)) { - case 2: - freq /= 2.0F; - break; - case 4: - if (!gd54xx_is_5434(svga)) - freq /= 3.0F; - break; - - default: - break; - } - } - svga->clock = (cpuclock * (double) (1ULL << 32)) / freq; - } - svga->vram_display_mask = (svga->crtc[0x1b] & 2) ? gd54xx->vram_mask : 0x3ffff; if (svga->crtc[0x27] >= CIRRUS_ID_CLGD5430) diff --git a/src/video/vid_et4000w32.c b/src/video/vid_et4000w32.c index 05de0dbea..4b95ba04e 100644 --- a/src/video/vid_et4000w32.c +++ b/src/video/vid_et4000w32.c @@ -10,6 +10,8 @@ * * Known bugs: Accelerator doesn't work in planar modes * + * + * * Authors: Sarah Walker, * Miran Grca, * @@ -35,30 +37,46 @@ #include <86box/vid_svga.h> #include <86box/vid_svga_render.h> -#define BIOS_ROM_PATH_DIAMOND "roms/video/et4000w32/et4000w32.bin" -#define BIOS_ROM_PATH_CARDEX "roms/video/et4000w32/cardex.vbi" -#define BIOS_ROM_PATH_W32 "roms/video/et4000w32/ET4000W32VLB_bios_MX27C512.BIN" -#define BIOS_ROM_PATH_W32I_ISA "roms/video/et4000w32/ET4KW32I.VBI" -#define BIOS_ROM_PATH_W32I_VLB "roms/video/et4000w32/tseng.u41.bin" -#define BIOS_ROM_PATH_W32P_VIDEOMAGIC_REVB_VLB "roms/video/et4000w32/VideoMagic-BioS-HXIRTW32PWSRL.bin" -#define BIOS_ROM_PATH_W32P "roms/video/et4000w32/ET4K_W32.BIN" -#define BIOS_ROM_PATH_W32P_REVC "roms/video/et4000w32/et4000w32pcardex.BIN" +#define BIOS_ROM_PATH_W32_MACHSPEED_VGA_GUI_2400S "roms/video/et4000w32/ET4000W32VLB_bios_MX27C512.BIN" +#define BIOS_ROM_PATH_W32I_REVB_AXIS_MICRODEVICE "roms/video/et4000w32/ET4KW32I.VBI" +#define BIOS_ROM_PATH_W32I_REVB_HERCULES_DYNAMITE_VLB_PRO "roms/video/et4000w32/Hercules Dynamite VL Pro v8.00 c 1993 Hercules.bin" +#define BIOS_ROM_PATH_W32P_REVB_VIDEOMAGIC "roms/video/et4000w32/VideoMagic-BioS-HXIRTW32PWSRL.bin" +#define BIOS_ROM_PATH_W32P_REVC_CARDEX "roms/video/et4000w32/et4000w32pcardex.BIN" +#define BIOS_ROM_PATH_W32P_REVD "roms/video/et4000w32/ET4K_W32.BIN" +#define BIOS_ROM_PATH_W32P_REVD_CARDEX "roms/video/et4000w32/cardex.vbi" +#define BIOS_ROM_PATH_W32P_REVD_DIAMOND "roms/video/et4000w32/et4000w32.bin" #define ACL_WRST 1 #define ACL_RDST 2 #define ACL_XYST 4 #define ACL_SSO 8 +typedef enum { + ET4000W32 = 0, + ET4000W32I_REVB = 3, + ET4000W32P_REVB = 5, + ET4000W32P_REVC = 7, + ET4000W32P_REVD = 6 +} et4000w32_chip_type; + enum { - ET4000W32, - ET4000W32I, - ET4000W32P_REVC, - ET4000W32P_VIDEOMAGIC_REVB, - ET4000W32P, - ET4000W32P_CARDEX, - ET4000W32P_DIAMOND + MACHSPEED_VGA_GUI_2400S = 0, + AXIS_MICRODEVICE_ET4W32_5, + HERCULES_DYNAMITE_PRO_VLB, + VIDEOMAGIC_ETW32PVS, + CARDEX_REVC, + GENERIC_REVD, + CARDEX_REVD, + DIAMOND_STEALTH_32 }; +typedef enum { + BUILT_IN = 0, + ATT49X, + STG170X, + ET4K_SDAC +} et4000w32_ramdac_type; + typedef struct et4000w32p_t { mem_mapping_t linear_mapping; mem_mapping_t mmu_mapping; @@ -68,15 +86,21 @@ typedef struct et4000w32p_t { svga_t svga; uint8_t banking, banking2, adjust_cursor, rev, pci_slot; + uint8_t adjust_cursor_x; uint8_t regs[256], pci_regs[256]; int index, vlb, pci, interleaved, - bank, type; + bank; + int vram_size; uint32_t linearbase; uint32_t vram_mask; + int card_type; + et4000w32_chip_type chip_type; + et4000w32_ramdac_type ramdac_type; + /* Accelerator */ struct { struct { @@ -135,6 +159,7 @@ static void et4000w32_blit_start(et4000w32p_t *et4000); static void et4000w32p_blit_start(et4000w32p_t *et4000); static void et4000w32_blit(int count, int cpu_input, uint32_t src_dat, uint32_t mix_dat, et4000w32p_t *et4000); static void et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32p_t *et4000); +void et4000w32p_out(uint16_t addr, uint8_t val, void *priv); uint8_t et4000w32p_in(uint16_t addr, void *priv); #ifdef ENABLE_ET4000W32_LOG @@ -168,18 +193,28 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) switch (addr) { case 0x3c2: - if (et4000->type == ET4000W32P_DIAMOND) - icd2061_write(svga->clock_gen, (val >> 2) & 3); + if (svga->getclock == icd2061_getclock) + icd2061_write(svga->clock_gen, ((val >> 2) & 0x03) | ((svga->crtc[0x34] << 1) & 0x04)| ((svga->crtc[0x31] >> 3) & 0x08)); break; case 0x3c6: case 0x3c7: case 0x3c8: case 0x3c9: - if (et4000->type <= ET4000W32P_REVC) - sdac_ramdac_out(addr, 0, val, svga->ramdac, svga); - else - stg_ramdac_out(addr, val, svga->ramdac, svga); + switch (et4000->ramdac_type) { + case ATT49X: + att49x_ramdac_out(addr, !!(svga->crtc[0x31] & 0x40), val, svga->ramdac, svga); + break; + case STG170X: + stg_ramdac_out(addr, val, svga->ramdac, svga); + break; + case ET4K_SDAC: + sdac_ramdac_out(addr, !!(svga->crtc[0x31] & 0x40), val, svga->ramdac, svga); + break; + default: + svga_out(addr, val, svga); + break; + } return; case 0x3cb: /* Banking extension */ @@ -244,13 +279,13 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) } } if (svga->crtcreg == 0x30) { - if (et4000->pci && (et4000->rev != 5)) + if (et4000->pci && (et4000->rev != ET4000W32P_REVB)) et4000->linearbase = (et4000->linearbase & 0xc0000000) | ((val & 0xfc) << 22); else et4000->linearbase = val << 22; et4000w32p_recalcmapping(et4000); } - if (svga->crtcreg == 0x32 || svga->crtcreg == 0x36) + if ((svga->crtcreg == 0x32) || (svga->crtcreg == 0x36)) et4000w32p_recalcmapping(et4000); break; @@ -264,6 +299,7 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) case 0x217a: et4000->index = val; return; + case 0x210b: case 0x211b: case 0x212b: @@ -278,18 +314,29 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) svga->hwcursor.ena = !!(et4000->regs[0xF7] & 0x80); svga->hwcursor.xoff = et4000->regs[0xE2]; svga->hwcursor.yoff = et4000->regs[0xE6]; - svga->hwcursor.cur_xsize = svga->hwcursor.cur_ysize = ((et4000->regs[0xEF] & 4) || ((et4000->type == ET4000W32) && (et4000->regs[0xe2] >= 0x1f) && (et4000->regs[0xe6] >= 0x1f))) ? 128 : 64; + svga->hwcursor.cur_xsize = svga->hwcursor.cur_ysize = ((et4000->regs[0xEF] & 4) || ((et4000->rev == ET4000W32) && (et4000->regs[0xe2] >= 0x1f) && (et4000->regs[0xe6] >= 0x1f))) ? 128 : 64; - if (et4000->type == ET4000W32) { + if (et4000->rev == ET4000W32) { if ((svga->bpp == 15) || (svga->bpp == 16)) { svga->hwcursor.cur_xsize = svga->hwcursor.cur_ysize = 128; + if (et4000->adjust_cursor_x == 1) + svga->hwcursor.x += 0x100; + else if (et4000->adjust_cursor_x == 2) + svga->hwcursor.x += 8; + } + } else if (et4000->rev == ET4000W32I_REVB) { + if (((svga->bpp == 15) || (svga->bpp == 16))) { + if (et4000->adjust_cursor_x == 1) + svga->hwcursor.x += 0x100; + else if (et4000->adjust_cursor_x == 2) + svga->hwcursor.x += 8; } } - if ((et4000->type == ET4000W32) && (svga->hwcursor.cur_xsize == 128)) { + if ((et4000->rev == ET4000W32) && (svga->hwcursor.cur_xsize == 128)) { switch (svga->bpp) { case 8: - svga->hwcursor.xoff += 32; + svga->hwcursor.xoff += 0x20; break; default: @@ -300,16 +347,14 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *priv) if (svga->hwcursor.cur_xsize == 128) { svga->hwcursor.xoff &= 0x7f; svga->hwcursor.yoff &= 0x7f; - if (et4000->type > ET4000W32P_REVC) { - if (svga->bpp == 24) { + if ((et4000->rev > ET4000W32P_REVC) || (et4000->rev == ET4000W32P_REVB)) { + if (svga->bpp == 24) et4000->adjust_cursor = 2; - } } } else { - if (et4000->type > ET4000W32P_REVC) { - if ((svga->bpp == 24) && et4000->adjust_cursor) { + if ((et4000->rev > ET4000W32P_REVC) || (et4000->rev == ET4000W32P_REVB)) { + if ((svga->bpp == 24) && et4000->adjust_cursor) et4000->adjust_cursor = 0; - } } svga->hwcursor.xoff &= 0x3f; svga->hwcursor.yoff &= 0x3f; @@ -332,6 +377,7 @@ et4000w32p_in(uint16_t addr, void *priv) { et4000w32p_t *et4000 = (et4000w32p_t *) priv; svga_t *svga = &et4000->svga; + uint8_t temp = 0x00; if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) addr ^= 0x60; @@ -346,10 +392,17 @@ et4000w32p_in(uint16_t addr, void *priv) case 0x3c7: case 0x3c8: case 0x3c9: - if (et4000->type <= ET4000W32P_REVC) - return sdac_ramdac_in(addr, 0, svga->ramdac, svga); - else - return stg_ramdac_in(addr, svga->ramdac, svga); + switch (et4000->ramdac_type) { + case ATT49X: + return att49x_ramdac_in(addr, !!(svga->crtc[0x31] & 0x40), svga->ramdac, svga); + case STG170X: + return stg_ramdac_in(addr, svga->ramdac, svga); + case ET4K_SDAC: + return sdac_ramdac_in(addr, !!(svga->crtc[0x31] & 0x40), svga->ramdac, svga); + default: + return svga_in(addr, svga); + } + break; case 0x3cb: return et4000->banking2; @@ -358,9 +411,22 @@ et4000w32p_in(uint16_t addr, void *priv) case 0x3d4: return svga->crtcreg; case 0x3d5: - if (et4000->type == ET4000W32) { - if (svga->crtcreg == 0x37) - return 0x09; + if ((et4000->card_type == MACHSPEED_VGA_GUI_2400S) || + (et4000->card_type == AXIS_MICRODEVICE_ET4W32_5)) { + if (svga->crtcreg == 0x37) { + temp = svga->crtc[0x37]; + temp &= ~0x09; + switch (et4000->vram_size) { + case 1: + temp |= 0x09; + break; + case 2: + break; + default: + break; + } + return temp; + } } return svga->crtc[svga->crtcreg]; @@ -368,15 +434,18 @@ et4000w32p_in(uint16_t addr, void *priv) uint8_t ret = 0xff; svga->attrff = 0; - /*Bit 1 of the Input Status Register is required by the OS/2 and NT ET4000W32/I drivers to be set otherwise - the guest will loop infinitely upon reaching the GUI*/ if (svga->cgastat & 0x01) - svga->cgastat &= ~0x32; + svga->cgastat &= ~0x30; else - svga->cgastat ^= 0x32; + svga->cgastat ^= 0x30; ret = svga->cgastat; + /*Bit 1 of the Input Status Register is required by the OS/2 and NT ET4000W32/I drivers to be set otherwise + the guest will loop infinitely upon reaching the GUI*/ + if (svga->hdisp_on) + ret |= 0x02; + if ((svga->fcr & 0x08) && svga->dispon) ret |= 0x08; @@ -396,17 +465,18 @@ et4000w32p_in(uint16_t addr, void *priv) case 0x216a: case 0x217a: return et4000->index; - case 0x210B: - case 0x211B: - case 0x212B: - case 0x213B: - case 0x214B: - case 0x215B: - case 0x216B: - case 0x217B: - if (et4000->index == 0xec) { + + case 0x210b: + case 0x211b: + case 0x212b: + case 0x213b: + case 0x214b: + case 0x215b: + case 0x216b: + case 0x217b: + if (et4000->index == 0xec) return (et4000->regs[0xec] & 0xf) | (et4000->rev << 4); - } + if (et4000->index == 0xee) { if (svga->bpp == 8) { if ((svga->gdcreg[5] & 0x60) >= 0x40) @@ -415,7 +485,7 @@ et4000w32p_in(uint16_t addr, void *priv) return 1; else return 2; - } else if (svga->bpp == 15 || svga->bpp == 16) + } else if ((svga->bpp == 15) || (svga->bpp == 16)) return 4; else break; @@ -439,6 +509,7 @@ void et4000w32p_recalctimings(svga_t *svga) { et4000w32p_t *et4000 = (et4000w32p_t *) svga->priv; + int clk_sel = ((svga->miscout >> 2) & 0x03) | ((svga->crtc[0x34] << 1) & 0x04)| ((svga->crtc[0x31] >> 3) & 0x08); svga->memaddr_latch |= (svga->crtc[0x33] & 0x7) << 16; @@ -463,36 +534,33 @@ et4000w32p_recalctimings(svga_t *svga) svga->dots_per_clock <<= 1; } - svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock((svga->miscout >> 2) & 3, svga->clock_gen); + et4000->adjust_cursor = 0; + et4000->adjust_cursor_x = 0; - if (et4000->type != ET4000W32P_DIAMOND && et4000->type != ET4000W32P_VIDEOMAGIC_REVB && et4000->type != ET4000W32P_CARDEX && et4000->type != ET4000W32P) { - if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { - if (svga->gdcreg[5] & 0x40) { - switch (svga->bpp) { - case 8: - svga->clock *= 2; - break; - case 15: - case 16: - svga->clock *= 3; - break; - case 24: - svga->clock *= 4; - break; - - default: - break; - } - } + svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clk_sel, svga->clock_gen); + if (svga->getclock == ics2494_getclock) { + if (et4000->card_type == HERCULES_DYNAMITE_PRO_VLB) { + if (clk_sel < 2) + svga->clock *= 2.0; } } - if (et4000->type == ET4000W32) { - if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { - if (svga->gdcreg[5] & 0x40) { + if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { + if (et4000->card_type != HERCULES_DYNAMITE_PRO_VLB) { + if (!(svga->crtc[0x35] & 0x80)) { + if (clk_sel >= 2) { + if (svga->seqregs[7] & 0x01) + svga->clock *= 4.0; + else if (svga->seqregs[7] & 0x40) + svga->clock *= 2.0; + } + } + } + if (svga->gdcreg[5] & 0x40) { + if (et4000->rev == ET4000W32) { switch (svga->bpp) { case 8: - if (svga->hdisp == 640 || svga->hdisp == 800 || svga->hdisp == 1024) + if ((svga->hdisp == 640) || (svga->hdisp == 800) || (svga->hdisp == 1024)) break; svga->hdisp -= 24; break; @@ -501,39 +569,45 @@ et4000w32p_recalctimings(svga_t *svga) break; } } + switch (svga->bpp) { + case 15: + case 16: + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + if (et4000->rev <= ET4000W32P_REVC) { + if (et4000->rev != ET4000W32P_REVB) { + if (et4000->rev == ET4000W32P_REVC) { + if (svga->hdisp != 1024) + et4000->adjust_cursor = 1; + } else { + et4000->adjust_cursor = 1; + if (et4000->rev <= ET4000W32I_REVB) { + if (svga->hdisp == 800) + et4000->adjust_cursor_x = 1; + else if (svga->hdisp == 640) + et4000->adjust_cursor_x = 2; + } + } + } + } + break; + case 24: + svga->hdisp /= 3; + svga->dots_per_clock /= 3; + if (et4000->rev <= ET4000W32P_REVC) { + if (et4000->rev != ET4000W32P_REVB) + et4000->adjust_cursor = 2; + } + if ((et4000->card_type == DIAMOND_STEALTH_32) && ((svga->hdisp == (640 / 2)) || (svga->hdisp == 1232))) + svga->hdisp = 640; + break; + default: + break; + } + //pclog("ClkSel=%d, crtc34 bits 0-1=%02x, crtc31 bits 6-7=%02x, seq7=%02x, interlace=%02x.\n", clk_sel, svga->crtc[0x34] & 0x03, svga->crtc[0x31] & 0xc0, svga->seqregs[7], svga->crtc[0x35] & 0x80); } - } - - et4000->adjust_cursor = 0; - - switch (svga->bpp) { - case 15: - case 16: - if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { - svga->hdisp >>= 1; - svga->dots_per_clock >>= 1; - } - if (et4000->type <= ET4000W32P_REVC) { - if (et4000->type == ET4000W32P_REVC) { - if (svga->hdisp != 1024) - et4000->adjust_cursor = 1; - } else - et4000->adjust_cursor = 1; - } - break; - case 24: - svga->hdisp /= 3; - svga->dots_per_clock /= 3; - if (et4000->type <= ET4000W32P_REVC) - et4000->adjust_cursor = 2; - if ((et4000->type == ET4000W32P_DIAMOND) && ((svga->hdisp == (640 / 2)) || (svga->hdisp == 1232))) { - svga->hdisp = 640; - } - break; - - default: - break; - } + }//else + // pclog("CLOCK translate=%02x, EGA VGA=%02x, clk=%d.\n", svga->crtc[0x34], svga->seqregs[7] & 0x80, clk_sel); svga->render = svga_render_blank; if (!svga->scrblank && svga->attr_palette_enable) { @@ -558,9 +632,7 @@ et4000w32p_recalctimings(svga_t *svga) break; case 0x40: case 0x60: /* 256+ colours */ - if (et4000->type <= ET4000W32P_REVC) - svga->clock /= 2; - + //pclog("BPP=%d.\n", svga->bpp); switch (svga->bpp) { case 8: svga->map8 = svga->pallook; @@ -638,6 +710,7 @@ et4000w32p_recalcmapping(et4000w32p_t *et4000) map |= 4; if (svga->crtc[0x36] & 0x08) map |= 8; + mem_mapping_disable(&et4000->linear_mapping); switch (map) { case 0x0: @@ -742,13 +815,13 @@ et4000w32p_accel_write_fifo(et4000w32p_t *et4000, uint32_t addr, uint8_t val) et4000->acl.queued.dest_off = (et4000->acl.queued.dest_off & 0x00ff) | (val << 8); break; case 0x8e: - if (et4000->type >= ET4000W32P_REVC) + if (et4000->rev >= ET4000W32P_REVB) et4000->acl.queued.pixel_depth = val & 0x30; else et4000->acl.queued.vbus = val & 0x03; break; case 0x8f: - if (et4000->type >= ET4000W32P_REVC) + if (et4000->rev >= ET4000W32P_REVB) et4000->acl.queued.xy_dir = val & 0xb7; else et4000->acl.queued.xy_dir = val & 0x03; @@ -772,7 +845,7 @@ et4000w32p_accel_write_fifo(et4000w32p_t *et4000, uint32_t addr, uint8_t val) et4000->acl.queued.count_y = (et4000->acl.queued.count_y & 0x00ff) | (val << 8); break; case 0x9c: - if (et4000->type >= ET4000W32P_REVC) + if (et4000->rev >= ET4000W32P_REVB) et4000->acl.queued.ctrl_routing = val & 0xdb; else et4000->acl.queued.ctrl_routing = val & 0xb7; @@ -798,14 +871,14 @@ et4000w32p_accel_write_fifo(et4000w32p_t *et4000, uint32_t addr, uint8_t val) case 0xa3: et4000->acl.queued.dest_addr = (et4000->acl.queued.dest_addr & 0x00ffffff) | (val << 24); et4000->acl.internal = et4000->acl.queued; - if (et4000->type >= ET4000W32P_REVC) { + if (et4000->rev >= ET4000W32P_REVB) { et4000w32p_blit_start(et4000); et4000w32_log("Destination Address write and start XY Block, xcnt = %i, ycnt = %i\n", et4000->acl.x_count + 1, et4000->acl.y_count + 1); if (!(et4000->acl.queued.ctrl_routing & 0x43)) { - et4000w32p_blit(0xffffff, ~0, 0, 0, et4000); + et4000w32p_blit(-1, 0xffffffff, 0, 0, et4000); } if ((et4000->acl.queued.ctrl_routing & 0x40) && !(et4000->acl.internal.ctrl_routing & 3)) { - et4000w32p_blit(4, ~0, 0, 0, et4000); + et4000w32p_blit(4, 0xffffffff, 0, 0, et4000); } } else { et4000w32_blit_start(et4000); @@ -862,7 +935,7 @@ et4000w32p_accel_write_fifo(et4000w32p_t *et4000, uint32_t addr, uint8_t val) static void et4000w32p_accel_write_mmu(et4000w32p_t *et4000, uint32_t addr, uint8_t val, uint8_t bank) { - if (et4000->type >= ET4000W32P_REVC) { + if (et4000->rev >= ET4000W32P_REVB) { if (!(et4000->acl.status & ACL_XYST)) { et4000w32_log("XY MMU block not started\n"); return; @@ -872,7 +945,7 @@ et4000w32p_accel_write_mmu(et4000w32p_t *et4000, uint32_t addr, uint8_t val, uin if ((et4000->acl.internal.ctrl_routing & 3) == 2) /*CPU data is Mix data*/ et4000w32p_blit(8 - (et4000->acl.mix_addr & 7), val >> (et4000->acl.mix_addr & 7), 0, 1, et4000); else if ((et4000->acl.internal.ctrl_routing & 3) == 1) /*CPU data is Source data*/ - et4000w32p_blit(1, ~0, val, 2, et4000); + et4000w32p_blit(1, 0xffffffff, val, 2, et4000); } } else { if (!(et4000->acl.status & ACL_XYST)) { @@ -885,9 +958,8 @@ et4000w32p_accel_write_mmu(et4000w32p_t *et4000, uint32_t addr, uint8_t val, uin if (!(et4000->acl.queued.ctrl_routing & 0x37)) { et4000->acl.mmu_start = 1; et4000w32_blit(-1, 0, 0, 0xffffffff, et4000); - } else { + } else et4000->acl.mmu_start = 0; - } } if (et4000->acl.internal.ctrl_routing & 7) { @@ -932,9 +1004,9 @@ et4000w32p_mmu_write(uint32_t addr, uint8_t val, void *priv) case 0x2000: /* MMU 1 */ case 0x4000: /* MMU 2 */ et4000->bank = (addr >> 13) & 3; - if (et4000->mmu.ctrl & (1 << et4000->bank)) { + if (et4000->mmu.ctrl & (1 << et4000->bank)) et4000w32p_accel_write_mmu(et4000, addr & 0x7fff, val, et4000->bank); - } else { + else { if (((addr & 0x1fff) + et4000->mmu.base[et4000->bank]) < svga->vram_max) { svga->vram[((addr & 0x1fff) + et4000->mmu.base[et4000->bank]) & et4000->vram_mask] = val; svga->changedvram[(((addr & 0x1fff) + et4000->mmu.base[et4000->bank]) & et4000->vram_mask) >> 12] = changeframecount; @@ -942,9 +1014,9 @@ et4000w32p_mmu_write(uint32_t addr, uint8_t val, void *priv) } break; case 0x6000: - if ((addr & 0xff) >= 0x80) { + if ((addr & 0xff) >= 0x80) et4000w32p_accel_write_fifo(et4000, addr & 0x7fff, val); - } else { + else { switch (addr & 0xff) { case 0x00: et4000->mmu.base[0] = (et4000->mmu.base[0] & 0xffffff00) | val; @@ -1069,6 +1141,7 @@ et4000w32p_mmu_read(uint32_t addr, void *priv) et4000->acl.fifo_queue = 0; } else et4000->acl.status &= ~ACL_RDST; + return et4000->acl.status; case 0x80: @@ -1100,8 +1173,9 @@ et4000w32p_mmu_read(uint32_t addr, void *priv) case 0x8d: return et4000->acl.internal.dest_off >> 8; case 0x8e: - if (et4000->type >= ET4000W32P_REVC) + if (et4000->rev >= ET4000W32P_REVB) return et4000->acl.internal.pixel_depth; + return et4000->acl.internal.vbus; case 0x8f: return et4000->acl.internal.xy_dir; @@ -1172,9 +1246,9 @@ et4000w32_blit_start(et4000w32p_t *et4000) et4000->acl.pattern_back = et4000->acl.pattern_addr; if (!(et4000->acl.internal.pattern_wrap & 0x40)) { - if ((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) == 0x00) { /*This is to avoid a division by zero crash*/ + if ((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) == 0x00) /*This is to avoid a division by zero crash*/ et4000->acl.pattern_y = (et4000->acl.pattern_addr / (0x7f + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7] - 1); - } else + else et4000->acl.pattern_y = (et4000->acl.pattern_addr / (et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7] - 1); et4000->acl.pattern_back &= ~(((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) * et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7]) - 1); } @@ -1187,9 +1261,9 @@ et4000w32_blit_start(et4000w32p_t *et4000) et4000->acl.source_back = et4000->acl.source_addr; if (!(et4000->acl.internal.source_wrap & 0x40)) { - if ((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) == 0x00) { /*This is to avoid a division by zero crash*/ + if ((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) == 0x00) /*This is to avoid a division by zero crash*/ et4000->acl.source_y = (et4000->acl.source_addr / (0x7f + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7] - 1); - } else + else et4000->acl.source_y = (et4000->acl.source_addr / (et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7] - 1); et4000->acl.source_back &= ~(((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) * et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7]) - 1); } @@ -1265,6 +1339,7 @@ et4000w32p_blit_start(et4000w32p_t *et4000) et4000w32_max_x[2] = (et4000->acl.internal.pixel_depth == 0x20) ? 3 : 4; et4000->acl.internal.count_x += (et4000->acl.internal.pixel_depth >> 4) & 3; + et4000->acl.x_count = et4000->acl.internal.count_x; et4000->acl.cpu_dat_pos = 0; et4000->acl.cpu_dat = 0; @@ -2278,9 +2353,8 @@ et4000w32_blit(int count, int cpu_input, uint32_t src_dat, uint32_t mix_dat, et4 return; } - if (cpu_input) { + if (cpu_input) return; - } } } } @@ -2293,7 +2367,7 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 uint8_t pattern; uint8_t source; uint8_t dest; - uint8_t out; + uint8_t out = 0; uint8_t rop; int mixdat; @@ -2307,14 +2381,15 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 while (count--) { et4000w32_log("%i,%i : ", et4000->acl.internal.pos_x, et4000->acl.internal.pos_y); pattern = svga->vram[(et4000->acl.pattern_addr + et4000->acl.pattern_x) & et4000->vram_mask]; - source = svga->vram[(et4000->acl.source_addr + et4000->acl.source_x) & et4000->vram_mask]; + et4000w32_log("%06X %06X ", (et4000->acl.pattern_addr + et4000->acl.pattern_x) & et4000->vram_mask, (et4000->acl.source_addr + et4000->acl.source_x) & et4000->vram_mask); if (cpu_input == 2) { source = sdat & 0xff; sdat >>= 8; - } + } else + source = svga->vram[(et4000->acl.source_addr + et4000->acl.source_x) & et4000->vram_mask]; + dest = svga->vram[et4000->acl.dest_addr & et4000->vram_mask]; - out = 0; et4000w32_log("%06X ", et4000->acl.dest_addr); if ((et4000->acl.internal.ctrl_routing & 0xa) == 8) { mixdat = svga->vram[(et4000->acl.mix_addr >> 3) & et4000->vram_mask] & (1 << (et4000->acl.mix_addr & 7)); @@ -2416,7 +2491,7 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 } } else { et4000w32_log("BitBLT: count = %i\n", count); - while (count-- && et4000->acl.y_count >= 0) { + while (count-- && (et4000->acl.y_count >= 0)) { pattern = svga->vram[(et4000->acl.pattern_addr + et4000->acl.pattern_x) & et4000->vram_mask]; if (cpu_input == 2) { @@ -2426,8 +2501,6 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 source = svga->vram[(et4000->acl.source_addr + et4000->acl.source_x) & et4000->vram_mask]; dest = svga->vram[et4000->acl.dest_addr & et4000->vram_mask]; - out = 0; - if ((et4000->acl.internal.ctrl_routing & 0xa) == 8) { mixdat = svga->vram[(et4000->acl.mix_addr >> 3) & et4000->vram_mask] & (1 << (et4000->acl.mix_addr & 7)); } else { @@ -2455,6 +2528,8 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 et4000->acl.x_count--; if (et4000->acl.x_count == 0xffff) { + et4000->acl.x_count = et4000->acl.internal.count_x; + if (et4000->acl.internal.xy_dir & 2) { et4000w32_decy(et4000); et4000->acl.mix_back = et4000->acl.mix_addr = et4000->acl.mix_back - (et4000->acl.internal.mix_off + 1); @@ -2469,7 +2544,6 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 et4000->acl.source_x = et4000->acl.source_x_back; et4000->acl.y_count--; - et4000->acl.x_count = et4000->acl.internal.count_x; if (et4000->acl.y_count == 0xffff) { et4000w32_log("BitBLT end\n"); et4000->acl.status &= ~(ACL_XYST | ACL_SSO); @@ -2481,7 +2555,7 @@ et4000w32p_blit(int count, uint32_t mix, uint32_t sdat, int cpu_input, et4000w32 if (et4000->acl.internal.ctrl_routing & 0x40) { if (et4000->acl.cpu_dat_pos & 3) - et4000->acl.cpu_dat_pos += 4 - (et4000->acl.cpu_dat_pos & 3); + et4000->acl.cpu_dat_pos += (4 - (et4000->acl.cpu_dat_pos & 3)); return; } } @@ -2505,7 +2579,7 @@ et4000w32p_hwcursor_draw(svga_t *svga, int displine) offset = svga->hwcursor_latch.xoff; - if ((et4000->type == ET4000W32) && (pitch == 32)) { + if ((et4000->rev == ET4000W32) && (pitch == 32)) { switch (svga->bpp) { case 8: minus_width = 0; @@ -2681,6 +2755,7 @@ et4000w32p_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) et4000w32p_io_set(et4000); else et4000w32p_io_remove(et4000); + et4000w32p_recalcmapping(et4000); break; @@ -2697,9 +2772,9 @@ et4000w32p_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) case 0x33: et4000->pci_regs[addr] = val; if (et4000->pci_regs[0x30] & 0x01) { - uint32_t addr = (et4000->pci_regs[0x32] << 16) | (et4000->pci_regs[0x33] << 24); - et4000w32_log("ET4000 bios_rom enabled at %08x\n", addr); - mem_mapping_set_addr(&et4000->bios_rom.mapping, addr, 0x8000); + uint32_t biosaddr = (et4000->pci_regs[0x32] << 16) | (et4000->pci_regs[0x33] << 24); + et4000w32_log("ET4000 bios_rom enabled at %08x\n", biosaddr); + mem_mapping_set_addr(&et4000->bios_rom.mapping, biosaddr, 0x8000); } else { et4000w32_log("ET4000 bios_rom disabled\n"); mem_mapping_disable(&et4000->bios_rom.mapping); @@ -2714,21 +2789,13 @@ et4000w32p_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) void * et4000w32p_init(const device_t *info) { - int vram_size; et4000w32p_t *et4000 = malloc(sizeof(et4000w32p_t)); memset(et4000, 0, sizeof(et4000w32p_t)); et4000->pci = (info->flags & DEVICE_PCI) ? 0x80 : 0x00; et4000->vlb = (info->flags & DEVICE_VLB) ? 0x40 : 0x00; - /*The ET4000/W32i ISA BIOS seems to not support 2MB of VRAM*/ - if ((info->local == ET4000W32) || ((info->local == ET4000W32I) && !(et4000->vlb))) - vram_size = 1; - else - vram_size = device_get_config_int("memory"); - - /*The interleaved VRAM was introduced by the ET4000/W32i*/ - et4000->interleaved = ((vram_size == 2) && (info->local != ET4000W32)) ? 1 : 0; + et4000->vram_size = device_get_config_int("memory"); if (info->flags & DEVICE_PCI) video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000w32_pci); @@ -2737,112 +2804,141 @@ et4000w32p_init(const device_t *info) else video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_et4000w32_isa); - svga_init(info, &et4000->svga, et4000, vram_size << 20, + svga_init(info, &et4000->svga, et4000, et4000->vram_size << 20, et4000w32p_recalctimings, et4000w32p_in, et4000w32p_out, et4000w32p_hwcursor_draw, NULL); - et4000->vram_mask = (vram_size << 20) - 1; - et4000->svga.decode_mask = (vram_size << 20) - 1; + et4000->vram_mask = (et4000->vram_size << 20) - 1; + et4000->svga.decode_mask = (et4000->vram_size << 20) - 1; - et4000->type = info->local; + et4000->card_type = info->local & 0xff; + et4000->ramdac_type = BUILT_IN; + et4000->svga.crtc[0x31] = 0x40; + et4000->svga.miscout = 0x01; + et4000->svga.bpp = 8; - switch (et4000->type) { - case ET4000W32: + switch (et4000->card_type) { + case MACHSPEED_VGA_GUI_2400S: /* ET4000/W32 */ - et4000->rev = 0; + et4000->rev = ET4000W32; + et4000->ramdac_type = ET4K_SDAC; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32_MACHSPEED_VGA_GUI_2400S, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); et4000->svga.ramdac = device_add(&tseng_ics5301_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = sdac_getclock; + sdac_set_ref_clock(et4000->svga.ramdac, 14318184.0f); + svga_recalctimings(&et4000->svga); break; - case ET4000W32I: + case AXIS_MICRODEVICE_ET4W32_5: /* ET4000/W32i rev B */ - et4000->rev = 3; + et4000->rev = ET4000W32I_REVB; + et4000->ramdac_type = ET4K_SDAC; - if (et4000->vlb) { - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32I_VLB, 0xc0000, 0x8000, 0x7fff, 0, - MEM_MAPPING_EXTERNAL); - } else { - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32I_ISA, 0xc0000, 0x8000, 0x7fff, 0, - MEM_MAPPING_EXTERNAL); - } + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32I_REVB_AXIS_MICRODEVICE, 0xc0000, 0x8000, 0x7fff, 0, + MEM_MAPPING_EXTERNAL); et4000->svga.ramdac = device_add(&tseng_ics5301_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = sdac_getclock; + sdac_set_ref_clock(et4000->svga.ramdac, 14318184.0f); + svga_recalctimings(&et4000->svga); break; - case ET4000W32P_VIDEOMAGIC_REVB: - /* ET4000/W32p rev B */ - et4000->rev = 5; + case HERCULES_DYNAMITE_PRO_VLB: + /* ET4000/W32i rev B */ + et4000->rev = ET4000W32I_REVB; + et4000->ramdac_type = ATT49X; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_VIDEOMAGIC_REVB_VLB, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32I_REVB_HERCULES_DYNAMITE_VLB_PRO, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - et4000->svga.ramdac = device_add(&stg_ramdac_device); + et4000->svga.ramdac = device_add(&att490_ramdac_device); + et4000->svga.clock_gen = device_add(&ics2494an_324_device); + et4000->svga.getclock = ics2494_getclock; + break; + + case VIDEOMAGIC_ETW32PVS: + /* ET4000/W32p rev B */ + et4000->rev = ET4000W32P_REVB; + et4000->ramdac_type = STG170X; + + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVB_VIDEOMAGIC, 0xc0000, 0x8000, 0x7fff, 0, + MEM_MAPPING_EXTERNAL); + + et4000->svga.ramdac = device_add(&stg1703_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = stg_getclock; break; - case ET4000W32P_REVC: + case CARDEX_REVC: /* ET4000/W32p rev C */ - et4000->rev = 7; + et4000->rev = ET4000W32P_REVC; + et4000->ramdac_type = ET4K_SDAC; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVC, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVC_CARDEX, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); et4000->svga.ramdac = device_add(&tseng_ics5341_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = sdac_getclock; + sdac_set_ref_clock(et4000->svga.ramdac, 14318184.0f); + svga_recalctimings(&et4000->svga); break; - case ET4000W32P: + case CARDEX_REVD: /* ET4000/W32p rev D */ - et4000->rev = 6; + et4000->rev = ET4000W32P_REVD; + et4000->ramdac_type = STG170X; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVD_CARDEX, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - et4000->svga.ramdac = device_add(&stg_ramdac_device); + et4000->svga.ramdac = device_add(&stg1703_ramdac_device); et4000->svga.clock_gen = et4000->svga.ramdac; et4000->svga.getclock = stg_getclock; break; - case ET4000W32P_CARDEX: + case DIAMOND_STEALTH_32: /* ET4000/W32p rev D */ - et4000->rev = 6; + et4000->rev = ET4000W32P_REVD; + et4000->ramdac_type = STG170X; - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_CARDEX, 0xc0000, 0x8000, 0x7fff, 0, + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVD_DIAMOND, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - et4000->svga.ramdac = device_add(&stg_ramdac_device); - et4000->svga.clock_gen = et4000->svga.ramdac; - et4000->svga.getclock = stg_getclock; - break; - - case ET4000W32P_DIAMOND: - /* ET4000/W32p rev D */ - et4000->rev = 6; - - rom_init(&et4000->bios_rom, BIOS_ROM_PATH_DIAMOND, 0xc0000, 0x8000, 0x7fff, 0, - MEM_MAPPING_EXTERNAL); - - et4000->svga.ramdac = device_add(&stg_ramdac_device); + et4000->svga.ramdac = device_add(&stg1702_ramdac_device); et4000->svga.clock_gen = device_add(&icd2061_device); et4000->svga.getclock = icd2061_getclock; icd2061_set_ref_clock(et4000->svga.ramdac, 14318184.0f); svga_recalctimings(&et4000->svga); break; + case GENERIC_REVD: + /* ET4000/W32p rev D */ + et4000->rev = ET4000W32P_REVD; + et4000->ramdac_type = STG170X; + + rom_init(&et4000->bios_rom, BIOS_ROM_PATH_W32P_REVD, 0xc0000, 0x8000, 0x7fff, 0, + MEM_MAPPING_EXTERNAL); + + et4000->svga.ramdac = device_add(&stg1703_ramdac_device); + et4000->svga.clock_gen = et4000->svga.ramdac; + et4000->svga.getclock = stg_getclock; + break; + default: break; } + + /*The interleaved VRAM was introduced by the ET4000/W32i*/ + et4000->interleaved = ((et4000->vram_size == 2) && (et4000->rev != ET4000W32)) ? 1 : 0; + if (info->flags & DEVICE_PCI) mem_mapping_disable(&et4000->bios_rom.mapping); @@ -2875,51 +2971,51 @@ et4000w32p_init(const device_t *info) } int -et4000w32_available(void) +et4000w32_machspeed_vga_gui_2400s_available(void) { - return rom_present(BIOS_ROM_PATH_W32); + return rom_present(BIOS_ROM_PATH_W32_MACHSPEED_VGA_GUI_2400S); } int -et4000w32i_isa_available(void) +et4000w32i_axis_microdevice_available(void) { - return rom_present(BIOS_ROM_PATH_W32I_ISA); + return rom_present(BIOS_ROM_PATH_W32I_REVB_AXIS_MICRODEVICE); } int -et4000w32i_vlb_available(void) +et4000w32i_hercules_dynamite_pro_vlb_available(void) { - return rom_present(BIOS_ROM_PATH_W32I_VLB); + return rom_present(BIOS_ROM_PATH_W32I_REVB_HERCULES_DYNAMITE_VLB_PRO); } int -et4000w32p_videomagic_revb_vlb_available(void) +et4000w32p_videomagic_revb_available(void) { - return rom_present(BIOS_ROM_PATH_W32P_VIDEOMAGIC_REVB_VLB); + return rom_present(BIOS_ROM_PATH_W32P_REVB_VIDEOMAGIC); } int -et4000w32p_revc_available(void) +et4000w32p_cardex_revc_available(void) { - return rom_present(BIOS_ROM_PATH_W32P_REVC); + return rom_present(BIOS_ROM_PATH_W32P_REVC_CARDEX); } int -et4000w32p_noncardex_available(void) +et4000w32p_diamond_revd_available(void) { - return rom_present(BIOS_ROM_PATH_W32P); + return rom_present(BIOS_ROM_PATH_W32P_REVD_DIAMOND); } int -et4000w32p_available(void) +et4000w32p_cardex_revd_available(void) { - return rom_present(BIOS_ROM_PATH_DIAMOND); + return rom_present(BIOS_ROM_PATH_W32P_REVD_CARDEX); } int -et4000w32p_cardex_available(void) +et4000w32p_generic_revd_available(void) { - return rom_present(BIOS_ROM_PATH_CARDEX); + return rom_present(BIOS_ROM_PATH_W32P_REVD); } void @@ -2969,197 +3065,197 @@ static const device_config_t et4000w32p_config[] = { // clang-format on }; -const device_t et4000w32_device = { - .name = "Tseng Labs ET4000/w32 ISA", +const device_t et4000w32_machspeed_vga_gui_2400s_isa_device = { + .name = "Tseng Labs ET4000/w32 ISA (MachSpeed VGA GUI 2400S)", .internal_name = "et4000w32", .flags = DEVICE_ISA16, - .local = ET4000W32, + .local = MACHSPEED_VGA_GUI_2400S, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32_available, + .available = et4000w32_machspeed_vga_gui_2400s_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, - .config = NULL + .config = et4000w32p_config +}; + +const device_t et4000w32_machspeed_vga_gui_2400s_vlb_device = { + .name = "Tseng Labs ET4000/w32 VLB (MachSpeed VGA GUI 2400S)", + .internal_name = "et4000w32_vlb", + .flags = DEVICE_VLB, + .local = MACHSPEED_VGA_GUI_2400S, + .init = et4000w32p_init, + .close = et4000w32p_close, + .reset = NULL, + .available = et4000w32_machspeed_vga_gui_2400s_available, + .speed_changed = et4000w32p_speed_changed, + .force_redraw = et4000w32p_force_redraw, + .config = et4000w32p_config }; const device_t et4000w32_onboard_device = { - .name = "Tseng Labs ET4000/w32 (ISA) (On-Board)", + .name = "Tseng Labs ET4000/w32 ISA (On-Board)", .internal_name = "et4000w32_onboard", .flags = DEVICE_ISA16, - .local = ET4000W32, + .local = MACHSPEED_VGA_GUI_2400S | 0x100, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32_available, + .available = et4000w32_machspeed_vga_gui_2400s_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, - .config = NULL + .config = et4000w32p_config }; -const device_t et4000w32i_isa_device = { - .name = "Tseng Labs ET4000/w32i Rev. B ISA", +const device_t et4000w32i_axis_microdevice_isa_device = { + .name = "Tseng Labs ET4000/w32i Rev. B ISA (Axis MicroDevice)", .internal_name = "et4000w32i", .flags = DEVICE_ISA16, - .local = ET4000W32I, + .local = AXIS_MICRODEVICE_ET4W32_5, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32i_isa_available, + .available = et4000w32i_axis_microdevice_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, - .config = NULL + .config = et4000w32p_config }; -const device_t et4000w32i_vlb_device = { - .name = "Tseng Labs ET4000/w32i Rev. B VLB", +const device_t et4000w32i_hercules_dynamite_pro_vlb_device = { + .name = "Tseng Labs ET4000/w32i Rev. B VLB (Hercules Dynamite Pro)", .internal_name = "et4000w32i_vlb", .flags = DEVICE_VLB, - .local = ET4000W32I, + .local = HERCULES_DYNAMITE_PRO_VLB, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32i_vlb_available, + .available = et4000w32i_hercules_dynamite_pro_vlb_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; const device_t et4000w32p_videomagic_revb_vlb_device = { - .name = "Tseng Labs ET4000/w32p Rev. B VLB (VideoMagic)", + .name = "Tseng Labs ET4000/w32p Rev. B VLB (VideoMagic ETW32PVS)", .internal_name = "et4000w32p_videomagic_revb_vlb", .flags = DEVICE_VLB, - .local = ET4000W32P_VIDEOMAGIC_REVB, + .local = VIDEOMAGIC_ETW32PVS, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_videomagic_revb_vlb_available, + .available = et4000w32p_videomagic_revb_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_videomagic_revb_pci_device = { - .name = "Tseng Labs ET4000/w32p Rev. B PCI (VideoMagic)", - .internal_name = "et4000w32p_videomagic_revb_pci", - .flags = DEVICE_PCI, - .local = ET4000W32P_VIDEOMAGIC_REVB, - .init = et4000w32p_init, - .close = et4000w32p_close, - .reset = NULL, - .available = et4000w32p_videomagic_revb_vlb_available, - .speed_changed = et4000w32p_speed_changed, - .force_redraw = et4000w32p_force_redraw, - .config = et4000w32p_config -}; - -const device_t et4000w32p_revc_vlb_device = { +const device_t et4000w32p_cardex_revc_vlb_device = { .name = "Tseng Labs ET4000/w32p Rev. C VLB (Cardex)", .internal_name = "et4000w32p_revc_vlb", .flags = DEVICE_VLB, - .local = ET4000W32P_REVC, + .local = CARDEX_REVC, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_revc_available, + .available = et4000w32p_cardex_revc_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_revc_pci_device = { +const device_t et4000w32p_cardex_revc_pci_device = { .name = "Tseng Labs ET4000/w32p Rev. C PCI (Cardex)", - .internal_name = "et4000w32p_revc_pci", + .internal_name = "et4000w32p_revc_vlb", .flags = DEVICE_PCI, - .local = ET4000W32P_REVC, + .local = CARDEX_REVC, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_revc_available, + .available = et4000w32p_cardex_revc_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_noncardex_vlb_device = { - .name = "Tseng Labs ET4000/w32p Rev. D VLB", - .internal_name = "et4000w32p_nc_vlb", - .flags = DEVICE_VLB, - .local = ET4000W32P, - .init = et4000w32p_init, - .close = et4000w32p_close, - .reset = NULL, - .available = et4000w32p_noncardex_available, - .speed_changed = et4000w32p_speed_changed, - .force_redraw = et4000w32p_force_redraw, - .config = et4000w32p_config -}; - -const device_t et4000w32p_noncardex_pci_device = { - .name = "Tseng Labs ET4000/w32p Rev. D PCI", - .internal_name = "et4000w32p_nc_pci", - .flags = DEVICE_PCI, - .local = ET4000W32P, - .init = et4000w32p_init, - .close = et4000w32p_close, - .reset = NULL, - .available = et4000w32p_noncardex_available, - .speed_changed = et4000w32p_speed_changed, - .force_redraw = et4000w32p_force_redraw, - .config = et4000w32p_config -}; - -const device_t et4000w32p_cardex_vlb_device = { +const device_t et4000w32p_cardex_revd_vlb_device = { .name = "Tseng Labs ET4000/w32p Rev. D VLB (Cardex)", .internal_name = "et4000w32p_vlb", .flags = DEVICE_VLB, - .local = ET4000W32P_CARDEX, + .local = CARDEX_REVD, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_cardex_available, + .available = et4000w32p_cardex_revd_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_cardex_pci_device = { +const device_t et4000w32p_cardex_revd_pci_device = { .name = "Tseng Labs ET4000/w32p Rev. D PCI (Cardex)", .internal_name = "et4000w32p_pci", .flags = DEVICE_PCI, - .local = ET4000W32P_CARDEX, + .local = CARDEX_REVD, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_cardex_available, + .available = et4000w32p_cardex_revd_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_vlb_device = { +const device_t et4000w32p_diamond_revd_vlb_device = { .name = "Tseng Labs ET4000/w32p Rev. D VLB (Diamond Stealth32)", .internal_name = "stealth32_vlb", .flags = DEVICE_VLB, - .local = ET4000W32P_DIAMOND, + .local = DIAMOND_STEALTH_32, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_available, + .available = et4000w32p_diamond_revd_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config }; -const device_t et4000w32p_pci_device = { +const device_t et4000w32p_diamond_revd_pci_device = { .name = "Tseng Labs ET4000/w32p Rev. D PCI (Diamond Stealth32)", .internal_name = "stealth32_pci", .flags = DEVICE_PCI, - .local = ET4000W32P_DIAMOND, + .local = DIAMOND_STEALTH_32, .init = et4000w32p_init, .close = et4000w32p_close, .reset = NULL, - .available = et4000w32p_available, + .available = et4000w32p_diamond_revd_available, + .speed_changed = et4000w32p_speed_changed, + .force_redraw = et4000w32p_force_redraw, + .config = et4000w32p_config +}; + +const device_t et4000w32p_generic_revd_vlb_device = { + .name = "Tseng Labs ET4000/w32p Rev. D VLB", + .internal_name = "et4000w32p_nc_vlb", + .flags = DEVICE_VLB, + .local = GENERIC_REVD, + .init = et4000w32p_init, + .close = et4000w32p_close, + .reset = NULL, + .available = et4000w32p_generic_revd_available, + .speed_changed = et4000w32p_speed_changed, + .force_redraw = et4000w32p_force_redraw, + .config = et4000w32p_config +}; + +const device_t et4000w32p_generic_revd_pci_device = { + .name = "Tseng Labs ET4000/w32p Rev. D PCI", + .internal_name = "et4000w32p_nc_pci", + .flags = DEVICE_PCI, + .local = GENERIC_REVD, + .init = et4000w32p_init, + .close = et4000w32p_close, + .reset = NULL, + .available = et4000w32p_generic_revd_available, .speed_changed = et4000w32p_speed_changed, .force_redraw = et4000w32p_force_redraw, .config = et4000w32p_config diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 2333d68b7..210a9f625 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -60,7 +60,7 @@ #define ROM_MIROCRYSTAL20SV_964_PCI "roms/video/s3/mirocrystal.VBI" #define ROM_MIROCRYSTAL20SD_864_VLB "roms/video/s3/Miro20SD.BIN" #define ROM_PHOENIX_86C80X "roms/video/s3/805.VBI" -#define ROM_WINNER1000_805 "roms/video/s3/v01_05_00-C.BIN" +#define ROM_WINNER1000_805 "roms/video/s3/W1000ISA 01.03.00-B.BIN" #define ROM_PARADISE_BAHAMAS64 "roms/video/s3/bahamas64.bin" #define ROM_PHOENIX_VISION864 "roms/video/s3/86c864p.bin" #define ROM_DIAMOND_STEALTH64_964 "roms/video/s3/964_107h.rom" @@ -138,6 +138,7 @@ enum { S3_86C928PCI = 0x06, S3_86C801 = 0x07, S3_86C805 = 0x08, + S3_86C805I = 0x09, S3_VISION964 = 0x18, S3_VISION968 = 0x20, S3_VISION864 = 0x28, @@ -291,6 +292,7 @@ typedef struct s3_t { int16_t px, py; int16_t sx, sy; int16_t dx, dy; + int16_t sx_inc; uint32_t src, dest, pattern; int poly_cx, poly_cx2; @@ -314,7 +316,7 @@ typedef struct s3_t { int color_16bit_check; int color_16bit_check_pixtrans; int16_t minus; - int16_t minus_src_24bpp; + int16_t blit_24bpp; int rd_mask_16bit_check; int start; int mix_dat_upper; @@ -528,8 +530,9 @@ s3_queue(s3_t *s3, uint32_t addr, uint32_t val, uint32_t type) if (FIFO_FULL) { thread_reset_event(s3->fifo_not_full_event); - if (FIFO_FULL) + if (FIFO_FULL) { thread_wait_event(s3->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ + } } fifo->val = val; @@ -656,7 +659,7 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) s3->accel_start(8, 1, val | (val << 16), 0, s3); } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cur_x & 0x400) val = (val >> 8) | (val << 8); @@ -671,7 +674,7 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) s3->accel_start(1, 1, 0xffffffff, val | (val << 16), s3); } } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cur_x & 0x400) val = (val >> 8) | (val << 8); @@ -723,6 +726,7 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) case 0x400: if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { + s3_log("WORD WritePIXTRANS 32=%04x, SX=%d, SY=%d.\n", val, s3->accel.sx, s3->accel.sy); if (s3->accel.cmd & 0x1000) val = (val >> 8) | (val << 8); @@ -794,8 +798,10 @@ s3_accel_out_pixtrans_l(s3_t *s3, uint32_t val) case 0x400: if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { + s3_log("LONG WritePIXTRANS 32=%08x.\n", val); if (s3->accel.cmd & 0x1000) val = ((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24); + s3->accel_start(32, 1, val, 0, s3); } else s3->accel_start(4, 1, 0xffffffff, val, s3); @@ -832,14 +838,15 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) switch (port) { case 0x8148: case 0x82e8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.cur_y = (s3->accel.cur_y & 0xf00) | val; s3->accel.poly_cy = s3->accel.cur_y; break; case 0x8149: case 0x82e9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.cur_y = (s3->accel.cur_y & 0xff) | ((val & 0x0f) << 8); s3->accel.poly_cy = s3->accel.cur_y; - s3_log("[%04X:%08X] OUT PORTB=%04x, valy=%d.\n", CS, cpu_state.pc, port - 1, s3->accel.cur_y); break; case 0x814a: case 0x82ea: @@ -854,18 +861,19 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0x8548: case 0x86e8: - s3->accel.cur_x = (s3->accel.cur_x & 0xf00) | val; + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); + s3->accel.cur_x = (s3->accel.cur_x & 0xf00) | val; s3->accel.cur_x_overflow = (s3->accel.cur_x_overflow & 0xff00) | val; - s3->accel.poly_cx = s3->accel.cur_x << 20; - s3->accel.poly_x = s3->accel.poly_cx >> 20; + s3->accel.poly_cx = s3->accel.cur_x << 20; + s3->accel.poly_x = s3->accel.poly_cx >> 20; break; case 0x8549: case 0x86e9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.cur_x = (s3->accel.cur_x & 0xff) | ((val & 0x0f) << 8); s3->accel.cur_x_overflow = (s3->accel.cur_x_overflow & 0xff) | (val << 8); s3->accel.poly_cx = s3->accel.poly_x = s3->accel.cur_x << 20; - s3->accel.poly_x = s3->accel.poly_cx >> 20; - s3_log("[%04X:%08X] OUT PORTB=%04x, valx=%d, valxover=%d.\n", CS, cpu_state.pc, port - 1, s3->accel.cur_x, s3->accel.cur_x_overflow); + s3->accel.poly_x = s3->accel.poly_cx >> 20; break; case 0x854a: case 0x86ea: @@ -881,15 +889,18 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xcae8: case 0x8948: case 0x8ae8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.desty_axstp = (s3->accel.desty_axstp & 0x3f00) | val; s3->accel.point_1_updated = 1; break; case 0xcae9: case 0x8949: case 0x8ae9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.desty_axstp = (s3->accel.desty_axstp & 0xff) | ((val & 0x3f) << 8); if (val & 0x20) s3->accel.desty_axstp |= ~0x3fff; + s3->accel.point_1_updated = 1; break; case 0x894a: @@ -902,21 +913,25 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) s3->accel.desty_axstp2 = (s3->accel.desty_axstp2 & 0xff) | ((val & 0x3f) << 8); if (val & 0x20) s3->accel.desty_axstp2 |= ~0x3fff; + s3->accel.point_2_updated = 1; break; case 0x8d48: case 0x8ee8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.destx_distp = (s3->accel.destx_distp & 0x3f00) | val; s3->accel.destx_overflow = (s3->accel.destx_overflow & 0xff00) | val; s3->accel.point_1_updated = 1; break; case 0x8d49: case 0x8ee9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); s3->accel.destx_distp = (s3->accel.destx_distp & 0xff) | ((val & 0x3f) << 8); s3->accel.destx_overflow = (s3->accel.destx_overflow & 0xff) | (val << 8); if (val & 0x20) s3->accel.destx_distp |= ~0x3fff; + s3->accel.point_1_updated = 1; break; case 0x8d4a: @@ -980,6 +995,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) s3->accel.cmd = (s3->accel.cmd & 0xff) | (val << 8); s3->accel.ssv_state = 0; if (s3->bpp == 3) { + s3_log("Command Misc1=%04x.\n", s3->accel.multifunc[0xe]); if (!(s3->accel.multifunc[0xe] & 0x200)) s3->accel.multifunc[0xe] &= ~0x10; } @@ -1235,6 +1251,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xa94a: case 0xaaea: + s3_log("[%04X:%08X] OUT PORTB=%04x (Write Mask), val=%02x.\n", CS, cpu_state.pc, port, val); if (s3->chip >= S3_VISION964) { if (s3->accel.multifunc[0xe] & 0x200) s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16); @@ -1515,14 +1532,26 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xb548: case 0xb6e8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); s3->accel.bkgd_mix = val; break; + case 0xb549: + case 0xb6e9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); + break; + case 0xb948: case 0xbae8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); s3->accel.frgd_mix = val; break; + case 0xb949: + case 0xbae9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); + break; + case 0xbd48: case 0xbee8: s3->accel.multifunc_cntl = (s3->accel.multifunc_cntl & 0xff00) | val; @@ -1598,18 +1627,22 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xe948: case 0xeae8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port, s3->accel.cmd); s3->accel.pat_y = (s3->accel.pat_y & 0xf00) | val; break; case 0xe949: case 0xeae9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port, s3->accel.cmd); s3->accel.pat_y = (s3->accel.pat_y & 0xff) | ((val & 0x0f) << 8); break; case 0xe94a: case 0xeaea: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port, s3->accel.cmd); s3->accel.pat_x = (s3->accel.pat_x & 0xf00) | val; break; case 0xe94b: case 0xeaeb: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port, s3->accel.cmd); s3->accel.pat_x = (s3->accel.pat_x & 0xff) | ((val & 0x0f) << 8); break; case 0xed48: @@ -1681,7 +1714,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) else s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0], s3); } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { s3->accel.pix_trans[1] = svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx - s3->accel.minus)) & s3->vram_mask]; if (s3->accel.cmd & 0x1000) { @@ -2177,7 +2210,9 @@ s3_accel_write_fifo_w(s3_t *s3, uint32_t addr, uint16_t val) s3_accel_out_fifo_w(s3, 0x9ee8, val); } else if (((addr & 0x1fffe) >= 0x8000) && (addr & 0x1fffe) < 0x10000) { if (((addr & 0x1fffe) == 0xe2e8) || ((addr & 0x1fffe) == 0xe2ea)) { - if ((s3->chip == S3_86C801) || (s3->chip == S3_86C805) || (s3->chip == S3_86C928) || (s3->chip == S3_86C928PCI)) + if ((s3->chip == S3_86C801) || (s3->chip == S3_86C805) || + (s3->chip == S3_86C928) || + (s3->chip == S3_86C928PCI)) s3_accel_out_pixtrans_w(s3, val); else { s3_accel_write_fifo(s3, addr, val); @@ -2306,9 +2341,10 @@ s3_hwcursor_draw(svga_t *svga, int displine) case 15: fg = video_15to32[s3->hwc_fg_col & 0xffff]; bg = video_15to32[s3->hwc_bg_col & 0xffff]; - if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805)) { + if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805I)) { if (!s3->color_16bit) { - if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805)) { + if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805) && + (s3->card_type != S3_WINNER1000_805)) { if (!(svga->crtc[0x45] & 0x04)) { shift = 2; width = 8; @@ -2331,9 +2367,10 @@ s3_hwcursor_draw(svga_t *svga, int displine) case 16: fg = video_16to32[s3->hwc_fg_col & 0xffff]; bg = video_16to32[s3->hwc_bg_col & 0xffff]; - if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805)) { + if ((s3->chip >= S3_86C928) && (s3->chip <= S3_86C805I)) { if (!s3->color_16bit) { - if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805)) { + if ((s3->card_type != S3_MIROCRYSTAL10SD_805) && (s3->card_type != S3_MIROCRYSTAL8S_805) && + (s3->card_type != S3_WINNER1000_805)) { if (!(svga->crtc[0x45] & 0x04)) { shift = 2; width = 8; @@ -2357,7 +2394,7 @@ s3_hwcursor_draw(svga_t *svga, int displine) break; case 24: - if (s3->chip <= S3_86C805) { + if (s3->chip <= S3_86C805I) { fg = svga->pallook[svga->crtc[0xe]]; bg = svga->pallook[svga->crtc[0xf]]; } else { @@ -3131,7 +3168,7 @@ s3_out(uint16_t addr, uint8_t val, void *priv) case 0x50: s3->bpp = (svga->crtc[0x50] >> 4) & 3; - s3_log("S3 BPP=%d.\n", s3->bpp); + s3_log("S3 BPP=%d, VGA=%d, Misc1=%04x.\n", s3->bpp, svga->bpp, s3->accel.multifunc[0xe]); if (s3->bpp == 3) { if (!(s3->accel.multifunc[0xe] & 0x200)) /*On True Color mode change, reset bit 4 of Misc Index register*/ s3->accel.multifunc[0xe] &= ~0x10; @@ -3166,7 +3203,8 @@ s3_out(uint16_t addr, uint8_t val, void *priv) break; case 0x51: - if (s3->chip == S3_86C801 || s3->chip == S3_86C805) { + if ((s3->chip == S3_86C801) || (s3->chip == S3_86C805) || + (s3->chip == S3_86C805I)) { s3->bank = (s3->bank & 0x6f) | ((val & 0x4) << 2); s3->ma_ext = (s3->ma_ext & ~0x4) | ((val & 1) << 2); } else { @@ -3190,10 +3228,10 @@ s3_out(uint16_t addr, uint8_t val, void *priv) break; case 0x45: + s3_log("Write CRTC45=%02x.\n", val); if ((s3->chip == S3_VISION964) || (s3->chip == S3_VISION968)) break; svga->hwcursor.ena = val & 1; - s3_log("Write CRTC45=%02x.\n", val); break; case 0x46: case 0x47: @@ -3295,7 +3333,7 @@ s3_out(uint16_t addr, uint8_t val, void *priv) case 0x43: if (s3->chip < S3_VISION964) { - if (s3->chip <= S3_86C805) + if (s3->chip <= S3_86C805I) svga_recalctimings(svga); s3_io_remove_alt(s3); @@ -3423,8 +3461,8 @@ s3_in(uint16_t addr, void *priv) temp = att498_ramdac_in(addr, rs2, svga->ramdac, svga); break; case BT48X: - if (s3->chip == S3_86C928) - rs3 = !!(svga->crtc[0x55] & 0x28) || !!(svga->crtc[0x45] & 0x20) || !!(svga->crtc[0x55] & 0x02); /*Quite insane but Win95's S3 driver wants it set at all costs for 8bpp+ mode*/ + if (s3->card_type == S3_METHEUS_86C928) + rs3 = !!(svga->crtc[0x55] & 0x28) || !!(svga->crtc[0x45] & 0x20) || !!(svga->crtc[0x55] & 0x02); /*Quite insane but Win95's S3 driver wants it set at all costs for 8bpp+ mode in the Metheus card*/ else rs3 = !!(svga->crtc[0x55] & 0x02); @@ -3658,9 +3696,10 @@ s3_readl(uint32_t addr, void *priv) static void s3_recalctimings(svga_t *svga) { - s3_t *s3 = (s3_t *) svga->priv; - int clk_sel = (svga->miscout >> 2) & 3; + s3_t *s3 = (s3_t *) svga->priv; + int clk_sel = (svga->miscout >> 2) & 3; uint8_t mask = 0xc0; + int enhanced_8bpp_modes = 0x00; if (svga->crtc[0x33] & 0x20) { /* In this mode, the dots per clock are always 8 or 16, never 9 or 18. */ @@ -3737,12 +3776,12 @@ s3_recalctimings(svga_t *svga) break; } - if (s3->chip >= S3_TRIO32) { + if ((s3->chip >= S3_TRIO32) || (s3->chip == S3_86C805I)) { switch (svga->crtc[0x67] >> 4) { case 3: case 5: case 7: - svga->clock /= 2; + svga->clock /= 2.0; break; default: @@ -3750,7 +3789,38 @@ s3_recalctimings(svga_t *svga) } } - if (s3->chip <= S3_86C805) { + enhanced_8bpp_modes = !!((svga->crtc[0x3a] & 0x10) && !svga->lowres); + + if (s3->chip >= S3_86C928) { + if (s3->chip != S3_86C801) + mask |= 0x01; + + switch (svga->crtc[0x50] & mask) { + case 0x00: + s3->width = (svga->crtc[0x31] & 0x02) ? 2048 : 1024; + break; + case 0x01: + s3->width = 1152; + break; + case 0x40: + s3->width = 640; + break; + case 0x80: + /*For later chips, bit 2 of port 0x4ae8 means 1600x1200x4bpp if the original width is 800 (per Vision864 manual).*/ + s3->width = ((s3->chip > S3_86C805I) && (s3->accel.advfunc_cntl & 0x04) && !enhanced_8bpp_modes) ? 1600 : 800; + break; + case 0x81: + s3->width = 1600; + break; + case 0xc0: + s3->width = 1280; + break; + default: + break; + } + } + + if (s3->chip <= S3_86C805I) { s3->color_16bit = !!(svga->crtc[0x43] & 0x08); s3_log("Color 16bit=%x, bpp=%d, 256color=%x.\n", s3->color_16bit, svga->bpp, (svga->attrregs[0x10] & 0x40)); if ((svga->bpp == 24) || (svga->bpp == 8)) @@ -3764,36 +3834,6 @@ s3_recalctimings(svga_t *svga) } } - if (s3->chip >= S3_86C928) { - if (s3->chip != S3_86C801) - mask |= 0x01; - - switch (svga->crtc[0x50] & mask) { - case 0x00: - s3->width = (svga->crtc[0x31] & 0x02) ? 2048 : 1024; - if (s3->color_16bit) - s3->width = 1024; - break; - case 0x01: - s3->width = 1152; - break; - case 0x40: - s3->width = 640; - break; - case 0x80: - s3->width = ((s3->chip > S3_86C805) && (s3->accel.advfunc_cntl & 0x04)) ? 1600 : 800; - break; - case 0x81: - s3->width = 1600; - break; - case 0xc0: - s3->width = 1280; - break; - default: - break; - } - } - if (svga->crtc[0x33] & 0x20) { /* The S3 version of the Cirrus' special blanking mode, with identical behavior. */ svga->hblankstart = (((svga->crtc[0x5d] & 0x02) >> 1) << 8) + svga->crtc[1]/* + @@ -3822,11 +3862,11 @@ s3_recalctimings(svga_t *svga) } } - if ((svga->crtc[0x3a] & 0x10) && !svga->lowres) { + if (enhanced_8bpp_modes) { s3_log("BPP=%d, pitch=%d, width=%02x, double?=%x, 16bit?=%d, highres?=%d, " - "attr=%02x, hdisp=%d, dotsperclock=%x, clksel=%x, clockmultiplier=%d, multiplexingrate=%d.\n", svga->bpp, s3->width, svga->crtc[0x50], + "attr=%02x, hdisp=%d, dotsperclock=%x, clksel=%x, clockmultiplier=%d, multiplexingrate=%d, xadd=%d, overscanx=%d.\n", svga->bpp, s3->width, svga->crtc[0x50], svga->crtc[0x31] & 0x02, s3->color_16bit, s3->accel.advfunc_cntl & 0x04, - svga->attrregs[0x10] & 0x40, svga->hdisp, svga->dots_per_clock, clk_sel, svga->clock_multiplier, svga->multiplexing_rate); + svga->attrregs[0x10] & 0x40, svga->hdisp, svga->dots_per_clock, clk_sel, svga->clock_multiplier, svga->multiplexing_rate, svga->x_add, svga->monitor->mon_overscan_x); switch (svga->bpp) { case 8: svga->render = svga_render_8bpp_highres; @@ -3839,8 +3879,10 @@ s3_recalctimings(svga_t *svga) if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ if ((svga->clock_multiplier == 1) || (s3->width >= 1024)) { if (svga->multiplexing_rate == 2) { - svga->hdisp <<= 2; - svga->dots_per_clock <<= 2; + if (svga->clock_multiplier == 1) { + svga->hdisp <<= 2; + svga->dots_per_clock <<= 2; + } } else { if (!svga->clock_multiplier) { svga->hdisp <<= 1; @@ -3875,70 +3917,61 @@ s3_recalctimings(svga_t *svga) break; } break; + case S3_86C801: + case S3_86C805: + case S3_86C805I: case S3_86C928PCI: if (!svga->chain4) svga->chain4 |= 0x08; break; case S3_VISION964: - switch (s3->card_type) { - case S3_ELSAWIN2KPROX_964: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - default: - break; + switch (s3->ramdac_type) { + case BT48X: /*BT485 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + } + break; + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + break; + default: + break; + } + break; + case S3_VISION868: + switch (s3->ramdac_type) { + case ATT498: /*AT&T 498 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + if (s3->width >= 1024) + svga->clock /= 2.0; } break; - default: break; } break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_DIAMOND_STEALTH64_968: - case S3_NUMBER9_9FX_771: - case S3_PHOENIX_VISION968: - case S3_SPEA_MERCURY_P64V: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock *= 2.0; - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_ELSAWIN2KPROX: - s3_log("S3 width 8bpp=%d, hdisp=%d.\n", s3->width, svga->hdisp); - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; } break; - + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + s3_log("TVP3026 968 8bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; default: break; } @@ -3958,45 +3991,35 @@ s3_recalctimings(svga_t *svga) break; case S3_86C801: - switch (s3->card_type) { - case S3_PHOENIX_86C801: + case S3_86C805: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; break; - + case ATT49X: /*AT&T 490/1/2 RAMDAC*/ + if (svga->dots_per_clock != 16) { + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } else { + svga->clock *= 2.0; + svga->dots_per_clock >>= 2; + } + break; default: break; } break; - case S3_86C805: - switch (s3->card_type) { - case S3_MIROCRYSTAL8S_805: - case S3_MIROCRYSTAL10SD_805: - case S3_WINNER1000_805: - case S3_PHOENIX_86C805: - case S3_86C805_ONBOARD: + case S3_86C805I: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; break; - - case S3_SPEA_MIRAGE_86C805: - svga->hdisp >>= 1; - svga->dots_per_clock >>= 1; - switch (s3->width) { - case 800: - case 1024: - if (svga->hdisp == 400) { - /*SPEA specific drivers + its VBE RAM BIOS...*/ - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock /= 2.0; - } - break; - default: - break; - } - break; - default: break; } @@ -4085,93 +4108,62 @@ s3_recalctimings(svga_t *svga) case S3_VISION864: svga->hdisp >>= 1; svga->dots_per_clock >>= 1; + svga->clock /= 2.0; break; case S3_VISION964: - switch (s3->card_type) { - case S3_ELSAWIN2KPROX_964: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case BT48X: /*BT485 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); } break; - + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + break; default: break; } break; case S3_VISION868: - switch (s3->card_type) { - case S3_PHOENIX_VISION868: - case S3_NUMBER9_9FX_531: + switch (s3->ramdac_type) { + case ATT498: /*AT&T 498 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + svga->clock /= 2.0; + } + break; + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; svga->clock /= 2.0; break; - default: break; } break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_DIAMOND_STEALTH64_968: - case S3_NUMBER9_9FX_771: - case S3_PHOENIX_VISION968: - case S3_SPEA_MERCURY_P64V: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock *= 2.0; - /* TODO: Is this still needed? */ - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - - case S3_ELSAWIN2KPROX: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; } break; + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + s3_log("TVP3026 968 15bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; default: break; } @@ -4197,43 +4189,35 @@ s3_recalctimings(svga_t *svga) break; case S3_86C801: - switch (s3->card_type) { - case S3_PHOENIX_86C801: + case S3_86C805: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; break; - + case ATT49X: /*AT&T 490/1/2 RAMDAC*/ + if (svga->dots_per_clock != 16) { + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } else { + svga->clock *= 2.0; + svga->dots_per_clock >>= 2; + } + break; default: break; } break; - case S3_86C805: - switch (s3->card_type) { - case S3_MIROCRYSTAL8S_805: - case S3_MIROCRYSTAL10SD_805: - case S3_WINNER1000_805: - case S3_PHOENIX_86C805: - case S3_86C805_ONBOARD: + case S3_86C805I: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; break; - - case S3_SPEA_MIRAGE_86C805: - svga->hdisp >>= 1; - switch (s3->width) { - case 800: - case 1024: - if (svga->hdisp == 400) { - /*SPEA specific drivers + its VBE RAM BIOS...*/ - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - break; - default: - break; - } - break; - default: break; } @@ -4322,92 +4306,62 @@ s3_recalctimings(svga_t *svga) case S3_VISION864: svga->hdisp >>= 1; svga->dots_per_clock >>= 1; + svga->clock /= 2.0; break; case S3_VISION868: - switch (s3->card_type) { - case S3_PHOENIX_VISION868: - case S3_NUMBER9_9FX_531: + switch (s3->ramdac_type) { + case ATT498: /*AT&T 498 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + svga->clock /= 2.0; + } + break; + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; + svga->clock /= 2.0; break; - default: break; } break; case S3_VISION964: - switch (s3->card_type) { - case S3_ELSAWIN2KPROX_964: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case BT48X: /*BT485 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); } break; - + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + break; default: break; } break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_DIAMOND_STEALTH64_968: - case S3_NUMBER9_9FX_771: - case S3_PHOENIX_VISION968: - case S3_SPEA_MERCURY_P64V: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock *= 2.0; - /* TODO: Is this still needed? */ - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - - case S3_ELSAWIN2KPROX: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; } break; + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } + s3_log("TVP3026 968 16bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; default: break; } @@ -4440,26 +4394,15 @@ s3_recalctimings(svga_t *svga) } break; case S3_86C801: - switch (s3->card_type) { - case S3_PHOENIX_86C801: - case S3_SPEA_MIRAGE_86C801: - svga->hdisp = (svga->hdisp << 1) / 3; - svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; - break; - default: - break; - } - break; case S3_86C805: - switch (s3->card_type) { - case S3_MIROCRYSTAL8S_805: - case S3_MIROCRYSTAL10SD_805: - case S3_WINNER1000_805: - case S3_PHOENIX_86C805: - case S3_SPEA_MIRAGE_86C805: - case S3_86C805_ONBOARD: + case S3_86C805I: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: svga->hdisp = (svga->hdisp << 1) / 3; svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; + svga->clock = (svga->clock * 4.0) / 3.0; break; default: break; @@ -4470,21 +4413,24 @@ s3_recalctimings(svga_t *svga) svga->chain4 |= 0x08; break; case S3_86C928PCI: /*Technically the 928 cards don't support 24bpp.*/ - switch (s3->card_type) { - case S3_ELSAWIN1KPCI_86C928: - if (svga->dots_per_clock == 16) { - svga->dots_per_clock >>= 1; + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case SC1502X: /*SC15025 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + if (svga->dots_per_clock == 16) { + svga->dots_per_clock >>= 1; + svga->hdisp = (svga->hdisp << 1) / 3; + svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; + svga->clock = (svga->clock * 4.0) / 3.0; + if (svga->hdisp == 640) + s3->width = 640; + } + } else if (svga->getclock == av9194_getclock) { /*AV9194 clock chip*/ svga->hdisp = (svga->hdisp << 1) / 3; svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; - svga->clock /= (2.0 / 3.0); - if (svga->hdisp == 640) - s3->width = 640; } break; - case S3_SPEA_MERCURY_LITE_PCI: - svga->hdisp = (svga->hdisp << 1) / 3; - svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; - break; default: break; } @@ -4492,14 +4438,23 @@ s3_recalctimings(svga_t *svga) case S3_VISION864: svga->hdisp = (svga->hdisp << 1) / 3; svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; - svga->clock /= (2.0 / 3.0); + svga->clock = (svga->clock * 4.0) / 3.0; break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - svga->hdisp = (svga->hdisp / 3) << 2; - svga->dots_per_clock = (svga->hdisp / 3) << 2; + switch (s3->ramdac_type) { + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + svga->hdisp = (svga->hdisp << 1) / 3; + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock = (svga->clock * 4.0) / 3.0; + } + svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; + + s3_log("TVP3026 968 24bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (svga->hdisp == 832) + svga->hdisp -= 32; break; default: break; @@ -4519,6 +4474,25 @@ s3_recalctimings(svga_t *svga) case 32: svga->render = svga_render_32bpp_highres; switch (s3->chip) { + case S3_86C805I: + if (!svga->chain4) + svga->chain4 |= 0x08; + switch (s3->ramdac_type) { + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ + svga->hdisp >>= 2; + svga->dots_per_clock >>= 2; + if (s3->width == 800) { + if ((svga->crtc[0x67] >> 4) == 7) { + svga->clock *= 2.0; + s3_log("800x600: MEMLatch=%08x, htotal=%x.\n", svga->memaddr_latch, svga->htotal); + } + } + break; + default: + break; + } + break; + case S3_86C928: if (!svga->chain4) svga->chain4 |= 0x08; @@ -4576,103 +4550,54 @@ s3_recalctimings(svga_t *svga) case S3_VISION864: svga->hdisp >>= 2; svga->dots_per_clock >>= 2; + svga->clock /= 2.0; break; case S3_VISION868: - switch (s3->card_type) { - case S3_PHOENIX_VISION868: - case S3_NUMBER9_9FX_531: + switch (s3->ramdac_type) { + case ATT498: /*AT&T 498 RAMDAC*/ + if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } + break; + case S3_SDAC: /*S3 SDAC/GENDAC RAMDAC with its clock chip*/ svga->hdisp >>= 1; svga->dots_per_clock >>= 1; - svga->clock /= 2.0; break; default: break; } break; case S3_VISION964: - switch (s3->card_type) { - case S3_MIROCRYSTAL20SV_964: - switch (s3->width) { - case 800: - case 1024: - svga->hdisp >>= 1; - svga->dots_per_clock >>= 1; - svga->clock /= 2.0; - break; - default: - break; - } - break; - case S3_ELSAWIN2KPROX_964: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; - } + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); break; default: break; } break; case S3_VISION968: - switch (s3->card_type) { - case S3_MIROVIDEO40SV_ERGO_968: - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - case S3_DIAMOND_STEALTH64_968: - case S3_NUMBER9_9FX_771: - case S3_PHOENIX_VISION968: - case S3_SPEA_MERCURY_P64V: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - svga->clock *= 2.0; - /* TODO: Is this still needed? */ - if (svga->hdisp == 832) - svga->hdisp -= 32; - break; - - case S3_ELSAWIN2KPROX: - switch (s3->width) { - case 1280: - case 1600: - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - break; - case 2048: - if (!svga->interlace) { - if (svga->dispend >= 1024) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } else { - if (svga->dispend >= 512) { - svga->hdisp <<= 1; - svga->dots_per_clock <<= 1; - } - } - break; - default: - break; + switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp *= (svga->clock_multiplier + 1); + svga->dots_per_clock *= (svga->clock_multiplier + 1); + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; } break; + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ + s3_log("TVP3026 968 32bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); + if (clk_sel == 2) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; + } + if (svga->hdisp == 832) + svga->hdisp -= 32; + break; default: break; } @@ -4703,10 +4628,13 @@ s3_recalctimings(svga_t *svga) svga->write_bank = 0; svga->read_bank = 0; } + /*In non-enhanced/IBM VGA modes, reset the misc index registers.*/ + s3->accel.multifunc[0xd] = 0xd000; + s3->accel.multifunc[0xe] = 0xe000; } } - if ((((s3->card_type == S3_ELSAWIN1K_86C928) || (s3->card_type == S3_ELSAWIN1KPCI_86C928)) && (svga->bpp == 32)) || + if ((s3->elsa_eeprom && (svga->bpp == 32)) || (s3->chip == S3_TRIO32) || (s3->chip == S3_TRIO64) || (s3->chip == S3_VISION864) || (s3->chip == S3_VISION868) || (s3->chip == S3_VISION968)) svga->hoverride = 1; else @@ -4976,7 +4904,7 @@ s3_updatemapping(s3_t *s3) if (s3->chip >= S3_86C928) { s3->linear_base = (svga->crtc[0x5a] << 16) | (svga->crtc[0x59] << 24); - if (s3->chip <= S3_86C805) { + if (s3->chip <= S3_86C805I) { if (s3->vlb) s3->linear_base &= 0x03ffffff; else if (!s3->pci) @@ -5036,8 +4964,8 @@ s3_updatemapping(s3_t *s3) } svga->fb_only = 1; } else { - svga->fb_only = 0; mem_mapping_disable(&s3->linear_mapping); + svga->fb_only = 0; } /* Memory mapped I/O. */ @@ -5122,11 +5050,10 @@ s3_accel_out(uint16_t port, uint8_t val, void *priv) case 0x4948: case 0x4ae8: s3->accel.advfunc_cntl = val; - if ((s3->chip > S3_86C805) && ((svga->crtc[0x50] & 0xc1) == 0x80)) { - s3->width = (val & 4) ? 1600 : 800; + if ((s3->chip > S3_86C805I) && ((svga->crtc[0x50] & 0xc1) == 0x80)) { svga->fullchange = svga->monitor->mon_changeframecount; svga_recalctimings(svga); - } else if (s3->chip <= S3_86C805) { + } else if (s3->chip <= S3_86C805I) { svga->fullchange = svga->monitor->mon_changeframecount; svga_recalctimings(svga); } @@ -6256,7 +6183,7 @@ s3_accel_in_w(uint16_t port, void *priv) s3->accel_start(8, 1, temp | (temp << 16), 0, s3); } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cur_x & 0x400) temp = (temp >> 8) | (temp << 8); @@ -6266,7 +6193,7 @@ s3_accel_in_w(uint16_t port, void *priv) s3->accel_start(1, 1, 0xffffffff, temp | (temp << 16), s3); } } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cur_x & 0x400) temp = (temp >> 8) | (temp << 8); @@ -6443,6 +6370,7 @@ s3_accel_write_w(uint32_t addr, uint16_t val, void *priv) s3_accel_write_fifo(s3, addr, val); break; default: + s3_log("FIFOWORD Write=%04x, val=%04x.\n", addr & (addr_mask - 1), val); s3_queue(s3, addr & addr_mask, val, FIFO_WRITE_WORD); break; } @@ -6607,6 +6535,7 @@ s3_accel_write_l(uint32_t addr, uint32_t val, void *priv) break; default: + s3_log("FIFOLONG Write=%04x, val=%08x.\n", addr & (addr_mask - 3), val); s3_queue(s3, addr & addr_mask, val, FIFO_WRITE_DWORD); break; } @@ -6962,7 +6891,7 @@ polygon_setup(s3_t *s3) } #define READ(addr, dat) \ - if (((s3->bpp == 0) && !s3->color_16bit) || (s3->bpp == 2)) \ + if (((s3->bpp == 0) && !s3->color_16bit)) \ dat = svga->vram[dword_remap(svga, addr) & s3->vram_mask]; \ else if ((s3->bpp == 1) || s3->color_16bit) \ dat = vram_w[dword_remap_w(svga, addr) & (s3->vram_mask >> 1)]; \ @@ -7807,12 +7736,10 @@ polygon_setup(s3_t *s3) { \ old_dest_dat = dest_dat; \ ROPMIX_READ(dest_dat, pat_dat, src_dat); \ - out = (out & s3->accel.wrt_mask) | (old_dest_dat & ~s3->accel.wrt_mask); \ - out &= 0xFFFFFF; \ } #define WRITE(addr, dat) \ - if (((s3->bpp == 0) && !s3->color_16bit) || (s3->bpp == 2)) { \ + if (((s3->bpp == 0) && !s3->color_16bit)) { \ svga->vram[dword_remap(svga, addr) & s3->vram_mask] = dat; \ svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; \ } else if ((s3->bpp == 1) || s3->color_16bit) { \ @@ -8041,7 +7968,7 @@ s3_visionx68_video_engine_op(uint32_t cpu_dat, s3_t *s3) s3->videoengine.busy = 1; if (host) { - if (idf == 0 && odf == 0) { + if ((idf == 0) && (odf == 0)) { if (s3->bpp == 0) count = 4; else if (s3->bpp == 1) @@ -8093,6 +8020,7 @@ s3_visionx68_video_engine_op(uint32_t cpu_dat, s3_t *s3) s3->videoengine.dx = 0.0; } + s3_log("VideoEngine count=%d.\n", count); while (count) { if (host) { /*Source data is CPU*/ src = cpu_dat; @@ -8235,6 +8163,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi int clip_r = s3->accel.multifunc[4] & 0xfff; int vram_mask = (s3->accel.multifunc[0xa] & 0xc0) == 0xc0; uint32_t mix_mask = 0; + uint8_t *vram_b = svga->vram; uint16_t *vram_w = (uint16_t *) svga->vram; uint32_t *vram_l = (uint32_t *) svga->vram; uint32_t compare = s3->accel.color_cmp; @@ -8279,21 +8208,23 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (!cpu_input) s3->accel.dat_count = 0; - if (cpu_input && (((s3->accel.multifunc[0xa] & 0xc0) != 0x80) || (!(s3->accel.cmd & 0x02)))) { - if ((s3->bpp == 3) && (count == 2)) { - if (s3->accel.dat_count) { - cpu_dat = ((cpu_dat & 0xffff) << 16) | s3->accel.dat_buf; - count = 4; - s3->accel.dat_count = 0; - } else { - s3->accel.dat_buf = cpu_dat & 0xffff; - s3->accel.dat_count = 1; + if (cpu_input) { + if (((s3->accel.multifunc[0xa] & 0xc0) != 0x80) || (!(s3->accel.cmd & 0x02))) { + if ((s3->bpp == 3) && (count == 2)) { + if (s3->accel.dat_count) { + cpu_dat = ((cpu_dat & 0xffff) << 16) | s3->accel.dat_buf; + count = 4; + s3->accel.dat_count = 0; + } else { + s3->accel.dat_buf = cpu_dat & 0xffff; + s3->accel.dat_count = 1; + } } + if ((s3->bpp == 1) || s3->color_16bit) + count >>= 1; + else if (s3->bpp == 3) + count >>= 2; } - if ((s3->bpp == 1) || s3->color_16bit) - count >>= 1; - else if (s3->bpp == 3) - count >>= 2; } if ((s3->bpp == 0) && !s3->color_16bit) @@ -8327,7 +8258,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi /*Bit 4 of the Command register is the draw yes bit, which enables writing to memory/reading from memory when enabled. When this bit is disabled, no writing to memory/reading from memory is allowed. (This bit is almost meaningless on the NOP command)*/ - s3_log("CMD=%d, full=%04x, s3bpp=%x, clr=%d, clb=%d, sourcedisplay=%02x, mmio=%02x, srcbase=%08x, dstbase=%08x, cpu=%04x, mix=%04x, count=%d, rd_mask=%04x, wrt_mask=%04x, width=%d, s=%d,%d, c=%d,%d, d=%d,%d, 16bitcolor=%x, frgdcolor=%04x, bkgdcolor=%04x, frgdsel=%d, bkgdsel=%d, frgdmix=%02x, curx=%d, cury=%d, cll=%d, b2e8pix=%x.\n", cmd, s3->accel.cmd, s3->bpp, clip_r, clip_b, s3->accel.multifunc[0x0a] & 0xc4, svga->crtc[0x53] & 0x18, srcbase, dstbase, cpu_dat & 0xffff, mix_dat & 0xffff, count, rd_mask, wrt_mask, s3->width, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->color_16bit, frgd_color, bkgd_color, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.cur_x, s3->accel.cur_y, clip_l, s3->accel.b2e8_pix); + s3_log("CMD=%d, full=%04x, cnt=%d, s3bpp=%x, clr=%d, clb=%d, sourcedisplay=%02x, mmio=%02x, srcbase=%08x, dstbase=%08x, cpu=%08x, mix=%08x, count=%d, rd_mask=%08x, wrt_mask=%08x, width=%d, s=%d,%d, c=%d,%d, d=%d,%d, 16bitcolor=%x, frgdcolor=%08x, bkgdcolor=%08x, frgdsel=%d, bkgdsel=%d, frgdmix=%02x, curx=%d, cury=%d, cll=%d, b2e8pix=%x.\n", cmd, s3->accel.cmd, count, s3->bpp, clip_r, clip_b, s3->accel.multifunc[0x0a] & 0xc4, svga->crtc[0x53] & 0x18, srcbase, dstbase, cpu_dat & 0xffffffff, mix_dat & 0xffffffff, count, rd_mask, wrt_mask, s3->width, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy, s3->accel.destx_distp, s3->accel.desty_axstp, s3->color_16bit, frgd_color, bkgd_color, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.cur_x, s3->accel.cur_y, clip_l, s3->accel.b2e8_pix); switch (cmd) { case 0: /*NOP (Short Stroke Vectors)*/ @@ -8444,6 +8375,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.cx *= 3; + s3->accel.cy *= 3; + } + s3->accel.sy = s3->accel.maj_axis_pcnt; if ((s3->bpp == 0) && s3->color_16bit) { s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00) && rd_mask; @@ -8468,7 +8404,120 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } if (s3->accel.cmd & 0x08) { /*Radial*/ - if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->bpp == 2) { + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if ((rd_mask == 0x0000ffff) || (rd_mask == 0x000000ff)) + rd_mask = 0xffffffff; + + while (count-- && (s3->accel.sy >= 0)) { + if ((s3->accel.cx & 0xfff) >= (clip_l * 3) && (s3->accel.cx & 0xfff) <= (clip_r * 3) && (s3->accel.cy & 0xfff) >= (clip_t * 3) && (s3->accel.cy & 0xfff) <= (clip_b * 3)) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = 0; + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + dest_dat = (*(uint32_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask]) & 0xffffff; + + old_dest_dat = dest_dat; + MIX + + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx + 1 - (s3->accel.minus * 3)) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx + 2 - (s3->accel.minus * 3)) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[(((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } + } + + mix_dat <<= 1; + mix_dat |= 1; + cpu_dat >>= 16; + + if (!s3->accel.sy) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) + s3->accel.color_16bit_check = 0; + else + s3->accel.color_16bit_check = 1; + } + break; + } + + switch (s3->accel.cmd & 0xe0) { + case 0x00: + s3->accel.cx += 3; + break; + case 0x20: + s3->accel.cx += 3; + s3->accel.cy -= 3; + break; + case 0x40: + s3->accel.cy -= 3; + break; + case 0x60: + s3->accel.cx -= 3; + s3->accel.cy -= 3; + break; + case 0x80: + s3->accel.cx -= 3; + break; + case 0xa0: + s3->accel.cx -= 3; + s3->accel.cy += 3; + break; + case 0xc0: + s3->accel.cy += 3; + break; + case 0xe0: + s3->accel.cx += 3; + s3->accel.cy += 3; + break; + + default: + break; + } + s3->accel.sy--; + s3->accel.cx &= 0xfff; + s3->accel.cy &= 0xfff; + } + s3->accel.cur_x = (s3->accel.cx / 3) & 0xfff; + s3->accel.cur_y = (s3->accel.cy / 3) & 0xfff; + break; + } + + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); @@ -8589,7 +8638,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Pattern on pixtrans (911/924)*/ count = s3->accel.maj_axis_pcnt + 1; s3->accel.temp_cnt = 16; - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); @@ -8605,7 +8654,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } } else { - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit || (svga->bpp == 24))) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); @@ -8625,6 +8674,132 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (!s3->accel.b2e8_pix) s3_log("CMDFULL=%04x, FRGDMIX=%x, FRGDCOLR=%04x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, CLIPT=%d, CLIPB=%d.\n", s3->accel.cmd, frgd_mix, s3->accel.frgd_color, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, clip_t, clip_b); + if (s3->bpp == 2) { + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if ((rd_mask == 0x0000ffff) || (rd_mask == 0x000000ff)) + rd_mask = 0xffffffff; + + while (count-- && (s3->accel.sy >= 0)) { + if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { + mix_dat >>= 16; + s3->accel.temp_cnt = 16; + } + + if (s3->accel.minus) + s3_log("Total pixel cx=%d, cy=%d.\n", s3->accel.cx - s3->accel.minus, s3->accel.cy); + + if ((s3->accel.cx & 0xfff) >= (clip_l * 3) && (s3->accel.cx & 0xfff) <= (clip_r * 3) && (s3->accel.cy & 0xfff) >= (clip_t * 3) && (s3->accel.cy & 0xfff) <= (clip_b * 3)) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = 0; + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + dest_dat = (*(uint32_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask]) & 0xffffff; + + old_dest_dat = dest_dat; + MIX + + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx + 1 - (s3->accel.minus * 3)) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[((s3->accel.cy * s3->width) + s3->accel.cx + 2 - (s3->accel.minus * 3)) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[(((s3->accel.cy * s3->width) + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } + } + + if (s3->accel.b2e8_pix && s3_cpu_src(s3)) { + if (s3->accel.temp_cnt > 0) { + s3->accel.temp_cnt--; + mix_dat <<= 1; + mix_dat |= 1; + } + } else { + mix_dat <<= 1; + mix_dat |= 1; + } + + cpu_dat >>= 16; + + if (!s3->accel.sy) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) + s3->accel.color_16bit_check = 0; + else + s3->accel.color_16bit_check = 1; + } + break; + } + + if (s3->accel.cmd & 0x40) { + if (s3->accel.cmd & 0x80) + s3->accel.cy += 3; + else + s3->accel.cy -= 3; + + if (s3->accel.err_term >= s3->accel.maj_axis_pcnt) { + s3->accel.err_term += s3->accel.destx_distp; + if (s3->accel.cmd & 0x20) + s3->accel.cx += 3; + else + s3->accel.cx -= 3; + } else + s3->accel.err_term += s3->accel.desty_axstp; + } else { + if (s3->accel.cmd & 0x20) + s3->accel.cx += 3; + else + s3->accel.cx -= 3; + + if (s3->accel.err_term >= s3->accel.maj_axis_pcnt) { + s3->accel.err_term += s3->accel.destx_distp; + if (s3->accel.cmd & 0x80) + s3->accel.cy += 3; + else + s3->accel.cy -= 3; + } else + s3->accel.err_term += s3->accel.desty_axstp; + } + + s3->accel.sy--; + s3->accel.cx &= 0xfff; + s3->accel.cy &= 0xfff; + } + s3->accel.cur_x = (s3->accel.cx / 3) & 0xfff; + s3->accel.cur_y = (s3->accel.cy / 3) & 0xfff; + break; + } while (count-- && (s3->accel.sy >= 0)) { if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { mix_dat >>= 16; @@ -8754,11 +8929,20 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.cx *= 3; + s3->accel.cy *= 3; + } else if ((s3->bpp == 0) && (svga->bpp == 24)) + s3_log("24bpp 80x rectfill: BKGDCOLOR=%04x, FRGDCOLOR=%04x.\n", bkgd_color, frgd_color); + s3->accel.dest = dstbase + s3->accel.cy * s3->width; if ((s3->bpp == 0) && s3->color_16bit) { + if (!rd_mask && (clip_r == 0x7ff)) + rd_mask = 0xff; + s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00) && rd_mask; - s3_log("CMD2: RDMASK16CHECK=%d, rdmask=%04x.\n", s3->accel.rd_mask_16bit_check, rd_mask); + s3_log("CMD2: %04X: RDMASK16CHECK=%d, rdmask=%04x, clip_r=%04x.\n", s3->accel.cmd, s3->accel.rd_mask_16bit_check, rd_mask, clip_r); if (s3->accel.rd_mask_16bit_check) { if (s3->accel.cmd == 0x41b3) { if (frgd_mix == 0) { @@ -8822,19 +9006,21 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Pattern on pixtrans (911/924)*/ count = s3->accel.maj_axis_pcnt + 1; s3->accel.temp_cnt = 16; - if (s3->accel.rd_mask_16bit_check) { - if (s3->accel.minus) { - wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); - frgd_color = (s3->accel.frgd_color_actual[1] << 8); - bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); - } else { - wrt_mask = s3->accel.wrt_mask_actual[0]; - frgd_color = s3->accel.frgd_color_actual[0]; - bkgd_color = s3->accel.bkgd_color_actual[0]; - } - rd_mask &= 0x00ff; - } else if (!s3->accel.rd_mask_16bit_check && (s3->accel.cur_x & 0x400)) - break; + if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->accel.rd_mask_16bit_check) { + if (s3->accel.minus) { + wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); + frgd_color = (s3->accel.frgd_color_actual[1] << 8); + bkgd_color = (s3->accel.bkgd_color_actual[1] << 8); + } else { + wrt_mask = s3->accel.wrt_mask_actual[0]; + frgd_color = s3->accel.frgd_color_actual[0]; + bkgd_color = s3->accel.bkgd_color_actual[0]; + } + rd_mask &= 0x00ff; + } else if (!s3->accel.rd_mask_16bit_check && (s3->accel.cur_x & 0x400)) + break; + } } else { if ((s3->bpp == 0) && s3->color_16bit) { if (s3->accel.cmd == 0x41b3) { @@ -8884,7 +9070,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3_log("FIXME: S3 911/924 15/16bpp documentation needed.\n"); } else { if (!cpu_input && (s3->accel.cur_x & 0x400)) { - s3_log("No Input.\n"); + s3_log("No Input on %04x.\n", s3->accel.cmd); break; } else if (cpu_input && (s3->accel.cmd == 0x53b3) && (s3->accel.cur_x & 0x400)) break; @@ -8896,6 +9082,123 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3_log("CMDFULL=%04x, FRGDSEL=%x, BKGDSEL=%x, FRGDMIX=%02x, BKGDMIX=%02x, MASKCHECK=%x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, DX=%d, DY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, OVERFLOW=%d, pitch=%d.\n", s3->accel.cmd, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.bkgd_mix & 0x0f, s3->accel.rd_mask_16bit_check, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, (s3->accel.destx_overflow & 0xc00) == 0xc00, s3->width); + if ((s3->bpp == 2) || (svga->bpp == 24)) { + int multiplier = 1; + if (s3->bpp == 2) { + multiplier = 3; + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if ((rd_mask == 0x0000ffff) || (rd_mask == 0x000000ff)) + rd_mask = 0xffffffff; + } + + while (count-- && (s3->accel.sy >= 0)) { + if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { + mix_dat >>= 16; + s3->accel.temp_cnt = 16; + } + + if ((((s3->accel.cx >= (clip_l * multiplier)) && (s3->accel.cx <= (clip_r * multiplier)) && (s3->accel.cy >= (clip_t * multiplier)) && (s3->accel.cy <= (clip_b * multiplier))) && !(s3->accel.multifunc[0xe] & 0x20)) || + (((s3->accel.cx < (clip_l * multiplier)) && (s3->accel.cx > (clip_r * multiplier)) && (s3->accel.cy < (clip_t * multiplier)) && (s3->accel.cy > (clip_b * multiplier))) && (s3->accel.multifunc[0xe] & 0x20)) ) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = 0; + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + if (s3->bpp == 2) + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask]) & 0xffffff; + else { + READ(s3->accel.dest + s3->accel.cx, dest_dat); + } + + old_dest_dat = dest_dat; + MIX + + if (s3->accel.cmd & 0x10) { + if (s3->bpp == 2) { + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.cx) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.cx + 1) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.cx + 2) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.cx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } else { + WRITE(s3->accel.dest + s3->accel.cx, dest_dat); + } + } + } + } + + mix_dat <<= 1; + mix_dat |= 1; + + cpu_dat >>= 16; + + if (s3->accel.cmd & 0x20) + s3->accel.cx += multiplier; + else + s3->accel.cx -= multiplier; + + s3->accel.cx &= 0xfff; + s3->accel.sx--; + if (s3->accel.sx < 0) { + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.cx *= multiplier; + + if (s3->accel.cmd & 0x80) + s3->accel.cy += multiplier; + else + s3->accel.cy -= multiplier; + + s3->accel.cy &= 0xfff; + s3->accel.dest = dstbase + s3->accel.cy * s3->width; + + s3->accel.sy--; + + if (cpu_input) + return; + + if (s3->accel.sy < 0) { + s3->accel.cur_x = s3->accel.cx / multiplier; + s3->accel.cur_y = s3->accel.cy / multiplier; + return; + } + } + } + break; + } + while (count-- && (s3->accel.sy >= 0)) { if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { mix_dat >>= 16; @@ -9151,7 +9454,6 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi case 6: /*BitBlt*/ if (!cpu_input) { /*!cpu_input is trigger to start operation*/ s3->accel.minus = 0; - s3->accel.minus_src_24bpp = 0; s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; s3->accel.sy = s3->accel.multifunc[0] & 0xfff; @@ -9161,6 +9463,18 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.dx *= 3; + s3->accel.dy *= 3; + s3->accel.cx *= 3; + s3->accel.cy *= 3; + s3->accel.blit_24bpp = 0; + } else if ((s3->bpp == 0) && (svga->bpp == 24)) { + s3_log("BitBLT bpp%d: 24bpp params=%04x, dwidth=%d, dheight=%d, swidth=%d, sheight=%d, lwidth=%d, lheight=%d, srcbase=%08x, dstbase=%08x, blit24 times=%d, moddx=%d, modcx=%d.\n", s3->bpp, s3->accel.cmd, s3->accel.dx / 3, s3->accel.dy, s3->accel.cx / 3, s3->accel.cy, s3->accel.sx / 3, s3->accel.sy, srcbase, dstbase, s3->accel.blit_24bpp, s3->accel.dx % 3, s3->accel.cx % 3); + s3->accel.blit_24bpp = (s3->accel.blit_24bpp + 1) & 3; + } else + s3->accel.blit_24bpp = 0; + if ((s3->bpp == 0) && s3->color_16bit) { s3->accel.rd_mask_16bit_check = ((rd_mask & 0xff00) != 0xff00) && rd_mask; s3_log("CMD6: RDMASK16CHECK=%d.\n", s3->accel.rd_mask_16bit_check); @@ -9193,7 +9507,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/ - if ((s3->bpp == 0) && s3->color_16bit) { + if ((s3->bpp == 0) && (s3->color_16bit)) { if (s3->accel.rd_mask_16bit_check) { if (s3->accel.minus) { wrt_mask = (s3->accel.wrt_mask_actual[1] << 8); @@ -9211,6 +9525,203 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3_log("CMDFULL=%04x, FRGDSEL=%x, BKGDSEL=%x, FRGDMIX=%02x, BKGDMIX=%02x, MASKCHECK=%x, RDMASK=%04x, MINUS=%d, WRTMASK=%04X, MIX=%04x, CX=%d, CY=%d, DX=%d, DY=%d, SX=%d, SY=%d, PIXCNTL=%02x, 16BITCOLOR=%x, RDCHECK=%x, CLIPL=%d, CLIPR=%d, OVERFLOW=%d, pitch=%d.\n", s3->accel.cmd, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, s3->accel.bkgd_mix & 0x0f, s3->accel.rd_mask_16bit_check, rd_mask, s3->accel.minus, wrt_mask, mix_dat & 0xffff, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->accel.sx, s3->accel.sy, s3->accel.multifunc[0x0a] & 0xc4, s3->accel.color_16bit_check, s3->accel.rd_mask_16bit_check, clip_l, clip_r, (s3->accel.destx_overflow & 0xc00) == 0xc00, s3->width); + if ((s3->bpp == 2) || (svga->bpp == 24)) { + int multiplier = 1; + if (s3->bpp == 2) { + multiplier = 3; + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if (rd_mask == 0x0000ffff) + rd_mask = 0xffffffff; + } + + if (!cpu_input && (frgd_mix == 3) && !vram_mask && !(s3->accel.multifunc[0xe] & 0x100) && ((s3->accel.cmd & 0xa0) == 0xa0) && ((s3->accel.frgd_mix & 0xf) == 7) && ((s3->accel.bkgd_mix & 0xf) == 7)) { + s3_log("Special BitBLT24, wrtmask=%04x.\n", wrt_mask); + while (1) { + if ((s3->accel.dx >= (clip_l * multiplier)) && (s3->accel.dx <= (clip_r * multiplier)) && (s3->accel.dy >= (clip_t * multiplier)) && (s3->accel.dy <= (clip_b * multiplier))) { + if (s3->bpp == 2) { + src_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask]) & 0xffffff; + } else { + READ(s3->accel.src + s3->accel.cx, src_dat); + READ(s3->accel.dest + s3->accel.dx, dest_dat); + } + dest_dat = (src_dat & wrt_mask) | (dest_dat & ~wrt_mask); + + if (s3->accel.cmd & 0x10) { + s3_log("CMD6 special bitblt24 bpp%d: dest=%02x, src=%06x, dx=%d, dy=%d, cx=%d, cy=%d, sx=%d, sy=%d.\n", s3->bpp, dest_dat, src_dat, s3->accel.dx, s3->accel.dy, s3->accel.cx, s3->accel.cy, s3->accel.sx, s3->accel.sy); + if (s3->bpp == 2) { + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 1) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 2) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.dx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } else { + WRITE(s3->accel.dest + s3->accel.dx, dest_dat); + } + } + } + + s3->accel.cx += multiplier; + s3->accel.dx += multiplier; + s3->accel.sx--; + + s3->accel.dx &= 0xfff; + + if (s3->accel.sx < 0) { + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.dx = s3->accel.destx_distp & 0xfff; + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + + s3->accel.cx *= multiplier; + s3->accel.dx *= multiplier; + + s3->accel.cy += multiplier; + s3->accel.dy += multiplier; + + s3->accel.src = srcbase + (s3->accel.cy * s3->width); + s3->accel.dest = dstbase + (s3->accel.dy * s3->width); + + s3->accel.sy--; + + if (s3->accel.sy < 0) { + s3->accel.destx_distp = s3->accel.dx / multiplier; + s3->accel.desty_axstp = s3->accel.dy / multiplier; + return; + } + } + } + } else { + s3_log("Normal24 blit, srcbase=%08x, dstbase=%08x, full=%04x, wrt_mask=%08x, extmultifunc0e=%03x, frgdmixval=%02x.\n", srcbase, dstbase, s3->accel.cmd, wrt_mask, s3->accel.multifunc[0x0e] & 0x180, s3->accel.frgd_mix); + while (count-- && (s3->accel.sy >= 0)) { + if ((s3->accel.dx >= (clip_l * multiplier)) && (s3->accel.dx <= (clip_r * multiplier)) && ((s3->accel.dy >= clip_t * multiplier)) && (s3->accel.dy <= (clip_b * multiplier))) { + if (vram_mask && (s3->accel.cmd & 0x10)) { + if (s3->bpp == 2) + mix_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + else { + READ(s3->accel.src + s3->accel.cx, mix_dat); + } + mix_dat = ((mix_dat & rd_mask) == rd_mask); + mix_dat = mix_dat ? mix_mask : 0; + } + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + if (s3->bpp == 2) + src_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + else { + READ(s3->accel.src + s3->accel.cx, src_dat); + } + if (vram_mask && (s3->accel.cmd & 0x10)) + src_dat = ((src_dat & rd_mask) == rd_mask); + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + if (s3->bpp == 2) + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask]) & 0xffffff; + else { + READ(s3->accel.dest + s3->accel.dx, dest_dat); + } + + old_dest_dat = dest_dat; + MIX + + if ((!(s3->accel.cmd & 0x10) && vram_mask) || (s3->accel.cmd & 0x10)) { + s3_log("CMD6 %04x: normal bitblt24 bpp%d: dest=%02x, src=%02x, old=%02x, dx=%d, dy=%d, cx=%d, cy=%d, sx=%d, sy=%d, moddx=%d, modcx=%d, frgdmix=%02x, bkgdmix=%02x.\n", s3->accel.cmd, s3->bpp, dest_dat, src_dat, old_dest_dat, s3->accel.dx / 3, s3->accel.dy, s3->accel.cx / 3, s3->accel.cy, s3->accel.sx / 3, s3->accel.sy, s3->accel.dx % 3, s3->accel.cx % 3, s3->accel.frgd_mix, s3->accel.bkgd_mix); + if (s3->bpp == 2) { + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 1) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 2) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.dx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } else { + if (s3->accel.blit_24bpp == 5) { + WRITE(s3->accel.dest + s3->accel.dx, dest_dat); + } + } + } + } + } + + mix_dat <<= 1; + mix_dat |= 1; + + cpu_dat >>= 16; + + if (s3->accel.cmd & 0x20) { + s3->accel.cx += multiplier; + s3->accel.dx += multiplier; + } else { + s3->accel.cx -= multiplier; + s3->accel.dx -= multiplier; + } + + s3->accel.dx &= 0xfff; + + s3->accel.sx--; + if (s3->accel.sx < 0) { + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.dx = s3->accel.destx_distp & 0xfff; + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + + s3->accel.cx *= multiplier; + s3->accel.dx *= multiplier; + + if (s3->accel.cmd & 0x80) { + s3->accel.cy += multiplier; + s3->accel.dy += multiplier; + } else { + s3->accel.cy -= multiplier; + s3->accel.dy -= multiplier; + } + + s3->accel.src = srcbase + s3->accel.cy * s3->width; + s3->accel.dest = dstbase + s3->accel.dy * s3->width; + + s3->accel.sy--; + + if (cpu_input) + return; + + if (s3->accel.sy < 0) { + s3->accel.destx_distp = s3->accel.dx / multiplier; + s3->accel.desty_axstp = s3->accel.dy / multiplier; + return; + } + } + } + } + break; + } + if (!cpu_input && (frgd_mix == 3) && !vram_mask && !(s3->accel.multifunc[0xe] & 0x100) && ((s3->accel.cmd & 0xa0) == 0xa0) && ((s3->accel.frgd_mix & 0xf) == 7) && ((s3->accel.bkgd_mix & 0xf) == 7)) { s3_log("Special BitBLT.\n"); while (1) { @@ -9398,6 +9909,13 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.dx *= 3; + s3->accel.dy *= 3; + s3->accel.cx *= 3; + s3->accel.cy *= 3; + } + /*Align source with destination*/ s3->accel.pattern = (s3->accel.cy * s3->width) + s3->accel.cx; s3->accel.dest = dstbase + s3->accel.dy * s3->width; @@ -9411,6 +9929,119 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/ + if (s3->bpp == 2) { + wrt_mask = s3->accel.wrt_mask; + rd_mask = s3->accel.rd_mask; + + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + if (rd_mask == 0x0000ffff) + rd_mask = 0xffffffff; + + while (count-- && (s3->accel.sy >= 0)) { + if ((s3->accel.dx >= (clip_l * 3)) && (s3->accel.dx <= (clip_r * 3)) && (s3->accel.dy >= (clip_t * 3)) && (s3->accel.dy <= (clip_b * 3))) { + if (vram_mask) { + mix_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + mix_dat = ((mix_dat & rd_mask) == rd_mask); + mix_dat = mix_dat ? mix_mask : 0; + } + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + if (vram_mask) + src_dat = ((src_dat & rd_mask) == rd_mask); + break; + + default: + break; + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask]) & 0xffffff; + + old_dest_dat = dest_dat; + MIX + + if (s3->accel.cmd & 0x10) { + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask] = dest_dat & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 1) & s3->vram_mask] = (dest_dat >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 2) & s3->vram_mask] = (dest_dat >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.dx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } + } + } + + mix_dat <<= 1; + mix_dat |= 1; + cpu_dat >>= 16; + + if (s3->accel.cmd & 0x20) { + s3->accel.cx = ((s3->accel.cx + 3) & 7) | (s3->accel.cx & ~7); + s3->accel.dx += 3; + } else { + s3->accel.cx = ((s3->accel.cx - 3) & 7) | (s3->accel.cx & ~7); + s3->accel.dx -= 3; + } + s3->accel.dx &= 0xfff; + s3->accel.sx--; + if (s3->accel.sx < 0) { + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.dx = s3->accel.destx_distp & 0xfff; + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + + s3->accel.cx *= 3; + s3->accel.dx *= 3; + + if (s3->accel.cmd & 0x80) { + s3->accel.cy = ((s3->accel.cy + 3) & 7) | (s3->accel.cy & ~7); + s3->accel.dy += 3; + } else { + s3->accel.cy = ((s3->accel.cy - 3) & 7) | (s3->accel.cy & ~7); + s3->accel.dy -= 3; + } + + s3->accel.src = srcbase + s3->accel.pattern + (s3->accel.cy * s3->width); + s3->accel.dest = dstbase + s3->accel.dy * s3->width; + + s3->accel.sy--; + + if (cpu_input) + return; + + if (s3->accel.sy < 0) { + s3->accel.destx_distp = s3->accel.dx / 3; + s3->accel.desty_axstp = s3->accel.dy / 3; + return; + } + } + } + break; + } + while (count-- && (s3->accel.sy >= 0)) { if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { if (vram_mask) { @@ -9756,8 +10387,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi case 14: /*ROPBlt (Vision868/968 only)*/ ; - uint32_t mono_pattern[64] = { 0 }; - if (s3->chip != S3_VISION968 && s3->chip != S3_VISION868) + uint32_t mono_pattern[8][8] = { 0 }; + int use_rop_mix = 0; + uint32_t vram_dat = 0; + + if ((s3->chip != S3_VISION968) && (s3->chip != S3_VISION868)) break; if (!cpu_input) /*!cpu_input is trigger to start operation*/ @@ -9774,18 +10408,26 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.px = s3->accel.pat_x & 0xfff; s3->accel.py = s3->accel.pat_y & 0xfff; + if (s3->bpp == 2) { + s3->accel.dx *= 3; + s3->accel.dy *= 3; + s3->accel.cx *= 3; + s3->accel.cy *= 3; + s3->accel.px *= 3; + s3->accel.py *= 3; + } + s3->accel.dest = dstbase + (s3->accel.dy * s3->width); s3->accel.src = srcbase + (s3->accel.cy * s3->width); s3->accel.pattern = (s3->accel.py * s3->width); - s3_log("ROPBLT=%04x, PIXCntl=%04x, Misc1=%04x, PATBKGDCOL=%08x, PATFRGDCOL=%08x, COLBKGDCOL=%08x, COLFRGDCOL=%08x, PX=%d, PY=%d, DX=%d, DY=%d, CX=%d, CY=%d, FRGDSEL=%x, BKGDSEL=%x, RDMASK=%08x, WRTMASK=%08x, ROPMIX=%03x, pitch=%d.\n", s3->accel.cmd, s3->accel.multifunc[0xa], s3->accel.multifunc[0xe], s3->accel.pat_bg_color, s3->accel.pat_fg_color, s3->accel.bkgd_color, s3->accel.frgd_color, s3->accel.px, s3->accel.py, s3->accel.dx, s3->accel.dy, s3->accel.cx, s3->accel.cy, frgd_mix, bkgd_mix, s3->accel.rd_mask, s3->accel.wrt_mask, s3->accel.ropmix, s3->width); + + s3_log("ROPBLT=%04x, BPP=%d, PIXCntl=%04x, Misc1=%04x, PATBKGDCOL=%08x, PATFRGDCOL=%08x, COLBKGDCOL=%08x, COLFRGDCOL=%08x, SX=%d, SY=%d, PX=%d, PY=%d, DX=%d, DY=%d, CX=%d, CY=%d, FRGDSEL=%02x, BKGDSEL=%02x, RDMASK=%08x, WRTMASK=%08x, ROPMIX=%03x, pitch=%d.\n", s3->accel.cmd, s3->bpp, s3->accel.multifunc[0xa], s3->accel.multifunc[0xe], s3->accel.pat_bg_color, s3->accel.pat_fg_color, s3->accel.bkgd_color, s3->accel.frgd_color, s3->accel.sx, s3->accel.sy, s3->accel.pat_x, s3->accel.pat_y, s3->accel.dx, s3->accel.dy, s3->accel.cx, s3->accel.cy, s3->accel.frgd_mix, s3->accel.bkgd_mix, s3->accel.rd_mask, s3->accel.wrt_mask, s3->accel.ropmix, s3->width); } if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/ if (s3->accel.ropmix & 0x100) { - int x; - int y; switch (s3->accel.cmd & 0x600) { case 0x000: case 0x600: @@ -9798,13 +10440,246 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } - for (y = 0; y < 8; y++) { - for (x = 0; x < 8; x++) { - mono_pattern[y * 8 + (7 - x)] = (mix_dat & (1 << (x + y * 8))) & 0x80000000; + if (cpu_input) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { + if ((frgd_mix < 2) || (bkgd_mix < 2)) + use_rop_mix = 3; + } else { + if ((frgd_mix == 2) || (bkgd_mix == 2)) + use_rop_mix = 2; + } + } else { + if ((s3->accel.multifunc[0xa] & 0xc0) != 0x80) { + if ((frgd_mix == 3) || (bkgd_mix == 3)) + use_rop_mix = 1; + } + } + + if (use_rop_mix == 3) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + mono_pattern[y][7 - x] = (mix_dat & (1 << (x + y * 8))) & 0x80000000; + } + } + } else if (use_rop_mix == 2) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + mono_pattern[y][7 - x] = (cpu_dat & (1 << (x + y * 8))) & 0x80000000; + } + } + } else if (use_rop_mix <= 1) { + if (use_rop_mix == 0) + frgd_mix = 3; + + if (s3->bpp == 2) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + vram_dat = (*(uint32_t *) &vram_b[(((s3->accel.py + (y * 3)) * s3->width) + s3->accel.px + (x * 3)) & s3->vram_mask]) & 0xffffff; + if ((s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x800000; + else if (!(s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x800000); + else if ((s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x800000); + else if (!(s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x800000; + + if (s3->accel.pat_bg_color != s3->accel.pat_fg_color) + s3_log("MonoPattern Screen=%08x, y=%d, x=%d, sel=%08x, vram=%08x.\n", mono_pattern[y][7 - x], y, 7 - x, vram_dat & 0x800000, vram_dat); + } + } + } else if (s3->bpp == 1) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + vram_dat = vram_w[(((s3->accel.py + y) * s3->width) + s3->accel.px + x) & (s3->vram_mask >> 1)]; + if ((s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x8000; + else if (!(s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x8000); + else if ((s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x8000); + else if (!(s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x80000; + } + } + } else if (s3->bpp == 3) { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + vram_dat = vram_l[(((s3->accel.py + y) * s3->width) + s3->accel.px + x) & (s3->vram_mask >> 2)]; + if ((s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x80000000; + else if (!(s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x80000000); + else if ((s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x80000000); + else if (!(s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x80000000; + } + } + } else { + for (uint8_t y = 0; y < 8; y++) { + for (uint8_t x = 0; x < 8; x++) { + vram_dat = svga->vram[(((s3->accel.py + y) * s3->width) + s3->accel.px + x) & s3->vram_mask]; + if ((s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x800; + else if (!(s3->accel.dx & 1) && (s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x80); + else if ((s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = !(vram_dat & 0x80); + else if (!(s3->accel.dx & 1) && !(s3->accel.dy & 1)) + mono_pattern[y][7 - x] = vram_dat & 0x80; + } + } } } } - while (count-- && s3->accel.sy >= 0) { + + if (s3->bpp == 2) { + wrt_mask = s3->accel.wrt_mask; + if (wrt_mask == 0x0000ffff) + wrt_mask = 0xffffffff; + + while (count-- && (s3->accel.sy >= 0)) { + if ((s3->accel.dx >= (clip_l * 3)) && (s3->accel.dx <= (clip_r * 3)) && (s3->accel.dy >= (clip_t * 3)) && (s3->accel.dy <= (clip_b * 3))) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = s3->accel.bkgd_color; + break; + case 1: + src_dat = s3->accel.frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = (*(uint32_t *) &vram_b[(s3->accel.src + s3->accel.cx) & s3->vram_mask]) & 0xffffff; + break; + + default: + break; + } + + if (s3->accel.ropmix & 0x100) { /*Mono pattern used*/ + if (use_rop_mix <= 1) { + pat_dat = mono_pattern[(s3->accel.py / 3) & 7][(s3->accel.px / 3) & 7] ? s3->accel.pat_fg_color : s3->accel.pat_bg_color; + if (s3->accel.pat_bg_color != s3->accel.pat_fg_color) + s3_log("PatternData=%06x, PX=%d, PY=%d, MonoSel=%06x.\n", pat_dat, (s3->accel.px / 3) & 7, (s3->accel.py / 3) & 7, vram_dat); + } else { + switch (mono_pattern[(s3->accel.py / 3) & 7][(s3->accel.px / 3) & 7] ? (frgd_mix & 1) : (bkgd_mix & 1)) { + case 0: + pat_dat = s3->accel.pat_bg_color; + break; + case 1: + pat_dat = s3->accel.pat_fg_color; + break; + default: + break; + } + } + } else { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + pat_dat = s3->accel.bkgd_color; + break; + case 1: + pat_dat = s3->accel.frgd_color; + break; + case 2: + pat_dat = cpu_dat; + break; + case 3: + pat_dat = (*(uint32_t *) &vram_b[(s3->accel.pattern + s3->accel.px) & s3->vram_mask]) & 0xffffff; + break; + + default: + break; + } + } + + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask]) & 0xffffff; + + ROPMIX + out = (out & wrt_mask) | (old_dest_dat & ~wrt_mask); + + if (s3->accel.cmd & 0x10) { + s3_log("ROPBLT24 ROPSET=%03x, DX=%d, DY=%d, OUT=%02x, SRCC=%08x, DSTC=%08x.\n", s3->accel.ropmix, s3->accel.dx, s3->accel.dy, out, (s3->accel.src + s3->accel.cx) & (s3->vram_mask >> 2), (s3->accel.dest + s3->accel.dx) & (s3->vram_mask >> 2)); + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx) & s3->vram_mask] = out & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 1) & s3->vram_mask] = (out >> 8) & 0xff; + *(uint8_t *) &vram_b[(s3->accel.dest + s3->accel.dx + 2) & s3->vram_mask] = (out >> 16) & 0xff; + svga->changedvram[((s3->accel.dest + s3->accel.dx) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + } + } + } + + mix_dat <<= 1; + mix_dat |= 1; + + cpu_dat >>= 16; + + if (s3->accel.cmd & 0x20) { + s3->accel.cx += 3; + s3->accel.dx += 3; + s3->accel.px += 3; + } else { + s3->accel.cx -= 3; + s3->accel.dx -= 3; + s3->accel.px -= 3; + } + s3->accel.sx--; + if (s3->accel.sx < 0) { + s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + s3->accel.dx = s3->accel.destx_distp & 0xfff; + s3->accel.cx = s3->accel.cur_x & 0xfff; + s3->accel.px = s3->accel.pat_x & 0xfff; + + s3->accel.dx *= 3; + s3->accel.cx *= 3; + s3->accel.px *= 3; + + if (s3->accel.cmd & 0x80) { + s3->accel.cy += 3; + s3->accel.dy += 3; + s3->accel.py += 3; + } else { + s3->accel.cy -= 3; + s3->accel.dy -= 3; + s3->accel.py -= 3; + } + s3->accel.dest = dstbase + (s3->accel.dy * s3->width); + s3->accel.src = srcbase + (s3->accel.cy * s3->width); + s3->accel.pattern = (s3->accel.py * s3->width); + + s3->accel.sy--; + + if (cpu_input) + return; + + if (s3->accel.sy < 0) { + s3->accel.destx_distp = s3->accel.dx / 3; + s3->accel.desty_axstp = s3->accel.dy / 3; + return; + } + } + } + break; + } + while (count-- && (s3->accel.sy >= 0)) { if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: @@ -9825,17 +10700,20 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } if (s3->accel.ropmix & 0x100) { /*Mono pattern used*/ - switch (mono_pattern[(s3->accel.py & 7) * 8 + (s3->accel.px & 7)] ? (frgd_mix & 1) : (bkgd_mix & 1)) { - case 0: - pat_dat = s3->accel.pat_bg_color; - break; - case 1: - pat_dat = s3->accel.pat_fg_color; - break; - default: - break; + if (use_rop_mix <= 1) + pat_dat = mono_pattern[s3->accel.py & 7][s3->accel.px & 7] ? s3->accel.pat_fg_color : s3->accel.pat_bg_color; + else { + switch (mono_pattern[s3->accel.py & 7][s3->accel.px & 7] ? (frgd_mix & 1) : (bkgd_mix & 1)) { + case 0: + pat_dat = s3->accel.pat_bg_color; + break; + case 1: + pat_dat = s3->accel.pat_fg_color; + break; + default: + break; + } } - s3_log("MonoMIX=%08x, PX=%d, PY=%d.\n", mix_dat, s3->accel.px & 7, s3->accel.py & 7); } else { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: @@ -9875,8 +10753,8 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi READ(s3->accel.dest + s3->accel.dx, dest_dat); ROPMIX + out = (out & s3->accel.wrt_mask) | (old_dest_dat & ~s3->accel.wrt_mask); - s3_log("Destination=%08x, Source=%08x, Pattern=%08x, OUT=%08x, mix=%08x, count=%d.\n", dest_dat, src_dat, pat_dat, out, mix_dat, count); if (s3->accel.cmd & 0x10) { WRITE(s3->accel.dest + s3->accel.dx, out); } @@ -9928,8 +10806,9 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.sy--; - if (cpu_input /* && (s3->accel.multifunc[0xa] & 0xc0) == 0x80*/) + if (cpu_input) return; + if (s3->accel.sy < 0) { s3->accel.destx_distp = s3->accel.dx; s3->accel.desty_axstp = s3->accel.dy; @@ -10293,7 +11172,7 @@ s3_init(const device_t *info) break; case S3_WINNER1000_805: bios_fn = ROM_WINNER1000_805; - chip = S3_86C801; + chip = S3_86C805I; video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_s3_86c801); break; case S3_86C805_ONBOARD: @@ -10731,7 +11610,6 @@ s3_init(const device_t *info) s3->id_ext = stepping; s3->id_ext_pci = 0; s3->packed_mmio = 0; - s3->accel.rd_mask = 0xff; svga->ramdac = device_add(&sc11483_ramdac_device); s3->ramdac_type = SC1148X; @@ -10754,7 +11632,6 @@ s3_init(const device_t *info) s3->id_ext = stepping; s3->id_ext_pci = 0; s3->packed_mmio = 0; - s3->accel.rd_mask = 0xff; svga->ramdac = device_add(&sc11483_ramdac_device); s3->ramdac_type = SC1148X; @@ -10776,11 +11653,12 @@ s3_init(const device_t *info) s3->ramdac_type = S3_SDAC; svga->clock_gen = svga->ramdac; svga->getclock = sdac_getclock; + sdac_set_ref_clock(svga->ramdac, 14318184.0f); + svga_recalctimings(svga); break; case S3_SPEA_MIRAGE_86C801: case S3_SPEA_MIRAGE_86C805: - case S3_WINNER1000_805: svga->decode_mask = (2 << 20) - 1; stepping = 0xa2; /*86C801/86C805*/ s3->id = stepping; @@ -10793,8 +11671,24 @@ s3_init(const device_t *info) s3->ramdac_type = ATT49X; svga->clock_gen = device_add(&av9194_device); svga->getclock = av9194_getclock; - if (info->local == S3_WINNER1000_805) - s3->elsa_eeprom = 1; + break; + + case S3_WINNER1000_805: + svga->decode_mask = (2 << 20) - 1; + stepping = 0xa8; /*86C801I/86C805I*/ + s3->id = stepping; + s3->id_ext = stepping; + s3->id_ext_pci = 0; + s3->packed_mmio = 0; + svga->crtc[0x5a] = 0x0a; + + svga->ramdac = device_add(&sdac_ramdac_device); + s3->ramdac_type = S3_SDAC; + svga->clock_gen = svga->ramdac; + svga->getclock = sdac_getclock; + s3->elsa_eeprom = 1; + sdac_set_ref_clock(svga->ramdac, 14318184.0f); + svga_recalctimings(svga); break; case S3_86C805_ONBOARD: @@ -10924,6 +11818,8 @@ s3_init(const device_t *info) s3->ramdac_type = S3_SDAC; svga->clock_gen = svga->ramdac; svga->getclock = sdac_getclock; + sdac_set_ref_clock(svga->ramdac, 14318184.0f); + svga_recalctimings(svga); break; case S3_DIAMOND_STEALTH64_964: @@ -11031,13 +11927,14 @@ s3_init(const device_t *info) svga->clock_gen = device_add(&icd2061_device); svga->getclock = icd2061_getclock; icd2061_set_ref_clock(svga->ramdac, 14318184.0f); - svga_recalctimings(svga); } else { svga->ramdac = device_add(&sdac_ramdac_device); s3->ramdac_type = S3_SDAC; svga->clock_gen = svga->ramdac; svga->getclock = sdac_getclock; + sdac_set_ref_clock(svga->ramdac, 14318184.0f); } + svga_recalctimings(svga); break; case S3_PHOENIX_TRIO32: diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index daf59aea6..dcf380ff8 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -1063,32 +1063,49 @@ s3_virge_updatemapping(virge_t *virge) return; } - switch (svga->gdcreg[6] & 0xc) { /*Banked framebuffer*/ - case 0x0: /*128k at A0000*/ - mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000); - svga->banked_mask = 0xffff; - break; - case 0x4: /*64k at A0000*/ - mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); - svga->banked_mask = 0xffff; - if (xga_active && (svga->xga != NULL)) { - xga->on = 0; - mem_mapping_set_handler(&svga->mapping, svga->read, svga->readw, svga->readl, svga->write, svga->writew, svga->writel); - } - break; - case 0x8: /*32k at B0000*/ - mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000); - svga->banked_mask = 0x7fff; - break; - case 0xC: /*32k at B8000*/ - mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000); - svga->banked_mask = 0x7fff; - break; - } + /*Banked framebuffer*/ + if (svga->crtc[0x31] & 0x08) /*Enhanced mode mappings*/ + { + /* Enhanced mode forces 64kb at 0xa0000*/ + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); + svga->banked_mask = 0xffff; + if (xga_active && (svga->xga != NULL)) { + xga->on = 0; + mem_mapping_set_handler(&svga->mapping, svga->read, svga->readw, svga->readl, svga->write, svga->writew, svga->writel); + } + } else + switch (svga->gdcreg[6] & 0xc) { /*VGA mapping*/ + case 0x0: /*128k at A0000*/ + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000); + svga->banked_mask = 0xffff; + break; + case 0x4: /*64k at A0000*/ + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); + svga->banked_mask = 0xffff; + if (xga_active && (svga->xga != NULL)) { + xga->on = 0; + mem_mapping_set_handler(&svga->mapping, svga->read, svga->readw, svga->readl, svga->write, svga->writew, svga->writel); + } + break; + case 0x8: /*32k at B0000*/ + mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000); + svga->banked_mask = 0x7fff; + break; + case 0xC: /*32k at B8000*/ + mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000); + svga->banked_mask = 0x7fff; + break; + + default: + break; + } virge->linear_base = (svga->crtc[0x5a] << 16) | (svga->crtc[0x59] << 24); if ((svga->crtc[0x58] & 0x10) || (virge->advfunc_cntl & 0x10)) { /*Linear framebuffer*/ + /*Linear framebuffer*/ + mem_mapping_disable(&svga->mapping); + switch (svga->crtc[0x58] & 7) { case 0: /*64k*/ virge->linear_size = 0x10000; @@ -1110,11 +1127,19 @@ s3_virge_updatemapping(virge_t *virge) break; } virge->linear_base &= ~(virge->linear_size - 1); - if (virge->linear_base == 0xa0000) { - mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); + //pclog("CR58 & 7=%x, base=%08x.\n", svga->crtc[0x58] & 7, virge->linear_base); + if ((virge->linear_base == 0xa0000) || (virge->linear_size == 0x10000)) { mem_mapping_disable(&virge->linear_mapping); - } else - mem_mapping_set_addr(&virge->linear_mapping, virge->linear_base, virge->linear_size); + if (!(svga->crtc[0x53] & 0x10)) { + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); + svga->banked_mask = 0xffff; + } + } else { + if (virge->linear_base) + mem_mapping_set_addr(&virge->linear_mapping, virge->linear_base, virge->linear_size); + else + mem_mapping_disable(&virge->linear_mapping); + } svga->fb_only = 1; } else { mem_mapping_disable(&virge->linear_mapping); @@ -1122,6 +1147,7 @@ s3_virge_updatemapping(virge_t *virge) } if ((svga->crtc[0x53] & 0x10) || (virge->advfunc_cntl & 0x20)) { /*Old MMIO*/ + mem_mapping_disable(&svga->mapping); if (svga->crtc[0x53] & 0x20) mem_mapping_set_addr(&virge->mmio_mapping, 0xb8000, 0x8000); else @@ -1129,9 +1155,12 @@ s3_virge_updatemapping(virge_t *virge) } else mem_mapping_disable(&virge->mmio_mapping); - if (svga->crtc[0x53] & 0x08) /*New MMIO*/ - mem_mapping_set_addr(&virge->new_mmio_mapping, virge->linear_base + 0x1000000, 0x10000); - else + if (svga->crtc[0x53] & 0x08) { /*New MMIO*/ + if (virge->linear_base) + mem_mapping_set_addr(&virge->new_mmio_mapping, virge->linear_base + 0x1000000, 0x10000); + else + mem_mapping_disable(&virge->new_mmio_mapping); + } else mem_mapping_disable(&virge->new_mmio_mapping); } @@ -1946,9 +1975,9 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) break; case 0x8190: virge->streams.sec_ctrl = val; - virge->streams.dda_horiz_accumulator = val & 0x7ff; - if (val & 0x800) - virge->streams.dda_horiz_accumulator |= ~0x7ff; + virge->streams.dda_horiz_accumulator = val & 0xfff; + if (val & 0x1000) + virge->streams.dda_horiz_accumulator |= ~0xfff; virge->streams.sdif = (val >> 24) & 7; break; @@ -1961,9 +1990,9 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) if (val & 0x800) virge->streams.k1_horiz_scale |= ~0x7ff; - virge->streams.k2_horiz_scale = (val >> 16) & 0x3ff; - if ((val >> 16) & 0x400) - virge->streams.k2_horiz_scale |= ~0x3ff; + virge->streams.k2_horiz_scale = (val >> 16) & 0x7ff; + if ((val >> 16) & 0x800) + virge->streams.k2_horiz_scale |= ~0x7ff; svga_recalctimings(svga); svga->fullchange = changeframecount; @@ -2019,14 +2048,14 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) virge->streams.k1_vert_scale |= ~0x7ff; break; case 0x81e4: - virge->streams.k2_vert_scale = val & 0x3ff; - if (val & 0x400) - virge->streams.k2_vert_scale |= ~0x3ff; + virge->streams.k2_vert_scale = val & 0x7ff; + if (val & 0x800) + virge->streams.k2_vert_scale |= ~0x7ff; break; case 0x81e8: - virge->streams.dda_vert_accumulator = val & 0x7ff; - if (val & 0x800) - virge->streams.dda_vert_accumulator |= ~0x7ff; + virge->streams.dda_vert_accumulator = val & 0xfff; + if (val & 0x1000) + virge->streams.dda_vert_accumulator |= ~0xfff; svga_recalctimings(svga); svga->fullchange = changeframecount; @@ -3124,7 +3153,7 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) case 0: case CMD_SET_MS: READ(src_addr, source); - if ((virge->s3d.cmd_set & CMD_SET_TP) && source == src_fg_clr) + if ((virge->s3d.cmd_set & CMD_SET_TP) && (source == src_fg_clr)) update = 0; break; case CMD_SET_IDS: @@ -3150,7 +3179,7 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) count = 0; } } - if ((virge->s3d.cmd_set & CMD_SET_TP) && source == src_fg_clr) + if ((virge->s3d.cmd_set & CMD_SET_TP) && (source == src_fg_clr)) update = 0; break; case CMD_SET_IDS | CMD_SET_MS: @@ -4829,7 +4858,7 @@ s3_virge_colorkey(virge_t* virge, uint32_t x, uint32_t y) return true; else if (!(virge->streams.chroma_ctrl & (1 << 28))) return true; - + comp_r = (virge->streams.chroma_ctrl >> 16) & 0xFF; comp_g = (virge->streams.chroma_ctrl >> 8) & 0xFF; comp_b = (virge->streams.chroma_ctrl) & 0xFF; @@ -4853,7 +4882,7 @@ s3_virge_colorkey(virge_t* virge, uint32_t x, uint32_t y) */ uint8_t index = virge->streams.chroma_ctrl & 0xFF; alpha_key = (virge->chip < S3_VIRGEGX2) ? (virge->streams.chroma_ctrl & (1 << 29)) : ((virge->streams.chroma_ctrl >> 29) & 3) == 1; - + if (alpha_key) { comp_r = comp_g = comp_b = index; comp_r_h = comp_g_h = comp_b_h = index; @@ -5188,6 +5217,7 @@ s3_virge_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) svga->crtc[0x59] = (svga->crtc[0x59] & 0x01) | (val & 0xfe); else svga->crtc[0x59] = (svga->crtc[0x59] & 0x03) | (val & 0xfc); + s3_virge_updatemapping(virge); return; diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 35f42c2ee..db8b33e18 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -134,8 +134,8 @@ video_cards[] = { { .device = &s3_phoenix_86c801_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_spea_mirage_86c801_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_winner1000_805_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32i_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32_machspeed_vga_gui_2400s_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32i_axis_microdevice_isa_device, .flags = VIDEO_FLAG_TYPE_NONE }, /* MCA */ { .device = &mach32_mca_device, .flags = VIDEO_FLAG_TYPE_8514 }, { .device = &gd5426_mca_device, .flags = VIDEO_FLAG_TYPE_NONE }, @@ -145,12 +145,13 @@ video_cards[] = { /* VLB */ { .device = &mach32_vlb_device, .flags = VIDEO_FLAG_TYPE_8514 }, { .device = &mach64gx_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32i_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32_machspeed_vga_gui_2400s_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32i_hercules_dynamite_pro_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &et4000w32p_videomagic_revb_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_revc_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_cardex_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_noncardex_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_cardex_revc_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_generic_revd_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_cardex_revd_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_diamond_revd_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &gd5424_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &gd5426_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &gd5428_vlb_device, .flags = VIDEO_FLAG_TYPE_NONE }, @@ -196,11 +197,10 @@ video_cards[] = { { .device = &gd5446_pci_device, .flags = VIDEO_FLAG_TYPE_SECONDARY }, { .device = &gd5446_stb_pci_device, .flags = VIDEO_FLAG_TYPE_SECONDARY }, { .device = &gd5480_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_videomagic_revb_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_revc_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_cardex_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_noncardex_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, - { .device = &et4000w32p_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_cardex_revc_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_generic_revd_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_cardex_revd_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, + { .device = &et4000w32p_diamond_revd_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_elsa_winner1000_86c928_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_spea_mercury_lite_86c928_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, { .device = &s3_diamond_stealth64_964_pci_device, .flags = VIDEO_FLAG_TYPE_NONE }, diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index 2fd4ba482..30f76abfa 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -692,6 +692,7 @@ tgui_recalctimings(svga_t *svga) const tgui_t *tgui = (tgui_t *) svga->priv; uint8_t ger22lower = (tgui->accel.ger22 & 0xff); uint8_t ger22upper = (tgui->accel.ger22 >> 8); + int std_vga_clock = 1; if (tgui->type >= TGUI_9440) { if ((svga->crtc[0x38] & 0x19) == 0x09) @@ -767,10 +768,11 @@ tgui_recalctimings(svga_t *svga) svga->clock = (cpuclock * (double) (1ULL << 32)) / (((tgui->clock_n + 8) * 14318180.0) / ((tgui->clock_m + 2) * (1 << tgui->clock_k))); if (svga->gdcreg[0xf] & 0x08) - svga->clock *= 2; + svga->clock *= 2.0; else if (svga->gdcreg[0xf] & 0x40) - svga->clock *= 3; + svga->clock *= 3.0; } else { + //pclog("TGUI9400CXi: Clock double=%d.\n", (((svga->miscout >> 2) & 3) | ((tgui->newctrl2 << 2) & 4) | ((tgui->newctrl2 >> 3) & 8))); switch (((svga->miscout >> 2) & 3) | ((tgui->newctrl2 << 2) & 4) | ((tgui->newctrl2 >> 3) & 8)) { case 0x02: svga->clock = (cpuclock * (double) (1ULL << 32)) / 44900000.0; @@ -816,6 +818,7 @@ tgui_recalctimings(svga_t *svga) break; default: + std_vga_clock = 0; break; } @@ -823,6 +826,9 @@ tgui_recalctimings(svga_t *svga) svga->htotal <<= 1; svga->hdisp <<= 1; svga->hdisp_time <<= 1; + svga->dots_per_clock <<= 1; + if (std_vga_clock) + svga->clock /= 2.0; } } @@ -843,6 +849,7 @@ tgui_recalctimings(svga_t *svga) svga->htotal <<= 1; svga->hdisp <<= 1; svga->hdisp_time <<= 1; + svga->dots_per_clock <<= 1; break; default: break; @@ -866,6 +873,7 @@ tgui_recalctimings(svga_t *svga) svga->htotal <<= 1; svga->hdisp <<= 1; svga->hdisp_time <<= 1; + svga->dots_per_clock <<= 1; } switch (svga->hdisp) { case 640: @@ -880,18 +888,24 @@ tgui_recalctimings(svga_t *svga) break; case 15: svga->render = svga_render_15bpp_highres; - if (tgui->type < TGUI_9440) + if (tgui->type < TGUI_9440) { svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } break; case 16: svga->render = svga_render_16bpp_highres; - if (tgui->type < TGUI_9440) + if (tgui->type < TGUI_9440) { svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } break; case 24: svga->render = svga_render_24bpp_highres; - if (tgui->type < TGUI_9440) - svga->hdisp = (svga->hdisp << 1) / 3; + if (tgui->type < TGUI_9440) { + svga->hdisp /= 3; + svga->dots_per_clock /= 3; + } break; case 32: if (svga->rowoffset == 0x100) From ab7de132975706f0790fcb73f67472fd88110158 Mon Sep 17 00:00:00 2001 From: toggo9 <121191375+toggo9@users.noreply.github.com> Date: Sat, 18 Oct 2025 18:52:49 +0200 Subject: [PATCH 030/113] Add two more HP Vectra models. (#6359) * Add two 430FX-based Vectras code. * Add two 430FX-based Vectras machine table entries. * Organize the 430FX-based Vectras code. * Add machine definitions for the two 430FX-based Vectras. * Add the Vectra 500 Series xxx/MT to the GPIO values from the VL/5... makes it report CPU clocks properly. * Darn, forgot something. * Updated and fix the BIOS selector for VE 5/xxx Series 2 --- src/include/86box/machine.h | 5 ++ src/machine/m_at_socket7_3v.c | 144 ++++++++++++++++++++++++++++++++++ src/machine/machine_table.c | 86 ++++++++++++++++++++ src/sio/sio_fdc37c93x.c | 2 +- 4 files changed, 236 insertions(+), 1 deletion(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 7011841fc..061c6473f 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -970,6 +970,11 @@ extern const device_t p54tp4xe_device; #endif extern int machine_at_p54tp4xe_init(const machine_t *); extern int machine_at_exp8551_init(const machine_t *); +#ifdef EMU_DEVICE_H +extern const device_t hpvectravexxx_device; +#endif +extern int machine_at_hpvectravexxx_init(const machine_t *); +extern int machine_at_vectra500mt_init(const machine_t *); extern int machine_at_vectra54_init(const machine_t *); #ifdef EMU_DEVICE_H extern const device_t thor_device; diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 02461d072..69d37229f 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -157,6 +157,150 @@ machine_at_exp8551_init(const machine_t *model) return ret; } +static void +machine_at_hpvectravexxx_gpio_init(void) +{ + uint32_t gpio = 0x40; + + if (cpu_busspeed <= 40000000) + gpio |= 0x30; + else if ((cpu_busspeed > 40000000) && (cpu_busspeed <= 50000000)) + gpio |= 0x00; + else if ((cpu_busspeed > 50000000) && (cpu_busspeed <= 60000000)) + gpio |= 0x20; + else if (cpu_busspeed > 60000000) + gpio |= 0x10; + + if (cpu_dmulti <= 1.5) + gpio |= 0x82; + else if ((cpu_dmulti > 1.5) && (cpu_dmulti <= 2.0)) + gpio |= 0x02; + else if ((cpu_dmulti > 2.0) && (cpu_dmulti <= 2.5)) + gpio |= 0x00; + else if (cpu_dmulti > 2.5) + gpio |= 0x80; + + machine_set_gpio_default(gpio); +} + +static const device_config_t hpvectravexxx_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "gu_07_05", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "GU.07.02 (01/25/96)", + .internal_name = "gu_07_02", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/hpvectravexxx/d3653.bin", "" } + }, + { + .name = "GU.07.05 (08/06/96)", + .internal_name = "gu_07_05", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/hpvectravexxx/GU0705US.FUL", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t hpvectravexxx_device = { + .name = "HP Vectra VE 5/XXX Series 2", + .internal_name = "hpvectravexxx_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = hpvectravexxx_config +}; + +int +machine_at_hpvectravexxx_init(const machine_t *model) +{ + int ret = 0; + const char *fn; + + /* No ROMs available */ + if (!device_available(model->device)) + return ret; + + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000e0000, 131072, 0); + device_context_restore(); + + machine_at_common_init_ex(model, 2); + machine_at_hpvectravexxx_gpio_init(); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_VIDEO, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); + device_add(&i430fx_device); + device_add(&piix_device); + device_add_params(&pc87306_device, (void *) PCX730X_PHOENIX_42); + device_add(&intel_flash_bxt_device); + + if (gfxcard[0] == VID_INTERNAL) + device_add(machine_get_vid_device(machine)); + + return ret; +} +int +machine_at_vectra500mt_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/vectra500mt/GJ0718.FUL", + 0x000e0000, 131072, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x0D, PCI_CARD_VIDEO, 0, 0, 0, 0); + pci_register_slot(0x06, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x08, PCI_CARD_NORMAL, 3, 4, 1, 2); + + if (gfxcard[0] == VID_INTERNAL) + device_add(machine_get_vid_device(machine)); + + device_add(&i430fx_device); + device_add(&piix_device); + device_add_params(&fdc37c93x_device, (void *) (FDC37XXX2 | FDC37C93X_NORMAL)); + device_add(&sst_flash_29ee010_device); + + return ret; +} + int machine_at_vectra54_init(const machine_t *model) { diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index aae2e6b9f..47fb21303 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -13333,6 +13333,92 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + { + .name = "[i430FX] HP Vectra VE 5/XXX Series 2", + .internal_name = "hpvectravexxx", + .type = MACHINE_TYPE_SOCKET7_3V, + .chipset = MACHINE_CHIPSET_INTEL_430FX, + .init = machine_at_hpvectravexxx_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 50000000, + .max_bus = 66666667, + .min_voltage = 3380, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 3.0 + }, + .bus_flags = MACHINE_PS2_PCI, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, + .ram = { + .min = 8192, + .max = 131072, + .step = 8192 + }, + .nvrmask = 255, + .jumpered_ecp_dma = 0, + .default_jumpered_ecp_dma = -1, + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = &hpvectravexxx_device, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &gd5436_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL + }, + { + .name = "[i430FX] HP Vectra 500 Series xxx/MT", + .internal_name = "vectra500mt", + .type = MACHINE_TYPE_SOCKET7_3V, + .chipset = MACHINE_CHIPSET_INTEL_430FX, + .init = machine_at_vectra500mt_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 50000000, + .max_bus = 66666667, + .min_voltage = 3380, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 3.0 + }, + .bus_flags = MACHINE_PS2_PCI, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, + .ram = { + .min = 8192, + .max = 131072, + .step = 8192 + }, + .nvrmask = 511, + .jumpered_ecp_dma = 0, + .default_jumpered_ecp_dma = -1, + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x000044f0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &s3_phoenix_trio64_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL + }, /* Has a SM(S)C FDC37C932 Super I/O chip with on-chip KBC with AMI MegaKey (revision '5') KBC firmware. */ { diff --git a/src/sio/sio_fdc37c93x.c b/src/sio/sio_fdc37c93x.c index 399469424..42ab2c7a7 100644 --- a/src/sio/sio_fdc37c93x.c +++ b/src/sio/sio_fdc37c93x.c @@ -1812,7 +1812,7 @@ fdc37c93x_reset(void *priv) memset(dev->gpio_pulldn, 0xff, 8); /* Acer V62X requires bit 0 to be clear to not be stuck in "clear password" mode. */ - if (machines[machine].init == machine_at_vectra54_init) { + if ((machines[machine].init == machine_at_vectra54_init) || (machines[machine].init == machine_at_vectra500mt_init)) { dev->gpio_pulldn[1] = 0x40; /* From 2eb0c77a8771ef08b1fefa73814d19ffcc756179 Mon Sep 17 00:00:00 2001 From: Valerio Date: Sun, 19 Oct 2025 11:42:47 +0200 Subject: [PATCH 031/113] window title in OSD --- src/unix/unix_osd.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index f6037cbbd..9e9efc645 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -43,6 +43,10 @@ extern SDL_mutex *sdl_mutex; // interface back to main unix monitor implementation extern void unix_executeLine(char *line); +// interface to the currently set window title, this can't be seen normally in a fullscreen setup +extern wchar_t sdl_win_title[512]; +char sdl_win_title_mb[512] = ""; + static SDL_Texture *font_texture = NULL; typedef enum { @@ -177,6 +181,12 @@ void draw_menu(SDL_Renderer *renderer, int selected) draw_text(renderer, "MAIN MENU", x0 + 20, y0 + 5, (SDL_Color){255,255,255,255}); + if (sdl_win_title != NULL) + { + int length = wcstombs(sdl_win_title_mb, sdl_win_title, 256); + draw_text(renderer, sdl_win_title_mb, x0 + 120, y0 + 5, (SDL_Color){255,255,255,255}); + } + for (int i = 0; i < MENU_ITEMS; i++) { int tx = x0 + 20; From 4c10faedbd8fc61a1848c5e86c8d6b84019030c3 Mon Sep 17 00:00:00 2001 From: Valerio Date: Mon, 20 Oct 2025 19:17:46 +0100 Subject: [PATCH 032/113] back to main menu with esc key --- src/unix/unix_osd.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index 9e9efc645..8122e19eb 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -372,9 +372,18 @@ int osd_handle(SDL_Event event) { if (event.key.keysym.scancode == SDL_SCANCODE_ESCAPE) { - // Close the OSD - // debug: fprintf(stderr, "OSD HANDLE: escape\n"); - return 0; + if (state == STATE_MENU) + { + // Close the OSD + // debug: fprintf(stderr, "OSD HANDLE: escape\n"); + return 0; + } + else + { + // Back to Main and keep it open + state = STATE_MENU; + return 1; + } } if (state == STATE_MENU) From 2ee0f0e4707330ce3279696d73c22dec88d7a462 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 20 Oct 2025 20:32:41 +0200 Subject: [PATCH 033/113] RAMDAC/Clock fixes to the S3 and ET4000AX cards 1. The S3 968-based Diamond Stealth 64 Video VRAM, using a 14mhz reference clock, now has its RGB528 fixed Pixel PLL reference divider set to its default value (0x07) per manual and reference clock. Fixes wrong refresh rates on said cards and others. 2. Added the ICS2494-324 clock generator to the ET4000AX. Fixes wrong refresh rates on this one too. --- src/video/ramdac/vid_ramdac_ibm_rgb528.c | 186 ++++++++++++++--------- src/video/vid_et4000.c | 25 ++- src/video/vid_s3.c | 52 +++++-- 3 files changed, 160 insertions(+), 103 deletions(-) diff --git a/src/video/ramdac/vid_ramdac_ibm_rgb528.c b/src/video/ramdac/vid_ramdac_ibm_rgb528.c index bded466d1..09cabeb0a 100644 --- a/src/video/ramdac/vid_ramdac_ibm_rgb528.c +++ b/src/video/ramdac/vid_ramdac_ibm_rgb528.c @@ -60,6 +60,7 @@ typedef union ibm_rgb528_pixel32_t { } ibm_rgb528_pixel32_t; typedef struct ibm_rgb528_ramdac_t { + int type; PALETTE extpal; uint32_t extpallook[256]; uint8_t indexed_data[2048]; @@ -627,19 +628,21 @@ ibm_rgb528_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *priv, svga_t *s case 0x02a: case 0x02c: case 0x02e: - if (ramdac->indexed_data[0x0002] & 0x01) { - switch (ramdac->indexed_data[0x0010] & 0x07) { - case 0x00: - case 0x02: - ramdac->pix_f[ramdac->index - 0x0020] = val; - break; - case 0x01: - case 0x03: - ramdac->pix_m[(ramdac->index - 0x0020) >> 1] = val; - break; - default: - break; - } + switch (ramdac->indexed_data[0x0010] & 0x03) { + case 0x00: + ramdac->pix_f[(ramdac->index - 0x0020)] = val; + break; + case 0x01: + ramdac->pix_m[(ramdac->index - 0x0020) >> 1] = val; + break; + case 0x02: + ramdac->pix_f[(ramdac->index - 0x0020)] = val; + break; + case 0x03: + ramdac->pix_m[(ramdac->index - 0x0020) >> 1] = val; + break; + default: + break; } break; case 0x021: @@ -650,19 +653,21 @@ ibm_rgb528_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *priv, svga_t *s case 0x02b: case 0x02d: case 0x02f: - if (ramdac->indexed_data[0x0002] & 0x01) { - switch (ramdac->indexed_data[0x010] & 0x07) { - case 0x00: - case 0x02: - ramdac->pix_f[ramdac->index - 0x0020] = val; - break; - case 0x01: - case 0x03: - ramdac->pix_n[(ramdac->index - 0x0020) >> 1] = val; - break; - default: - break; - } + switch (ramdac->indexed_data[0x0010] & 0x03) { + case 0x00: + ramdac->pix_f[(ramdac->index - 0x0020)] = val; + break; + case 0x01: + ramdac->pix_n[(ramdac->index - 0x0020) >> 1] = val; + break; + case 0x02: + ramdac->pix_f[(ramdac->index - 0x0020)] = val; + break; + case 0x03: + ramdac->pix_n[(ramdac->index - 0x0020) >> 1] = val; + break; + default: + break; } break; @@ -868,7 +873,52 @@ ibm_rgb528_recalctimings(void *priv, svga_t *svga) { const ibm_rgb528_ramdac_t *ramdac = (ibm_rgb528_ramdac_t *) priv; - svga->interlace = ramdac->indexed_data[0x071] & 0x20; + svga->interlace = !!(ramdac->indexed_data[0x071] & 0x20); + //pclog("MiscClockControl idx002=%02x, SystemClockControl idx008=%02x, Misc2 idx071=%02x, Misc1 idx070=%02x, Misc4 idx073=%02x.\n", + // ramdac->indexed_data[0x002], ramdac->indexed_data[0x008], ramdac->indexed_data[0x071], ramdac->indexed_data[0x070], ramdac->indexed_data[0x073]); + + if (ramdac->indexed_data[0x071] & 0x01) { + if ((ramdac->indexed_data[0x070] & 0x03) == 0x03) { + switch ((ramdac->indexed_data[0x002] & 0x0e) >> 1) { + case 0x00: + default: + svga->clock_multiplier = 0; + break; + case 0x01: + svga->clock_multiplier = 1; + break; + case 0x02: + svga->clock_multiplier = 2; + break; + case 0x03: + svga->clock_multiplier = 3; + break; + case 0x04: + svga->clock_multiplier = 4; + break; + } + } else if ((ramdac->indexed_data[0x070] & 0x03) == 0x01) { + switch ((ramdac->indexed_data[0x002] & 0x0e) >> 1) { + case 0x00: + default: + svga->clock_multiplier = 1; + svga->clock *= 2.0; + break; + case 0x01: + svga->clock_multiplier = 1; + break; + case 0x02: + svga->clock_multiplier = 2; + break; + case 0x03: + svga->clock_multiplier = 3; + break; + case 0x04: + svga->clock_multiplier = 4; + break; + } + } + } if (svga->scrblank || !svga->attr_palette_enable) { if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { @@ -904,49 +954,47 @@ ibm_rgb528_recalctimings(void *priv, svga_t *svga) float ibm_rgb528_getclock(int clock, void *priv) { - const ibm_rgb528_ramdac_t *ramdac = (ibm_rgb528_ramdac_t *) priv; - int pll_vco_div_cnt; - int pll_df; - int pll_ref_div_cnt; - int ddot_divs[8] = { 1, 2, 4, 8, 16, 1, 1, 1 }; - int ddot_div = ddot_divs[(ramdac->indexed_data[0x0002] >> 1) & 0x07]; - float f_pll; + const ibm_rgb528_ramdac_t *ramdac = (ibm_rgb528_ramdac_t *) priv; + int pll_vco_div_cnt; + int pll_df; + int pll_ref_div_cnt; + int ddot_divs[8] = { 1, 2, 4, 8, 16, 1, 1, 1 }; + int ddot_div = ddot_divs[(ramdac->indexed_data[0x0002] >> 1) & 0x07]; + float f_pll; - clock &= 0x03; + if (clock == 0) + return 25175000.0f; + if (clock == 1) + return 28322000.0f; - if (ramdac->indexed_data[0x0002] & 0x01) { - switch (ramdac->indexed_data[0x0010] & 0x07) { - case 0x00: - default: - pll_vco_div_cnt = ramdac->pix_f[clock] & 0x3f; - pll_df = 8 >> (ramdac->pix_f[clock] >> 6); - pll_ref_div_cnt = ramdac->pix_f_ref_div & 0x1f; - break; - case 0x01: - pll_vco_div_cnt = ramdac->pix_m[clock] & 0x3f; - pll_df = 8 >> (ramdac->pix_m[clock] >> 6); - pll_ref_div_cnt = ramdac->pix_n[clock] & 0x1f; - break; - case 0x02: - pll_vco_div_cnt = ramdac->pix_f[ramdac->indexed_data[0x0011] & 0x0f] & 0x3f; - pll_df = 8 >> (ramdac->pix_f[ramdac->indexed_data[0x0011] & 0x0f] >> 6); - pll_ref_div_cnt = ramdac->pix_f_ref_div & 0x1f; - break; - case 0x03: - pll_vco_div_cnt = ramdac->pix_m[ramdac->indexed_data[0x0011] & 0x07] & 0x3f; - pll_df = 8 >> (ramdac->pix_m[ramdac->indexed_data[0x0011] & 0x07] >> 6); - pll_ref_div_cnt = ramdac->pix_n[ramdac->indexed_data[0x0011] & 0x07] & 0x1f; - break; - } - } else { - pll_vco_div_cnt = ramdac->indexed_data[0x0016] & 0x3f; - pll_df = 8 >> (ramdac->indexed_data[0x0016] >> 6); - pll_ref_div_cnt = ramdac->indexed_data[0x0015] & 0x1f; + switch (ramdac->indexed_data[0x0010] & 0x03) { + case 0x00: + default: + pll_vco_div_cnt = ramdac->pix_f[clock & 0x03] & 0x3f; + pll_df = 8 >> (ramdac->pix_f[clock & 0x03] >> 6); + pll_ref_div_cnt = ramdac->pix_f_ref_div & 0x1f; + break; + case 0x01: + pll_vco_div_cnt = ramdac->pix_m[clock & 0x03] & 0x3f; + pll_df = 8 >> (ramdac->pix_m[clock & 0x03] >> 6); + pll_ref_div_cnt = ramdac->pix_n[clock & 0x03] & 0x1f; + break; + case 0x02: + pll_vco_div_cnt = ramdac->pix_f[ramdac->indexed_data[0x0011] & 0x0f] & 0x3f; + pll_df = 8 >> (ramdac->pix_f[ramdac->indexed_data[0x0011] & 0x0f] >> 6); + pll_ref_div_cnt = ramdac->pix_f_ref_div & 0x1f; + break; + case 0x03: + pll_vco_div_cnt = ramdac->pix_m[ramdac->indexed_data[0x0011] & 0x0f] & 0x3f; + pll_df = 8 >> (ramdac->pix_m[ramdac->indexed_data[0x0011] & 0x0f] >> 6); + pll_ref_div_cnt = ramdac->pix_n[ramdac->indexed_data[0x0011] & 0x0f] & 0x1f; + break; } - f_pll = ramdac->ref_clock * (float) (pll_vco_div_cnt + 65) / (float) (pll_ref_div_cnt * pll_df); f_pll /= (float) ddot_div; + //pclog("PIXCTRL1=%02x, clock=%d, m=%d, df=%d, n=%d, ctrl2=%02x, miscclock=%02x, sysclock=%02x, f_pll=%f.\n", + // ramdac->indexed_data[0x010], clock, pll_vco_div_cnt, pll_df, pll_ref_div_cnt, ramdac->indexed_data[0x011], ramdac->indexed_data[0x002], ramdac->indexed_data[0x008], f_pll); return f_pll; } @@ -1073,19 +1121,11 @@ ibm_rgb528_ramdac_init(UNUSED(const device_t *info)) ramdac->smlc_part = 0x0100; ramdac->ref_clock = 14318184.0f; + ramdac->pix_f_ref_div = 0x07; /*Per datasheet regarding the reference clock value.*/ ramdac->indexed_data[0x0008] = 0x0001; - ramdac->indexed_data[0x0014] = 0x0005; ramdac->indexed_data[0x0015] = 0x0008; ramdac->indexed_data[0x0016] = 0x0041; - ramdac->indexed_data[0x0020] = 0x0005; - ramdac->indexed_data[0x0021] = 0x000e; - - ramdac->pix_f_ref_div = 0x0005; - ramdac->pix_f[0] = 0x0005; - ramdac->pix_f[1] = 0x000e; - ramdac->pix_m[0] = 0x0005; - ramdac->pix_n[0] = 0x000e; return ramdac; } diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index 1a8a767e2..80f27833a 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -639,6 +639,7 @@ static void et4000_recalctimings(svga_t *svga) { const et4000_t *dev = (et4000_t *) svga->priv; + int clk_sel = ((svga->miscout >> 2) & 0x03) | ((svga->crtc[0x34] << 1) & 0x04)| ((svga->crtc[0x31] >> 3) & 0x08); svga->memaddr_latch |= (svga->crtc[0x33] & 3) << 16; @@ -665,26 +666,15 @@ et4000_recalctimings(svga_t *svga) svga->dots_per_clock <<= 1; } - switch (((svga->miscout >> 2) & 3) | ((svga->crtc[0x34] << 1) & 4)) { - case 0: - case 1: - break; - case 3: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 40000000.0; - break; - case 5: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 65000000.0; - break; - default: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 36000000.0; - break; - } + svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clk_sel, svga->clock_gen); + if (clk_sel < 2) + svga->clock *= 2.0; switch (svga->bpp) { case 15: case 16: - svga->hdisp /= 2; - svga->dots_per_clock /= 2; + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; break; case 24: @@ -901,6 +891,9 @@ et4000_init(const device_t *info) if (dev->type >= ET4000_TYPE_ISA) dev->svga.ramdac = device_add(&sc1502x_ramdac_device); + dev->svga.clock_gen = device_add(&ics2494an_324_device); + dev->svga.getclock = ics2494_getclock; + if (dev->type == ET4000_TYPE_TC6058AF) dev->svga.adv_flags |= FLAG_PRECISETIME; diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 210a9f625..74b57370e 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -3758,6 +3758,7 @@ s3_recalctimings(svga_t *svga) if ((((svga->miscout >> 2) & 3) == 3) && (s3->chip < S3_TRIO32)) clk_sel = svga->crtc[0x42] & 0x0f; + s3_log("MiscOut=%02x, cr42=%02x.\n", (svga->miscout >> 2) & 3, svga->crtc[0x42] & 0x0f); svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clk_sel, svga->clock_gen); switch (s3->ramdac_type) { @@ -3968,6 +3969,10 @@ s3_recalctimings(svga_t *svga) svga->hdisp <<= 1; svga->dots_per_clock <<= 1; svga->clock *= 2.0; + } else if ((clk_sel == 3) && (s3->width >= 1024)) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; } if (svga->hdisp == 832) svga->hdisp -= 32; @@ -4160,6 +4165,10 @@ s3_recalctimings(svga_t *svga) svga->hdisp <<= 1; svga->dots_per_clock <<= 1; svga->clock *= 2.0; + } else if ((clk_sel == 3) && (s3->width >= 1024)) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; } if (svga->hdisp == 832) svga->hdisp -= 32; @@ -4357,6 +4366,10 @@ s3_recalctimings(svga_t *svga) svga->hdisp <<= 1; svga->dots_per_clock <<= 1; svga->clock *= 2.0; + } else if ((clk_sel == 3) && (s3->width >= 1024)) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; } s3_log("TVP3026 968 16bpp: MiscOut=%x, clksel=%x.\n", (svga->miscout >> 2) & 3, clk_sel); if (svga->hdisp == 832) @@ -4443,9 +4456,20 @@ s3_recalctimings(svga_t *svga) case S3_VISION968: switch (s3->ramdac_type) { + case IBM_RGB: /*IBM RGB528 RAMDAC and clock chip*/ + svga->hdisp = (svga->hdisp << 2) / 3; + svga->dots_per_clock = (svga->dots_per_clock << 2) / 3; + svga->clock = (svga->clock * 4.0) / 3.0; + svga->clock /= 2.0; + if (!s3->elsa_eeprom) { + if (svga->hdisp == 832) + svga->hdisp -= 32; + } + break; + case TVP3026: /*TVP3026 RAMDAC and clock chip*/ svga->hdisp = (svga->hdisp << 1) / 3; - if (clk_sel == 2) { + if (clk_sel >= 2) { svga->hdisp <<= 1; svga->dots_per_clock <<= 1; svga->clock = (svga->clock * 4.0) / 3.0; @@ -4594,6 +4618,10 @@ s3_recalctimings(svga_t *svga) svga->hdisp <<= 1; svga->dots_per_clock <<= 1; svga->clock *= 2.0; + } else if ((clk_sel == 3) && (s3->width >= 1024)) { + svga->hdisp <<= 1; + svga->dots_per_clock <<= 1; + svga->clock *= 2.0; } if (svga->hdisp == 832) svga->hdisp -= 32; @@ -8197,7 +8225,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->bpp == 1) || s3->color_16bit) { srcbase >>= 1; dstbase >>= 1; - } else if (s3->bpp == 3) { + } else if (s3->bpp >= 2) { srcbase >>= 2; dstbase >>= 2; } @@ -8222,7 +8250,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } if ((s3->bpp == 1) || s3->color_16bit) count >>= 1; - else if (s3->bpp == 3) + else if (s3->bpp >= 2) count >>= 2; } } @@ -8930,6 +8958,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cy = s3->accel.cur_y & 0xfff; if (s3->bpp == 2) { + s3_log("24bpp x68 rectfill: cmd=%04x CX=%d, CY=%d.\n", s3->accel.cmd, s3->accel.cx, s3->accel.cy); s3->accel.cx *= 3; s3->accel.cy *= 3; } else if ((s3->bpp == 0) && (svga->bpp == 24)) @@ -9091,16 +9120,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (wrt_mask == 0x0000ffff) wrt_mask = 0xffffffff; - if ((rd_mask == 0x0000ffff) || (rd_mask == 0x000000ff)) + if ((rd_mask == 0x00ffffff) || (rd_mask == 0x0000ffff) || (rd_mask == 0x000000ff)) rd_mask = 0xffffffff; } while (count-- && (s3->accel.sy >= 0)) { - if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { - mix_dat >>= 16; - s3->accel.temp_cnt = 16; - } - if ((((s3->accel.cx >= (clip_l * multiplier)) && (s3->accel.cx <= (clip_r * multiplier)) && (s3->accel.cy >= (clip_t * multiplier)) && (s3->accel.cy <= (clip_b * multiplier))) && !(s3->accel.multifunc[0xe] & 0x20)) || (((s3->accel.cx < (clip_l * multiplier)) && (s3->accel.cx > (clip_r * multiplier)) && (s3->accel.cy < (clip_t * multiplier)) && (s3->accel.cy > (clip_b * multiplier))) && (s3->accel.multifunc[0xe] & 0x20)) ) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { @@ -9138,7 +9162,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if (update) { if (s3->bpp == 2) - dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.cx - (s3->accel.minus * 3)) & s3->vram_mask]) & 0xffffff; + dest_dat = (*(uint32_t *) &vram_b[(s3->accel.dest + s3->accel.cx) & s3->vram_mask]) & 0xffffff; else { READ(s3->accel.dest + s3->accel.cx, dest_dat); } @@ -11515,8 +11539,8 @@ s3_init(const device_t *info) case S3_VISION968: switch (info->local) { - case S3_ELSAWIN2KPROX: case S3_DIAMOND_STEALTH64_968: + case S3_ELSAWIN2KPROX: case S3_PHOENIX_VISION968: case S3_NUMBER9_9FX_771: svga->dac_hwcursor_draw = ibm_rgb528_hwcursor_draw; @@ -11887,10 +11911,10 @@ s3_init(const device_t *info) if (info->local == S3_ELSAWIN2KPROX) { s3->elsa_eeprom = 1; ibm_rgb528_ramdac_set_ref_clock(svga->ramdac, svga, 28322000.0f); - } else if (info->local != S3_DIAMOND_STEALTH64_968) - ibm_rgb528_ramdac_set_ref_clock(svga->ramdac, svga, 16000000.0f); - else + } else if (info->local == S3_DIAMOND_STEALTH64_968) ibm_rgb528_ramdac_set_ref_clock(svga->ramdac, svga, 14318184.0f); + else + ibm_rgb528_ramdac_set_ref_clock(svga->ramdac, svga, 16000000.0f); break; default: svga->ramdac = device_add(&tvp3026_ramdac_device); From 817bfa5aec8954d636e72ec74918468cb422edf7 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 26 Aug 2025 19:51:37 -0400 Subject: [PATCH 034/113] Additional Joystick options --- src/game/gameport.c | 67 ++- src/game/joystick_ch_flightstick_pro.c | 275 +++++++++- src/game/joystick_standard.c | 689 ++++++++++++++++++------- src/include/86box/gameport.h | 64 ++- src/qt/languages/86box.pot | 109 +++- src/qt/languages/cs-CZ.po | 116 ++++- src/qt/languages/de-DE.po | 116 ++++- src/qt/languages/es-ES.po | 116 ++++- src/qt/languages/fi-FI.po | 120 ++++- src/qt/languages/fr-FR.po | 116 ++++- src/qt/languages/hr-HR.po | 116 ++++- src/qt/languages/it-IT.po | 116 ++++- src/qt/languages/ja-JP.po | 116 ++++- src/qt/languages/ko-KR.po | 116 ++++- src/qt/languages/nb-NO.po | 116 ++++- src/qt/languages/nl-NL.po | 116 ++++- src/qt/languages/pl-PL.po | 116 ++++- src/qt/languages/pt-BR.po | 116 ++++- src/qt/languages/pt-PT.po | 116 ++++- src/qt/languages/ru-RU.po | 116 ++++- src/qt/languages/sk-SK.po | 116 ++++- src/qt/languages/sl-SI.po | 118 ++++- src/qt/languages/sv-SE.po | 116 ++++- src/qt/languages/tr-TR.po | 116 ++++- src/qt/languages/uk-UA.po | 116 ++++- src/qt/languages/vi-VN.po | 116 ++++- src/qt/languages/zh-CN.po | 116 ++++- src/qt/languages/zh-TW.po | 116 ++++- 28 files changed, 3205 insertions(+), 673 deletions(-) diff --git a/src/game/gameport.c b/src/game/gameport.c index 88ff5cc8a..d7ecadec4 100644 --- a/src/game/gameport.c +++ b/src/game/gameport.c @@ -88,27 +88,52 @@ static const joystick_t joystick_none = { static const struct { const joystick_t *joystick; } joysticks[] = { - { &joystick_none }, - { &joystick_2axis_2button }, - { &joystick_2button_gamepad }, - { &joystick_2button_flight_yoke }, - { &joystick_2axis_4button }, - { &joystick_4button_gamepad }, - { &joystick_4button_flight_yoke }, - { &joystick_2axis_6button }, - { &joystick_2axis_8button }, - { &joystick_3axis_2button }, - { &joystick_2button_yoke_throttle }, - { &joystick_3axis_4button }, - { &joystick_steering_wheel_4_button }, - { &joystick_4button_yoke_throttle }, - { &joystick_4axis_4button }, - { &joystick_ch_flightstick_pro }, - { &joystick_ch_flightstick_pro_ch_pedals }, - { &joystick_sw_pad }, - { &joystick_tm_fcs }, - { &joystick_tm_fcs_rcs }, - { NULL } + { &joystick_none }, + { &joystick_generic_paddle }, + { &joystick_2axis_1button }, + { &joystick_2axis_2button }, + { &joystick_2axis_3button }, + { &joystick_2axis_4button }, + { &joystick_2axis_6button }, + { &joystick_2axis_8button }, + { &joystick_3axis_2button }, + { &joystick_3axis_3button }, + { &joystick_3axis_4button }, + { &joystick_4axis_2button }, + { &joystick_4axis_3button }, + { &joystick_4axis_4button }, + { &joystick_2button_gamepad }, + { &joystick_3button_gamepad }, + { &joystick_4button_gamepad }, + { &joystick_6button_gamepad }, + { &joystick_gravis_gamepad }, + { &joystick_2button_flight_yoke }, + { &joystick_3button_flight_yoke }, + { &joystick_4button_flight_yoke }, + { &joystick_2button_yoke_throttle }, + { &joystick_3button_yoke_throttle }, + { &joystick_4button_yoke_throttle }, + { &joystick_steering_wheel_2_button }, + { &joystick_steering_wheel_3_button }, + { &joystick_steering_wheel_4_button }, + { &joystick_ch_flightstick }, + { &joystick_ch_flightstick_ch_pedals }, + { &joystick_ch_flightstick_ch_pedals_pro }, + { &joystick_ch_flightstick_pro }, + { &joystick_ch_flightstick_pro_ch_pedals }, + { &joystick_ch_flightstick_pro_ch_pedals_pro }, + { &joystick_ch_virtual_pilot }, + { &joystick_ch_virtual_pilot_ch_pedals }, + { &joystick_ch_virtual_pilot_ch_pedals_pro }, + { &joystick_ch_virtual_pilot_pro }, + { &joystick_ch_virtual_pilot_pro_ch_pedals }, + { &joystick_ch_virtual_pilot_pro_ch_pedals_pro }, + { &joystick_sw_pad }, + { &joystick_tm_fcs }, + { &joystick_tm_fcs_rcs }, + { &joystick_tm_formula_t1t2 }, + { &joystick_tm_formula_t1t2wa }, + { NULL } }; static joystick_instance_t *joystick_instance[GAMEPORT_MAX] = { NULL, NULL }; diff --git a/src/game/joystick_ch_flightstick_pro.c b/src/game/joystick_ch_flightstick_pro.c index 84dc5a380..0c318555a 100644 --- a/src/game/joystick_ch_flightstick_pro.c +++ b/src/game/joystick_ch_flightstick_pro.c @@ -57,6 +57,22 @@ ch_flightstick_pro_close(UNUSED(void *priv)) // } +static uint8_t +ch_flightstick_read(UNUSED(void *priv)) +{ + uint8_t ret = 0xf0; + uint8_t gp = 0; + + if (JOYSTICK_PRESENT(gp, 0)) { + if (joystick_state[gp][0].button[0]) + ret &= ~0x10; + if (joystick_state[gp][0].button[1]) + ret &= ~0x20; + } + + return ret; +} + static uint8_t ch_flightstick_pro_read(UNUSED(void *priv)) { @@ -72,20 +88,81 @@ ch_flightstick_pro_read(UNUSED(void *priv)) ret &= ~0x40; if (joystick_state[gp][0].button[3]) ret &= ~0x80; + // POV Hat if (joystick_state[gp][0].pov[0] != -1) { // POV Up if ((joystick_state[gp][0].pov[0] > 315) || (joystick_state[gp][0].pov[0] < 45)) - ret &= ~0xf0; + ret &= ~0xf0; // 1, 2, 3, 4 // POV Right - else if ((joystick_state[gp][0].pov[0]) >= 45 && (joystick_state[gp][0].pov[0] < 135)) - ret &= ~0xb0; + else if ((joystick_state[gp][0].pov[0] >= 45) && (joystick_state[gp][0].pov[0] < 135)) + ret &= ~0xb0; // 1, 2, 4 // POV Down - else if ((joystick_state[gp][0].pov[0]) >= 135 && (joystick_state[gp][0].pov[0] < 225)) - ret &= ~0x70; + else if ((joystick_state[gp][0].pov[0] >= 135) && (joystick_state[gp][0].pov[0] < 225)) + ret &= ~0x70; // 1, 2, 3 // POV Left - else if ((joystick_state[gp][0].pov[0]) >= 225 && (joystick_state[gp][0].pov[0] < 315)) - ret &= ~0x30; + else if ((joystick_state[gp][0].pov[0] >= 225) && (joystick_state[gp][0].pov[0] < 315)) + ret &= ~0x30; // 1, 2 + } + } + + return ret; +} + +static uint8_t +ch_virtual_pilot_pro_read(UNUSED(void *priv)) +{ + uint8_t gp = 0; + uint8_t ret = 0xf0; + + if (JOYSTICK_PRESENT(gp, 0)) { + if (joystick_state[gp][0].button[0]) // 1 + ret &= ~0x10; + if (joystick_state[gp][0].button[1]) // 2 + ret &= ~0x20; + if (joystick_state[gp][0].button[2]) // 3 + ret &= ~0x40; + if (joystick_state[gp][0].button[3]) // 4 + ret &= ~0x80; + if (joystick_state[gp][0].button[4]) // 1, 3 + ret &= ~0x50; + if (joystick_state[gp][0].button[5]) // 1, 4 + ret &= ~0x90; + + // Right POV Hat + uint8_t pov_id = 0; + + if (joystick_state[gp][0].pov[pov_id] != -1) { + // POV Up + if ((joystick_state[gp][0].pov[pov_id] > 315) || (joystick_state[gp][0].pov[pov_id] < 45)) + ret &= ~0xf0; // 1, 2, 3, 4 + // POV Right + else if ((joystick_state[gp][0].pov[pov_id] >= 45) && (joystick_state[gp][0].pov[pov_id] < 135)) + ret &= ~0xb0; // 1, 2, 4 + // POV Down + else if ((joystick_state[gp][0].pov[pov_id] >= 135) && (joystick_state[gp][0].pov[pov_id] < 225)) + ret &= ~0x70; // 1, 2, 3 + // POV Left + else if ((joystick_state[gp][0].pov[pov_id] >= 225) && (joystick_state[gp][0].pov[pov_id] < 315)) + ret &= ~0x30; // 1, 2 + } + + // Left POV Hat + pov_id = 1; + + if (joystick_state[gp][0].pov[pov_id] != -1) { + // POV Up + if ((joystick_state[gp][0].pov[pov_id] > 315) || (joystick_state[gp][0].pov[pov_id] < 45)) + ret &= ~0xe0; // 2, 3, 4 + // POV Right + else if ((joystick_state[gp][0].pov[pov_id] >= 45) && (joystick_state[gp][0].pov[pov_id] < 135)) + ret &= ~0xa0; // 2, 4 + // POV Down + else if ((joystick_state[gp][0].pov[pov_id] >= 135) && (joystick_state[gp][0].pov[pov_id] < 225)) + ret &= ~0x60; // 2, 3 + // POV Left + else if ((joystick_state[gp][0].pov[pov_id] >= 225) && (joystick_state[gp][0].pov[pov_id] < 315)) + ret &= ~0xc0; // 3, 4 } } @@ -148,6 +225,60 @@ ch_flightstick_pro_a0_over(UNUSED(void *priv)) // } +const joystick_t joystick_ch_flightstick = { + .name = "CH Flightstick", + .internal_name = "ch_flightstick", + .init = ch_flightstick_pro_init, + .close = ch_flightstick_pro_close, + .read = ch_flightstick_read, + .write = ch_flightstick_pro_write, + .read_axis = ch_flightstick_pro_read_axis, + .a0_over = ch_flightstick_pro_a0_over, + .axis_count = 3, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_ch_flightstick_ch_pedals = { + .name = "CH Flightstick + CH Pedals", + .internal_name = "ch_flightstick_ch_pedals", + .init = ch_flightstick_pro_init, + .close = ch_flightstick_pro_close, + .read = ch_flightstick_read, + .write = ch_flightstick_pro_write, + .read_axis = ch_flightstick_pro_ch_pedals_read_axis, + .a0_over = ch_flightstick_pro_a0_over, + .axis_count = 4, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_ch_flightstick_ch_pedals_pro = { + .name = "CH Flightstick + CH Pedals Pro", + .internal_name = "ch_flightstick_ch_pedals_pro", + .init = ch_flightstick_pro_init, + .close = ch_flightstick_pro_close, + .read = ch_flightstick_read, + .write = ch_flightstick_pro_write, + .read_axis = ch_flightstick_pro_ch_pedals_read_axis, + .a0_over = ch_flightstick_pro_a0_over, + .axis_count = 4, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Right Pedal", "Left Pedal" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + const joystick_t joystick_ch_flightstick_pro = { .name = "CH Flightstick Pro", .internal_name = "ch_flightstick_pro", @@ -161,7 +292,7 @@ const joystick_t joystick_ch_flightstick_pro = { .button_count = 4, .pov_count = 1, .max_joysticks = 1, - .axis_names = { "X axis", "Y axis", "Throttle" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle" }, .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; @@ -179,7 +310,133 @@ const joystick_t joystick_ch_flightstick_pro_ch_pedals = { .button_count = 4, .pov_count = 1, .max_joysticks = 1, - .axis_names = { "X axis", "Y axis", "Throttle", "Rudder" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; + +const joystick_t joystick_ch_flightstick_pro_ch_pedals_pro = { + .name = "CH Flightstick Pro + CH Pedals Pro", + .internal_name = "ch_flightstick_pro_ch_pedals_pro", + .init = ch_flightstick_pro_init, + .close = ch_flightstick_pro_close, + .read = ch_flightstick_pro_read, + .write = ch_flightstick_pro_write, + .read_axis = ch_flightstick_pro_ch_pedals_read_axis, + .a0_over = ch_flightstick_pro_a0_over, + .axis_count = 4, + .button_count = 4, + .pov_count = 1, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Right Pedal", "Left Pedal" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .pov_names = { "POV" } +}; + +const joystick_t joystick_ch_virtual_pilot = { + .name = "CH Virtual Pilot", + .internal_name = "ch_virtual_pilot", + .init = ch_flightstick_pro_init, + .close = ch_flightstick_pro_close, + .read = ch_flightstick_read, + .write = ch_flightstick_pro_write, + .read_axis = ch_flightstick_pro_read_axis, + .a0_over = ch_flightstick_pro_a0_over, + .axis_count = 3, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_ch_virtual_pilot_ch_pedals = { + .name = "CH Virtual Pilot + CH Pedals", + .internal_name = "ch_virtual_pilot_ch_pedals", + .init = ch_flightstick_pro_init, + .close = ch_flightstick_pro_close, + .read = ch_flightstick_read, + .write = ch_flightstick_pro_write, + .read_axis = ch_flightstick_pro_ch_pedals_read_axis, + .a0_over = ch_flightstick_pro_a0_over, + .axis_count = 4, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_ch_virtual_pilot_ch_pedals_pro = { + .name = "CH Virtual Pilot + CH Pedals Pro", + .internal_name = "ch_virtual_pilot_ch_pedals_pro", + .init = ch_flightstick_pro_init, + .close = ch_flightstick_pro_close, + .read = ch_flightstick_read, + .write = ch_flightstick_pro_write, + .read_axis = ch_flightstick_pro_ch_pedals_read_axis, + .a0_over = ch_flightstick_pro_a0_over, + .axis_count = 4, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Right Pedal", "Left Pedal" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_ch_virtual_pilot_pro = { + .name = "CH Virtual Pilot Pro", + .internal_name = "ch_virtual_pilot_pro", + .init = ch_flightstick_pro_init, + .close = ch_flightstick_pro_close, + .read = ch_virtual_pilot_pro_read, + .write = ch_flightstick_pro_write, + .read_axis = ch_flightstick_pro_read_axis, + .a0_over = ch_flightstick_pro_a0_over, + .axis_count = 3, + .button_count = 6, + .pov_count = 2, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6" }, + .pov_names = { "Right POV", "Left POV" } +}; + +const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals = { + .name = "CH Virtual Pilot Pro + CH Pedals", + .internal_name = "ch_virtual_pilot_pro_ch_pedals", + .init = ch_flightstick_pro_init, + .close = ch_flightstick_pro_close, + .read = ch_virtual_pilot_pro_read, + .write = ch_flightstick_pro_write, + .read_axis = ch_flightstick_pro_ch_pedals_read_axis, + .a0_over = ch_flightstick_pro_a0_over, + .axis_count = 4, + .button_count = 6, + .pov_count = 2, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6" }, + .pov_names = { "Right POV", "Left POV" } +}; + +const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals_pro = { + .name = "CH Virtual Pilot Pro + CH Pedals Pro", + .internal_name = "ch_virtual_pilot_pro_ch_pedals_pro", + .init = ch_flightstick_pro_init, + .close = ch_flightstick_pro_close, + .read = ch_virtual_pilot_pro_read, + .write = ch_flightstick_pro_write, + .read_axis = ch_flightstick_pro_ch_pedals_read_axis, + .a0_over = ch_flightstick_pro_a0_over, + .axis_count = 4, + .button_count = 6, + .pov_count = 2, + .max_joysticks = 1, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Right Pedal", "Left Pedal" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6" }, + .pov_names = { "Right POV", "Left POV" } +}; diff --git a/src/game/joystick_standard.c b/src/game/joystick_standard.c index 60ea4b57d..8bb47937f 100644 --- a/src/game/joystick_standard.c +++ b/src/game/joystick_standard.c @@ -57,6 +57,27 @@ joystick_standard_close(UNUSED(void *priv)) // } +static uint8_t +joystick_paddle_read(UNUSED(void *priv)) +{ + uint8_t gp = 0; + uint8_t ret = 0xf0; + + if ((JOYSTICK_PRESENT(gp, 0)) && (joystick_state[gp][0].button[0])) + ret &= ~0x10; + + if ((JOYSTICK_PRESENT(gp, 2)) && (joystick_state[gp][2].button[0])) + ret &= ~0x20; + + if ((JOYSTICK_PRESENT(gp, 1)) && (joystick_state[gp][1].button[0])) + ret &= ~0x40; + + if ((JOYSTICK_PRESENT(gp, 3)) && (joystick_state[gp][3].button[0])) + ret &= ~0x80; + + return ret; +} + static uint8_t joystick_standard_read(UNUSED(void *priv)) { @@ -80,6 +101,24 @@ joystick_standard_read(UNUSED(void *priv)) return ret; } +static uint8_t +joystick_standard_read_3button(UNUSED(void *priv)) +{ + uint8_t gp = 0; + uint8_t ret = 0xf0; + + if (JOYSTICK_PRESENT(gp, 0)) { + if (joystick_state[gp][0].button[0]) + ret &= ~0x10; + if (joystick_state[gp][0].button[1]) + ret &= ~0x20; + if (joystick_state[gp][0].button[2]) + ret &= ~0x40; + } + + return ret; +} + static uint8_t joystick_standard_read_4button(UNUSED(void *priv)) { @@ -106,6 +145,33 @@ joystick_standard_write(UNUSED(void *priv)) // } +static int +joystick_paddle_read_axis(UNUSED(void *priv), int axis) +{ + uint8_t gp = 0; + + switch (axis) { + case 0: + if (!JOYSTICK_PRESENT(gp, 0)) + return AXIS_NOT_PRESENT; + return joystick_state[gp][0].axis[0]; + case 1: + if (!JOYSTICK_PRESENT(gp, 2)) + return AXIS_NOT_PRESENT; + return joystick_state[gp][2].axis[0]; + case 2: + if (!JOYSTICK_PRESENT(gp, 1)) + return AXIS_NOT_PRESENT; + return joystick_state[gp][1].axis[0]; + case 3: + if (!JOYSTICK_PRESENT(gp, 3)) + return AXIS_NOT_PRESENT; + return joystick_state[gp][3].axis[0]; + default: + return 0; + } +} + static int joystick_standard_read_axis(UNUSED(void *priv), int axis) { @@ -134,7 +200,7 @@ joystick_standard_read_axis(UNUSED(void *priv), int axis) } static int -joystick_standard_read_axis_4button(UNUSED(void *priv), int axis) +joystick_standard_read_axis_2axis(UNUSED(void *priv), int axis) { uint8_t gp = 0; @@ -168,7 +234,7 @@ joystick_standard_read_axis_with_pov(UNUSED(void *priv), int axis) return joystick_state[gp][0].axis[0]; case 1: // Y-axis return joystick_state[gp][0].axis[1]; - case 2: // POV Hat (mapped to the 3rd logical axis, index 2) + case 2: // POV Hat if (joystick_state[gp][0].pov[0] == -1) return 32767; // Centered/No input (as per tm_fcs_rcs_read_axis example) if (joystick_state[gp][0].pov[0] > 315 || joystick_state[gp][0].pov[0] < 45) @@ -179,9 +245,8 @@ joystick_standard_read_axis_with_pov(UNUSED(void *priv), int axis) return 0; // Right/Left (example, matches tm_fcs_rcs_read_axis) if (joystick_state[gp][0].pov[0] >= 225 && joystick_state[gp][0].pov[0] < 315) return 16384; // Down-Left (example value, matches tm_fcs_rcs_read_axis) - return 0; // Fallback - case 3: // This case might be used for a Z-axis if present, or can return 0 if not. - // For gamepads with only X/Y and POV, this will likely be unused or return 0. + return 0; + case 3: return 0; default: return 0; @@ -289,6 +354,42 @@ joystick_standard_a0_over(UNUSED(void *priv)) // } +const joystick_t joystick_generic_paddle = { + .name = "Generic Paddle Controller(s)", + .internal_name = "generic_paddle", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_paddle_read, + .write = joystick_standard_write, + .read_axis = joystick_paddle_read_axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 1, + .button_count = 1, + .pov_count = 0, + .max_joysticks = 4, + .axis_names = { "X axis" }, + .button_names = { "Button 1" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_2axis_1button = { + .name = "2-axis, 1-button joystick(s)", + .internal_name = "2axis_1button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 1, + .pov_count = 0, + .max_joysticks = 2, + .axis_names = { "X axis", "Y axis" }, + .button_names = { "Button 1" }, + .pov_names = { NULL } +}; + const joystick_t joystick_2axis_2button = { .name = "2-axis, 2-button joystick(s)", .internal_name = "2axis_2button", @@ -307,39 +408,21 @@ const joystick_t joystick_2axis_2button = { .pov_names = { NULL } }; -const joystick_t joystick_2button_gamepad = { - .name = "2-button gamepad(s)", - .internal_name = "2button_gamepad", +const joystick_t joystick_2axis_3button = { + .name = "2-axis, 3-button joystick", + .internal_name = "2axis_3button", .init = joystick_standard_init, .close = joystick_standard_close, - .read = joystick_standard_read, + .read = joystick_standard_read_3button, .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis, + .read_axis = joystick_standard_read_axis_2axis, .a0_over = joystick_standard_a0_over, .axis_count = 2, - .button_count = 2, + .button_count = 3, .pov_count = 0, - .max_joysticks = 2, + .max_joysticks = 1, .axis_names = { "X axis", "Y axis" }, - .button_names = { "Button 1", "Button 2" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_2button_flight_yoke = { - .name = "2-button flight yoke", - .internal_name = "2button_flight_yoke", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 2, - .button_count = 2, - .pov_count = 0, - .max_joysticks = 2, - .axis_names = { "Roll axis", "Pitch axis" }, - .button_names = { "Trigger", "Button 2" }, + .button_names = { "Button 1", "Button 2", "Button 3" }, .pov_names = { NULL } }; @@ -350,7 +433,7 @@ const joystick_t joystick_2axis_4button = { .close = joystick_standard_close, .read = joystick_standard_read_4button, .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_4button, + .read_axis = joystick_standard_read_axis_2axis, .a0_over = joystick_standard_a0_over, .axis_count = 2, .button_count = 4, @@ -361,150 +444,6 @@ const joystick_t joystick_2axis_4button = { .pov_names = { NULL } }; -const joystick_t joystick_4button_gamepad = { - .name = "4-button gamepad", - .internal_name = "4button_gamepad", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read_4button, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_4button, - .a0_over = joystick_standard_a0_over, - .axis_count = 2, - .button_count = 4, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "X axis", "Y axis" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_4button_flight_yoke = { - .name = "4-button flight yoke", - .internal_name = "4button_flight_yoke", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read_4button, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_4button, - .a0_over = joystick_standard_a0_over, - .axis_count = 2, - .button_count = 4, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "Roll axis", "Pitch axis" }, - .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_3axis_2button = { - .name = "3-axis, 2-button joystick", - .internal_name = "3axis_2button", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 3, - .button_count = 2, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "X axis", "Y axis", "Z axis" }, - .button_names = { "Button 1", "Button 2" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_2button_yoke_throttle = { - .name = "2-button flight yoke with throttle", - .internal_name = "2button_yoke_throttle", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 3, - .button_count = 2, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "Roll axis", "Pitch axis", "Throttle axis" }, - .button_names = { "Trigger", "Button 2" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_3axis_4button = { - .name = "3-axis, 4-button joystick", - .internal_name = "3axis_4button", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read_4button, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 3, - .button_count = 4, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "X axis", "Y axis", "Z axis" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_4button_yoke_throttle = { - .name = "4-button flight yoke with throttle", - .internal_name = "4button_yoke_throttle", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read_4button, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 3, - .button_count = 4, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "Roll axis", "Pitch axis", "Throttle axis" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_steering_wheel_4_button = { - .name = "Steering Wheel (3-axis, 4-button)", - .internal_name = "steering_wheel_4_button", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read_4button, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 3, - .button_count = 4, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "Steering axis", "Accelerator axis", "Brake axis" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, - .pov_names = { NULL } -}; - -const joystick_t joystick_4axis_4button = { - .name = "4-axis, 4-button joystick", - .internal_name = "4axis_4button", - .init = joystick_standard_init, - .close = joystick_standard_close, - .read = joystick_standard_read_4button, - .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_4axis, - .a0_over = joystick_standard_a0_over, - .axis_count = 4, - .button_count = 4, - .pov_count = 0, - .max_joysticks = 1, - .axis_names = { "X axis", "Y axis", "Z axis", "zX axis" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, - .pov_names = { NULL } -}; - const joystick_t joystick_2axis_6button = { .name = "2-axis, 6-button joystick", .internal_name = "2axis_6button", @@ -540,3 +479,401 @@ const joystick_t joystick_2axis_8button = { .button_names = { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6", "Button 7", "Button 8" }, .pov_names = { NULL } }; + +const joystick_t joystick_3axis_2button = { + .name = "3-axis, 2-button joystick", + .internal_name = "3axis_2button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis", "Z axis" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_3axis_3button = { + .name = "3-axis, 3-button joystick", + .internal_name = "3axis_3button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_3button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 3, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis", "Z axis" }, + .button_names = { "Button 1", "Button 2", "Button 3" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_3axis_4button = { + .name = "3-axis, 4-button joystick", + .internal_name = "3axis_4button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis", "Z axis" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_4axis_2button = { + .name = "4-axis, 2-button joystick", + .internal_name = "4axis_2button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 4, + .button_count = 3, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis", "Z axis", "zX axis" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_4axis_3button = { + .name = "4-axis, 3-button joystick", + .internal_name = "4axis_3button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_3button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 4, + .button_count = 3, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis", "Z axis", "zX axis" }, + .button_names = { "Button 1", "Button 2", "Button 3" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_4axis_4button = { + .name = "4-axis, 4-button joystick", + .internal_name = "4axis_4button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 4, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis", "Z axis", "zX axis" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_2button_gamepad = { + .name = "2-button gamepad(s)", + .internal_name = "2button_gamepad", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 2, + .axis_names = { "X axis", "Y axis" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_3button_gamepad = { + .name = "3-button gamepad", + .internal_name = "3button_gamepad", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_3button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_2axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 3, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis" }, + .button_names = { "Button 1", "Button 2", "Button 3" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_4button_gamepad = { + .name = "4-button gamepad", + .internal_name = "4button_gamepad", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_2axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_6button_gamepad = { + .name = "6-button gamepad", + .internal_name = "6button_gamepad", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_6button, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 6, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_gravis_gamepad = { + .name = "Gravis PC GamePad", + .internal_name = "gravis_gamepad", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_2axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "X axis", "Y axis" }, + // TODO: Check this + .button_names = { "Button 1 (Red)", "Button 2 (Blue)", "Button 3 (Yellow)", "Button 4 (Green)" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_2button_flight_yoke = { + .name = "2-button flight yoke", + .internal_name = "2button_flight_yoke", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 2, + .axis_names = { "Roll axis", "Pitch axis" }, + .button_names = { "Trigger", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_3button_flight_yoke = { + .name = "3-button flight yoke", + .internal_name = "3button_flight_yoke", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_3button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_2axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 3, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Roll axis", "Pitch axis" }, + .button_names = { "Trigger", "Button 2", "Button 3" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_4button_flight_yoke = { + .name = "4-button flight yoke", + .internal_name = "4button_flight_yoke", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_2axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Roll axis", "Pitch axis" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_2button_yoke_throttle = { + .name = "2-button flight yoke with throttle", + .internal_name = "2button_yoke_throttle", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 2, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Roll axis", "Pitch axis", "Throttle axis" }, + .button_names = { "Trigger", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_3button_yoke_throttle = { + .name = "3-button flight yoke with throttle", + .internal_name = "3button_yoke_throttle", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_3button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 3, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Roll axis", "Pitch axis", "Throttle axis" }, + .button_names = { "Button 1", "Button 2", "Button 3" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_4button_yoke_throttle = { + .name = "4-button flight yoke with throttle", + .internal_name = "4button_yoke_throttle", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Roll axis", "Pitch axis", "Throttle axis" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_steering_wheel_2_button = { + .name = "Steering Wheel (3-axis, 2-button)", + .internal_name = "steering_wheel_2_button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Steering axis", "Accelerator axis", "Brake axis" }, + .button_names = { "Button 1", "Button 2" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_steering_wheel_3_button = { + .name = "Steering Wheel (3-axis, 3-button)", + .internal_name = "steering_wheel_3_button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_3button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Steering axis", "Accelerator axis", "Brake axis" }, + .button_names = { "Button 1", "Button 2", "Button 3" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_steering_wheel_4_button = { + .name = "Steering Wheel (3-axis, 4-button)", + .internal_name = "steering_wheel_4_button", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Steering axis", "Accelerator axis", "Brake axis" }, + .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .pov_names = { NULL } +}; + +const joystick_t joystick_tm_formula_t1t2 = { + .name = "Thrustmaster Formula T1/T2 with Adaptor", + .internal_name = "thrustmaster_formula_t1t2", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_2axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 2, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Steering axis", "Accelerator/Brake axis" }, + .button_names = { "Shifter Up", "Shifter Down", "Top Console Switch", "Bottom Console Switch" }, + .pov_names = { NULL } +}; + +// TODO Validate this +const joystick_t joystick_tm_formula_t1t2wa = { + .name = "Thrustmaster Formula T1/T2 without Adaptor", + .internal_name = "thrustmaster_formula_t1t2wa", + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis, + .a0_over = joystick_standard_a0_over, + .axis_count = 3, + .button_count = 4, + .pov_count = 0, + .max_joysticks = 1, + .axis_names = { "Steering axis", "Accelerator axis", "Brake axis" }, + .button_names = { "Shifter Up", "Shifter Down", "Top Console Switch", "Bottom Console Switch" }, + .pov_names = { NULL } +}; diff --git a/src/include/86box/gameport.h b/src/include/86box/gameport.h index 1b86c0567..878472a55 100644 --- a/src/include/86box/gameport.h +++ b/src/include/86box/gameport.h @@ -172,29 +172,73 @@ extern void gameport_update_joystick_type(uint8_t gp); extern void gameport_remap(void *priv, uint16_t address); extern void *gameport_add(const device_t *gameport_type); +// Paddle Controllers +extern const joystick_t joystick_generic_paddle; + +// 2 axis Generic Joysticks +extern const joystick_t joystick_2axis_1button; extern const joystick_t joystick_2axis_2button; -extern const joystick_t joystick_2button_gamepad; -extern const joystick_t joystick_2button_flight_yoke; +extern const joystick_t joystick_2axis_3button; extern const joystick_t joystick_2axis_4button; -extern const joystick_t joystick_4button_gamepad; -extern const joystick_t joystick_4button_flight_yoke; -extern const joystick_t joystick_3axis_2button; -extern const joystick_t joystick_2button_yoke_throttle; -extern const joystick_t joystick_3axis_4button; -extern const joystick_t joystick_4button_yoke_throttle; -extern const joystick_t joystick_steering_wheel_4_button; -extern const joystick_t joystick_4axis_4button; extern const joystick_t joystick_2axis_6button; extern const joystick_t joystick_2axis_8button; +// 2 axis Generic Joysticks +extern const joystick_t joystick_3axis_2button; +extern const joystick_t joystick_3axis_3button; +extern const joystick_t joystick_3axis_4button; + +// 4 axis Generic Joysticks +extern const joystick_t joystick_4axis_2button; +extern const joystick_t joystick_4axis_3button; +extern const joystick_t joystick_4axis_4button; + +// Generic Gamepads +extern const joystick_t joystick_2button_gamepad; +extern const joystick_t joystick_3button_gamepad; +extern const joystick_t joystick_4button_gamepad; +extern const joystick_t joystick_6button_gamepad; + +extern const joystick_t joystick_gravis_gamepad; + +// Generic Steering Wheels +extern const joystick_t joystick_steering_wheel_2_button; +extern const joystick_t joystick_steering_wheel_3_button; +extern const joystick_t joystick_steering_wheel_4_button; + +// Generic Flight Yokes +extern const joystick_t joystick_2button_flight_yoke; +extern const joystick_t joystick_4button_flight_yoke; +extern const joystick_t joystick_3button_flight_yoke; + +extern const joystick_t joystick_2button_yoke_throttle; +extern const joystick_t joystick_3button_yoke_throttle; +extern const joystick_t joystick_4button_yoke_throttle; + +extern const joystick_t joystick_ch_flightstick; +extern const joystick_t joystick_ch_flightstick_ch_pedals; +extern const joystick_t joystick_ch_flightstick_ch_pedals_pro; + extern const joystick_t joystick_ch_flightstick_pro; extern const joystick_t joystick_ch_flightstick_pro_ch_pedals; +extern const joystick_t joystick_ch_flightstick_pro_ch_pedals_pro; + +extern const joystick_t joystick_ch_virtual_pilot; +extern const joystick_t joystick_ch_virtual_pilot_ch_pedals; +extern const joystick_t joystick_ch_virtual_pilot_ch_pedals_pro; + +extern const joystick_t joystick_ch_virtual_pilot_pro; +extern const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals; +extern const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals_pro; extern const joystick_t joystick_sw_pad; extern const joystick_t joystick_tm_fcs; extern const joystick_t joystick_tm_fcs_rcs; +extern const joystick_t joystick_tm_formula_t1t2; +extern const joystick_t joystick_tm_formula_t1t2wa; + #ifdef __cplusplus } #endif diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 9b6ce9399..fd935ffc5 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -852,9 +852,18 @@ msgstr "" msgid "Invalid PCap device" msgstr "" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "" + msgid "2-axis, 2-button joystick(s)" msgstr "" +msgid "2-axis, 3-button joystick" +msgstr "" + msgid "2-axis, 4-button joystick" msgstr "" @@ -867,18 +876,99 @@ msgstr "" msgid "3-axis, 2-button joystick" msgstr "" +msgid "3-axis, 3-button joystick" +msgstr "" + msgid "3-axis, 4-button joystick" msgstr "" +msgid "4-axis, 2-button joystick" +msgstr "" + +msgid "4-axis, 3-button joystick" +msgstr "" + msgid "4-axis, 4-button joystick" msgstr "" +msgid "2-button gamepad(s)" +msgstr "" + +msgid "3-button gamepad" +msgstr "" + +msgid "4-button gamepad" +msgstr "" + +msgid "6-button gamepad" +msgstr "" + +msgid "Gravis PC GamePad" +msgstr "" + +msgid "2-button flight yoke" +msgstr "" + +msgid "3-button flight yoke" +msgstr "" + +msgid "4-button flight yoke" +msgstr "" + +msgid "2-button flight yoke with throttle" +msgstr "" + +msgid "3-button flight yoke with throttle" +msgstr "" + +msgid "4-button flight yoke with throttle" +msgstr "" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "" + +msgid "CH Flightstick" +msgstr "" + +msgid "CH Flightstick + CH Pedals" +msgstr "" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "" + msgid "CH Flightstick Pro" msgstr "" msgid "CH Flightstick Pro + CH Pedals" msgstr "" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "" + +msgid "CH Virtual Pilot" +msgstr "" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "" + +msgid "CH Virtual Pilot Pro" +msgstr "" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "" + msgid "Microsoft SideWinder Pad" msgstr "" @@ -888,25 +978,10 @@ msgstr "" msgid "Thrustmaster FCS + Rudder Control System" msgstr "" -msgid "2-button gamepad(s)" +msgid "Thrustmaster Formula T1/T2 with Adaptor" msgstr "" -msgid "2-button flight yoke" -msgstr "" - -msgid "4-button gamepad" -msgstr "" - -msgid "4-button flight yoke" -msgstr "" - -msgid "2-button flight yoke with throttle" -msgstr "" - -msgid "4-button flight yoke with throttle" -msgstr "" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" msgstr "" msgid "None" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 03103a3e3..1aa30bdeb 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -852,9 +852,18 @@ msgstr "Nebyla nalezena žádná PCap zařízení" msgid "Invalid PCap device" msgstr "Neplatné PCap zařízení" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Joystick s 2 osami a 1 tlačítky" + msgid "2-axis, 2-button joystick(s)" msgstr "Joystick s 2 osami a 2 tlačítky" +msgid "2-axis, 3-button joystick" +msgstr "Joystick s 2 osami a 3 tlačítky" + msgid "2-axis, 4-button joystick" msgstr "Joystick s 2 osami a 4 tlačítky" @@ -867,18 +876,99 @@ msgstr "Joystick s 2 osami a 8 tlačítky" msgid "3-axis, 2-button joystick" msgstr "Joystick s 3 osami a 2 tlačítky" +msgid "3-axis, 3-button joystick" +msgstr "Joystick s 3 osami a 3 tlačítky" + msgid "3-axis, 4-button joystick" msgstr "Joystick s 3 osami a 4 tlačítky" +msgid "4-axis, 2-button joystick" +msgstr "Joystick s 4 osami a 2 tlačítky" + +msgid "4-axis, 3-button joystick" +msgstr "Joystick s 4 osami a 3 tlačítky" + msgid "4-axis, 4-button joystick" msgstr "Joystick s 4 osami a 4 tlačítky" +msgid "2-button gamepad(s)" +msgstr "Ovladač se 2 tlačítky" + +msgid "3-button gamepad" +msgstr "Ovladač se 3 tlačítky" + +msgid "4-button gamepad" +msgstr "Ovladač se 4 tlačítky" + +msgid "6-button gamepad" +msgstr "Ovladač se 6 tlačítky" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Letecký knipl se 2 tlačítky" + +msgid "3-button flight yoke" +msgstr "Letecký knipl se32 tlačítky" + +msgid "4-button flight yoke" +msgstr "Letecký knipl se 4 tlačítky" + +msgid "2-button flight yoke with throttle" +msgstr "Letecký knipl s 2 tlačítky a pákou" + +msgid "3-button flight yoke with throttle" +msgstr "Letecký knipl s 3 tlačítky a pákou" + +msgid "4-button flight yoke with throttle" +msgstr "Letecký knipl s 4 tlačítky a pákou" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volant (3 osy, 2 tlačítka)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volant (3 osy, 3 tlačítka)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volant (3 osy, 4 tlačítka)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Ovladač se 2 tlačítky" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Letecký knipl se 2 tlačítky" - -msgid "4-button gamepad" -msgstr "Ovladač se 4 tlačítky" - -msgid "4-button flight yoke" -msgstr "Letecký knipl se 4 tlačítky" - -msgid "2-button flight yoke with throttle" -msgstr "Letecký knipl s 2 tlačítky a pákou" - -msgid "4-button flight yoke with throttle" -msgstr "Letecký knipl s 4 tlačítky a pákou" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volant pro Windows 95 (3 osy, 4 tlačítka)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Žadné" @@ -2988,6 +3063,9 @@ msgstr "Režim roztažení vstupu OpenGL" msgid "Color scheme" msgstr "Barevné schéma" +msgid "System" +msgstr "" + msgid "Light" msgstr "Světlé" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index bdcddfe8d..ed479ab13 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -852,9 +852,18 @@ msgstr "Keine PCap-Geräte gefunden" msgid "Invalid PCap device" msgstr "Ungültiges PCap-Gerät" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2-Achsen-, 1-Tasten-Joystick(s)" + msgid "2-axis, 2-button joystick(s)" msgstr "2-Achsen-, 2-Tasten-Joystick(s)" +msgid "2-axis, 3-button joystick" +msgstr "2-Achsen-, 3-Tasten-Joystick" + msgid "2-axis, 4-button joystick" msgstr "2-Achsen-, 4-Tasten-Joystick" @@ -867,18 +876,99 @@ msgstr "2-Achsen-, 8-Tasten-Joystick" msgid "3-axis, 2-button joystick" msgstr "3-Achsen-, 2-Tasten-Joystick" +msgid "3-axis, 3-button joystick" +msgstr "3-Achsen-, 3-Tasten-Joystick" + msgid "3-axis, 4-button joystick" msgstr "3-Achsen-, 4-Tasten-Joystick" +msgid "4-axis, 2-button joystick" +msgstr "4-Achsen-, 2-Tasten-Joystick" + +msgid "4-axis, 3-button joystick" +msgstr "4-Achsen-, 3-Tasten-Joystick" + msgid "4-axis, 4-button joystick" msgstr "4-Achsen-, 4-Tasten-Joystick" +msgid "2-button gamepad(s)" +msgstr "2-Tasten-Gamepad(s)" + +msgid "3-button gamepad" +msgstr "3-Tasten-Gamepad" + +msgid "4-button gamepad" +msgstr "4-Tasten-Gamepad" + +msgid "6-button gamepad" +msgstr "6-Tasten-Gamepad" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2-Tasten-Steuerhorn" + +msgid "3-button flight yoke" +msgstr "3-Tasten-Steuerhorn" + +msgid "4-button flight yoke" +msgstr "4-Tasten-Steuerhorn" + +msgid "2-button flight yoke with throttle" +msgstr "2-Tasten-Steuerhorn mit Schubregler" + +msgid "3-button flight yoke with throttle" +msgstr "3-Tasten-Steuerhorn mit Schubregler" + +msgid "4-button flight yoke with throttle" +msgstr "4-Tasten-Steuerhorn mit Schubregler" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Lenkrad (3-Achsen, 2-Tasten)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Lenkrad (3-Achsen, 3-Tasten)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Lenkrad (3-Achsen, 4-Tasten)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedale" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedale Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedale" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedale Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedale" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedale Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2-Tasten-Gamepad(s)" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2-Tasten-Steuerhorn" - -msgid "4-button gamepad" -msgstr "4-Tasten-Gamepad" - -msgid "4-button flight yoke" -msgstr "4-Tasten-Steuerhorn" - -msgid "2-button flight yoke with throttle" -msgstr "2-Tasten-Steuerhorn mit Schubregler" - -msgid "4-button flight yoke with throttle" -msgstr "4-Tasten-Steuerhorn mit Schubregler" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 Lenkrad (3-Achsen, 4-Tasten)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Ohne" @@ -2988,6 +3063,9 @@ msgstr "Eingabestreckungsmodus von OpenGL" msgid "Color scheme" msgstr "Farbschema" +msgid "System" +msgstr "" + msgid "Light" msgstr "Licht" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 2bf3f5181..bcf5a0026 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -852,9 +852,18 @@ msgstr "No se encontraron dispositivos PCap" msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Mando(s) de 2 ejes, 1 botones" + msgid "2-axis, 2-button joystick(s)" msgstr "Mando(s) de 2 ejes, 2 botones" +msgid "2-axis, 3-button joystick" +msgstr "Mando de 2 ejes, 3 botones" + msgid "2-axis, 4-button joystick" msgstr "Mando de 2 ejes, 4 botones" @@ -867,18 +876,99 @@ msgstr "Mando de 2 ejes, 8 botones" msgid "3-axis, 2-button joystick" msgstr "Mando de 3 ejes, 2 botones" +msgid "3-axis, 3-button joystick" +msgstr "Mando de 3 ejes, 3 botones" + msgid "3-axis, 4-button joystick" msgstr "Mando de 3 ejes, 4 botones" +msgid "4-axis, 2-button joystick" +msgstr "Mando de 4 ejes, 2 botones" + +msgid "4-axis, 3-button joystick" +msgstr "Mando de 4 ejes, 3 botones" + msgid "4-axis, 4-button joystick" msgstr "Mando de 4 ejes, 4 botones" +msgid "2-button gamepad(s)" +msgstr "Mando(s) de juegos de 2 botones" + +msgid "4-button gamepad" +msgstr "Mando de juegos de 3 botones" + +msgid "4-button gamepad" +msgstr "Mando de juegos de 4 botones" + +msgid "6-button gamepad" +msgstr "Mando de juegos de 6 botones" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Yugo de vuelo de 2 botones" + +msgid "3-button flight yoke" +msgstr "Yugo de vuelo de 3 botones" + +msgid "4-button flight yoke" +msgstr "Yugo de vuelo de 4 botones" + +msgid "2-button flight yoke with throttle" +msgstr "Yugo de vuelo de 2 botones con acelerador" + +msgid "3-button flight yoke with throttle" +msgstr "Yugo de vuelo de 3 botones con acelerador" + +msgid "4-button flight yoke with throttle" +msgstr "Yugo de vuelo de 4 botones con acelerador" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volante (de 3 ejes, 2 botones)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volante (de 3 ejes, 3 botones)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volante (de 3 ejes, 4 botones)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Mando(s) de juegos de 2 botones" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Yugo de vuelo de 2 botones" - -msgid "4-button gamepad" -msgstr "Mando de juegos de 4 botones" - -msgid "4-button flight yoke" -msgstr "Yugo de vuelo de 4 botones" - -msgid "2-button flight yoke with throttle" -msgstr "Yugo de vuelo de 2 botones con acelerador" - -msgid "4-button flight yoke with throttle" -msgstr "Yugo de vuelo de 4 botones con acelerador" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volante Win95 (de 3 ejes, 4 botones)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Ninguno" @@ -2988,6 +3063,9 @@ msgstr "Modo de estiramiento de entrada de OpenGL" msgid "Color scheme" msgstr "Esquema de colores" +msgid "System" +msgstr "" + msgid "Light" msgstr "Luz" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 24102f071..96b1c03aa 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -852,9 +852,18 @@ msgstr "PCap-laitteita ei löytynyt" msgid "Invalid PCap device" msgstr "Virheellinen PCap-laite" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2-akseliset 1-painikkeiset peliohjaimet" + msgid "2-axis, 2-button joystick(s)" msgstr "2-akseliset 2-painikkeiset peliohjaimet" +msgid "2-axis, 3-button joystick" +msgstr "2-akselinen 3-painikkeinen peliohjain" + msgid "2-axis, 4-button joystick" msgstr "2-akselinen 4-painikkeinen peliohjain" @@ -867,17 +876,98 @@ msgstr "2-akselinen 8-painikkeinen peliohjain" msgid "3-axis, 2-button joystick" msgstr "3-akselinen 2-painikkeinen peliohjain" +msgid "3-axis, 3-button joystick" +msgstr "3-akselinen 3-painikkeinen peliohjain" + msgid "3-axis, 4-button joystick" msgstr "3-akselinen 4-painikkeinen peliohjain" +msgid "4-axis, 2-button joystick" +msgstr "4-akselinen 2-painikkeinen peliohjain" + +msgid "4-axis, 3-button joystick" +msgstr "4-akselinen 3-painikkeinen peliohjain" + msgid "4-axis, 4-button joystick" msgstr "4-akselinen 4-painikkeinen peliohjain" +msgid "2-button gamepad(s)" +msgstr "2-painikkeiset peliohjaimet" + +msgid "3-button gamepad" +msgstr "3-painikkeinen peliohjain" + +msgid "4-button gamepad" +msgstr "4-painikkeinen peliohjain" + +msgid "6-button gamepad" +msgstr "6-painikkeinen peliohjain" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2-painikkeinen lento-ohjain" + +msgid "3-button flight yoke" +msgstr "3-painikkeinen lento-ohjain" + +msgid "4-button flight yoke" +msgstr "4-painikkeinen lento-ohjain" + +msgid "2-button flight yoke with throttle" +msgstr "2-painikkeinen lento-ohjain kaasuvivulla" + +msgid "3-button flight yoke with throttle" +msgstr "3-painikkeinen lento-ohjain kaasuvivulla" + +msgid "4-button flight yoke with throttle" +msgstr "4-painikkeinen lento-ohjain kaasuvivulla" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "ratti (3-akselinen, 2-painikkeinen)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "ratti (3-akselinen, 3-painikkeinen)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "ratti (3-akselinen, 4-painikkeinen)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" -msgstr "" +msgstr "CH Flightstick Pro + CH Pedals" + +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -886,28 +976,13 @@ msgid "Thrustmaster Flight Control System" msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" -msgstr "" +msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2-painikkeiset peliohjaimet" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2-painikkeinen lento-ohjain" - -msgid "4-button gamepad" -msgstr "4-painikkeinen peliohjain" - -msgid "4-button flight yoke" -msgstr "4-painikkeinen lento-ohjain" - -msgid "2-button flight yoke with throttle" -msgstr "2-painikkeinen lento-ohjain kaasuvivulla" - -msgid "4-button flight yoke with throttle" -msgstr "4-painikkeinen lento-ohjain kaasuvivulla" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95-ratti (3-akselinen, 4-painikkeinen)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Ei mikään" @@ -2988,6 +3063,9 @@ msgstr "OpenGL-syötteen venytystila" msgid "Color scheme" msgstr "Väriteema" +msgid "System" +msgstr "" + msgid "Light" msgstr "Vaalea" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index c98280f3b..928666268 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -852,9 +852,18 @@ msgstr "Aucun dispositif PCap trouvé" msgid "Invalid PCap device" msgstr "Dispositif PCap invalide" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Manette(s) avec 2 axes, 1 boutons" + msgid "2-axis, 2-button joystick(s)" msgstr "Manette(s) avec 2 axes, 2 boutons" +msgid "2-axis, 3-button joystick" +msgstr "Manette avec 2 axes, 4 boutons" + msgid "2-axis, 4-button joystick" msgstr "Manette avec 2 axes, 4 boutons" @@ -867,18 +876,99 @@ msgstr "Manette avec 2 axes, 8 boutons" msgid "3-axis, 2-button joystick" msgstr "Manette avec 3 axes, 2 boutons" +msgid "3-axis, 3-button joystick" +msgstr "Manette avec 3 axes, 3 boutons" + msgid "3-axis, 4-button joystick" msgstr "Manette avec 3 axes, 4 boutons" +msgid "4-axis, 2-button joystick" +msgstr "Manette avec 4 axes, 2 boutons" + +msgid "4-axis, 3-button joystick" +msgstr "Manette avec 4 axes, 3 boutons" + msgid "4-axis, 4-button joystick" msgstr "Manette avec 4 axes, 4 boutons" +msgid "2-button gamepad(s)" +msgstr "Manette(s) de jeu à 2 boutons" + +msgid "3-button gamepad" +msgstr "Manette de jeu à 2 boutons" + +msgid "4-button gamepad" +msgstr "Manette de jeu à 4 boutons" + +msgid "6-button gamepad" +msgstr "Manette de jeu à 6 boutons" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Manette de vol à 2 boutons" + +msgid "3-button flight yoke" +msgstr "Manette de vol à 3 boutons" + +msgid "4-button flight yoke" +msgstr "Manette de vol à 4 boutons" + +msgid "2-button flight yoke with throttle" +msgstr "Manette de vol à 2 boutons avec manette des gaz" + +msgid "3-button flight yoke with throttle" +msgstr "Manette de vol à 3 boutons avec manette des gaz" + +msgid "4-button flight yoke with throttle" +msgstr "Manette de vol à 4 boutons avec manette des gaz" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volant (3 axes, 2 boutons)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volant (3 axes, 3 boutons)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volant (3 axes, 4 boutons)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Système de contrôle de vol Thrustmaster" msgid "Thrustmaster FCS + Rudder Control System" msgstr "SCV Thrustmaster + Système de commande de gouvernail" -msgid "2-button gamepad(s)" -msgstr "Manette(s) de jeu à 2 boutons" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Manette de vol à 2 boutons" - -msgid "4-button gamepad" -msgstr "Manette de jeu à 2 boutons" - -msgid "4-button flight yoke" -msgstr "Manette de vol à 4 boutons" - -msgid "2-button flight yoke with throttle" -msgstr "Manette de vol à 2 boutons avec manette des gaz" - -msgid "4-button flight yoke with throttle" -msgstr "Manette de vol à 4 boutons avec manette des gaz" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volant Win95 (3 axes, 4 boutons)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Aucun" @@ -2988,6 +3063,9 @@ msgstr "Mode d'étirement des données d'entrée d'OpenGL" msgid "Color scheme" msgstr "Palette de couleurs" +msgid "System" +msgstr "" + msgid "Light" msgstr "Lumière" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 0ea717dce..b0f5a352e 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -852,9 +852,18 @@ msgstr "Nema PCap uređaja" msgid "Invalid PCap device" msgstr "Nevažeći PCap uređaj" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Palica za igru s 2 osi, 1 tipke" + msgid "2-axis, 2-button joystick(s)" msgstr "Palica za igru s 2 osi, 2 tipke" +msgid "2-axis, 3-button joystick" +msgstr "Palica za igru s 2 osi, 3 tipke" + msgid "2-axis, 4-button joystick" msgstr "Palica za igru s 2 osi, 4 tipke" @@ -867,18 +876,99 @@ msgstr "Palica za igru s 2 osi, 8 tipke" msgid "3-axis, 2-button joystick" msgstr "Palica za igru s 3 osi, 2 tipke" +msgid "3-axis, 3-button joystick" +msgstr "Palica za igru s 3 osi, 3 tipke" + msgid "3-axis, 4-button joystick" msgstr "Palica za igru s 3 osi, 4 tipke" +msgid "4-axis, 2-button joystick" +msgstr "Palica za igru s 4 osi, 2 tipke" + +msgid "4-axis, 3-button joystick" +msgstr "Palica za igru s 4 osi, 3 tipke" + msgid "4-axis, 4-button joystick" msgstr "Palica za igru s 4 osi, 4 tipke" +msgid "2-button gamepad(s)" +msgstr "Gamepad(ovi) s 2 tipke" + +msgid "3-button gamepad" +msgstr "Gamepad s 3 tipke" + +msgid "4-button gamepad" +msgstr "Gamepad s 4 tipke" + +msgid "6-button gamepad" +msgstr "Gamepad s 6 tipke" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Jaram za letenje s 2 tipke" + +msgid "3-button flight yoke" +msgstr "Jaram za letenje s 3 tipke" + +msgid "4-button flight yoke" +msgstr "Jaram za letenje s 4 tipke" + +msgid "2-button flight yoke with throttle" +msgstr "Jaram za letenje s 2 tipke i gasom" + +msgid "3-button flight yoke with throttle" +msgstr "Jaram za letenje s 3 tipke i gasom" + +msgid "4-button flight yoke with throttle" +msgstr "Jaram za letenje s 4 tipke i gasom" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volan (3 osi, 2 tipke)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volan (3 osi, 3 tipke)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volan (3 osi, 4 tipke)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Gamepad(ovi) s 2 tipke" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Jaram za letenje s 2 tipke" - -msgid "4-button gamepad" -msgstr "Gamepad s 4 tipke" - -msgid "4-button flight yoke" -msgstr "Jaram za letenje s 4 tipke" - -msgid "2-button flight yoke with throttle" -msgstr "Jaram za letenje s 2 tipke i gasom" - -msgid "4-button flight yoke with throttle" -msgstr "Jaram za letenje s 4 tipke i gasom" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volan Win95 (3 osi, 4 tipke)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Bez" @@ -2988,6 +3063,9 @@ msgstr "Način rastezanja ulaza u OpenGL-u" msgid "Color scheme" msgstr "Shema boja" +msgid "System" +msgstr "" + msgid "Light" msgstr "Svjetlo" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index a399c59e6..7e08cf1c5 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -852,9 +852,18 @@ msgstr "Nessun dispositivo PCap trovato" msgid "Invalid PCap device" msgstr "Dispositivo PCap non valido" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Joystick a 2 assi, 1 pulsanti" + msgid "2-axis, 2-button joystick(s)" msgstr "Joystick a 2 assi, 2 pulsanti" +msgid "2-axis, 3-button joystick" +msgstr "Joystick a 2 assi, 3 pulsanti" + msgid "2-axis, 4-button joystick" msgstr "Joystick a 2 assi, 4 pulsanti" @@ -867,18 +876,99 @@ msgstr "Joystick a 2 assi, 8 pulsanti" msgid "3-axis, 2-button joystick" msgstr "Joystick a 3 assi, 2 pulsanti" +msgid "3-axis, 3-button joystick" +msgstr "Joystick a 3 assi, 4 pulsanti" + msgid "3-axis, 4-button joystick" msgstr "Joystick a 3 assi, 4 pulsanti" +msgid "4-axis, 2-button joystick" +msgstr "Joystick a 4 assi, 2 pulsanti" + +msgid "4-axis, 3-button joystick" +msgstr "Joystick a 4 assi, 3 pulsanti" + msgid "4-axis, 4-button joystick" msgstr "Joystick a 4 assi, 4 pulsanti" +msgid "2-button gamepad(s)" +msgstr "Gamepad a 2 pulsanti" + +msgid "3-button gamepad" +msgstr "Gamepad a 3 pulsanti" + +msgid "4-button gamepad" +msgstr "Gamepad a 4 pulsanti" + +msgid "6-button gamepad" +msgstr "Gamepad a 6 pulsanti" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Barra di comando a 2 pulsanti" + +msgid "3-button flight yoke" +msgstr "Barra di comando a 3 pulsanti" + +msgid "4-button flight yoke" +msgstr "Barra di comando a 4 pulsanti" + +msgid "2-button flight yoke with throttle" +msgstr "Barra di comando a 2 pulsanti con acceleratore" + +msgid "3-button flight yoke with throttle" +msgstr "Barra di comando a 4 pulsanti con acceleratore" + +msgid "4-button flight yoke with throttle" +msgstr "Barra di comando a 4 pulsanti con acceleratore" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volante (3 assi, 2 pulsanti)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volante (3 assi, 3 pulsanti)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volante (3 assi, 4 pulsanti)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + Pedali CH" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedali Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedali" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedali Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedali" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedali Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder" @@ -888,26 +978,11 @@ msgstr "Sistema di controllo Thrustmaster Flight" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Sistema di controllo timone" -msgid "2-button gamepad(s)" -msgstr "Gamepad a 2 pulsanti" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Barra di comando a 2 pulsanti" - -msgid "4-button gamepad" -msgstr "Gamepad a 4 pulsanti" - -msgid "4-button flight yoke" -msgstr "Barra di comando a 4 pulsanti" - -msgid "2-button flight yoke with throttle" -msgstr "Barra di comando a 2 pulsanti con acceleratore" - -msgid "4-button flight yoke with throttle" -msgstr "Barra di comando a 4 pulsanti con acceleratore" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volante Win95 (3 assi, 4 pulsanti)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Nessuno" @@ -2988,6 +3063,9 @@ msgstr "Modalità adattamento ingresso OpenGL" msgid "Color scheme" msgstr "Modalità colori" +msgid "System" +msgstr "" + msgid "Light" msgstr "Chiara" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 5c6aa485c..7cb67e505 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -852,9 +852,18 @@ msgstr "PCapデバイスがありません" msgid "Invalid PCap device" msgstr "不正なPCapデバイス" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "ジョイスティック(2軸、1ボタン)" + msgid "2-axis, 2-button joystick(s)" msgstr "ジョイスティック(2軸、2ボタン)" +msgid "2-axis, 3-button joystick" +msgstr "ジョイスティック(2軸、3ボタン)" + msgid "2-axis, 4-button joystick" msgstr "ジョイスティック(2軸、4ボタン)" @@ -867,18 +876,99 @@ msgstr "ジョイスティック(2軸、8ボタン)" msgid "3-axis, 2-button joystick" msgstr "ジョイスティック(3軸、2ボタン)" +msgid "3-axis, 3-button joystick" +msgstr "ジョイスティック(3軸、3ボタン)" + msgid "3-axis, 4-button joystick" msgstr "ジョイスティック(3軸、4ボタン)" +msgid "4-axis, 2-button joystick" +msgstr "ジョイスティック(4軸、2ボタン)" + +msgid "4-axis, 3-button joystick" +msgstr "ジョイスティック(4軸、3ボタン)" + msgid "4-axis, 4-button joystick" msgstr "ジョイスティック(4軸、4ボタン)" +msgid "2-button gamepad(s)" +msgstr "2ボタン式ゲームパッド" + +msgid "3-button gamepad" +msgstr "3ボタン式ゲームパッド" + +msgid "4-button gamepad" +msgstr "4ボタン式ゲームパッド" + +msgid "6-button gamepad" +msgstr "6ボタン式ゲームパッド" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2ボタン式操縦桿" + +msgid "3-button flight yoke" +msgstr "3ボタン式操縦桿" + +msgid "4-button flight yoke" +msgstr "4ボタン式操縦桿" + +msgid "2-button flight yoke with throttle" +msgstr "2ボタン式フライトヨーク(スロットル付き)" + +msgid "3-button flight yoke with throttle" +msgstr "3ボタン式フライトヨーク(スロットル付き)" + +msgid "4-button flight yoke with throttle" +msgstr "4ボタン式フライトヨーク(スロットル付き)" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "ステアリングホイール(3軸、2ボタン)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "ステアリングホイール(3軸、3ボタン)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "ステアリングホイール(3軸、4ボタン)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinderパッド" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2ボタン式ゲームパッド" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2ボタン式操縦桿" - -msgid "4-button gamepad" -msgstr "4ボタン式ゲームパッド" - -msgid "4-button flight yoke" -msgstr "4ボタン式操縦桿" - -msgid "2-button flight yoke with throttle" -msgstr "2ボタン式フライトヨーク(スロットル付き)" - -msgid "4-button flight yoke with throttle" -msgstr "4ボタン式フライトヨーク(スロットル付き)" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 ステアリングホイール(3軸、4ボタン)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "なし" @@ -2988,6 +3063,9 @@ msgstr "OpenGLの入力ストレッチモード" msgid "Color scheme" msgstr "配色" +msgid "System" +msgstr "" + msgid "Light" msgstr "光" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 4474138b2..dea008ad8 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -852,9 +852,18 @@ msgstr "PCap 장치가 없습니다" msgid "Invalid PCap device" msgstr "PCap 장치가 올바르지 않습니다" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2축, 1버튼 조이스틱" + msgid "2-axis, 2-button joystick(s)" msgstr "2축, 2버튼 조이스틱" +msgid "2-axis, 3-button joystick" +msgstr "2축, 3버튼 조이스틱" + msgid "2-axis, 4-button joystick" msgstr "2축, 4버튼 조이스틱" @@ -867,18 +876,99 @@ msgstr "2축, 8버튼 조이스틱" msgid "3-axis, 2-button joystick" msgstr "3축, 2버튼 조이스틱" +msgid "3-axis, 3-button joystick" +msgstr "3축, 3버튼 조이스틱" + msgid "3-axis, 4-button joystick" msgstr "3축, 4버튼 조이스틱" +msgid "4-axis, 2-button joystick" +msgstr "4축, 2버튼 조이스틱" + +msgid "4-axis, 3-button joystick" +msgstr "4축, 3버튼 조이스틱" + msgid "4-axis, 4-button joystick" msgstr "4축, 4버튼 조이스틱" +msgid "2-button gamepad(s)" +msgstr "2버튼 게임패드" + +msgid "3-button gamepad" +msgstr "3버튼 게임패드" + +msgid "4-button gamepad" +msgstr "4버튼 게임패드" + +msgid "6-button gamepad" +msgstr "6버튼 게임패드" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2버튼 비행 조종간" + +msgid "3-button flight yoke" +msgstr "3버튼 비행 조종간" + +msgid "4-button flight yoke" +msgstr "4버튼 비행 조종간" + +msgid "2-button flight yoke with throttle" +msgstr "2버튼 비행 조종간과 스로틀" + +msgid "3-button flight yoke with throttle" +msgstr "3버튼 비행 조종간과 스로틀" + +msgid "4-button flight yoke with throttle" +msgstr "4버튼 비행 조종간과 스로틀" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "조타륜 (3축, 2버튼)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "조타륜 (3축, 3버튼)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "조타륜 (3축, 4버튼)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2버튼 게임패드" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2버튼 비행 조종간" - -msgid "4-button gamepad" -msgstr "4버튼 게임패드" - -msgid "4-button flight yoke" -msgstr "4버튼 비행 조종간" - -msgid "2-button flight yoke with throttle" -msgstr "2버튼 비행 조종간과 스로틀" - -msgid "4-button flight yoke with throttle" -msgstr "4버튼 비행 조종간과 스로틀" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 조타륜 (3축, 4버튼)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "없음" @@ -2988,6 +3063,9 @@ msgstr "OpenGL 입력 스트레치 모드" msgid "Color scheme" msgstr "색상 구성" +msgid "System" +msgstr "" + msgid "Light" msgstr "빛" diff --git a/src/qt/languages/nb-NO.po b/src/qt/languages/nb-NO.po index 06b7a4f25..db70b8842 100644 --- a/src/qt/languages/nb-NO.po +++ b/src/qt/languages/nb-NO.po @@ -852,9 +852,18 @@ msgstr "Ingen PCap-enheter funnet" msgid "Invalid PCap device" msgstr "Ugyldig PCap-enhet" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2-akset, 1-knapps styrespak(er)" + msgid "2-axis, 2-button joystick(s)" msgstr "2-akset, 2-knapps styrespak(er)" +msgid "2-axis, 3-button joystick" +msgstr "2-akset, 3-knapps styrespak" + msgid "2-axis, 4-button joystick" msgstr "2-akset, 4-knapps styrespak" @@ -867,18 +876,99 @@ msgstr "2-akset, 8-knapps styrespak" msgid "3-axis, 2-button joystick" msgstr "3-akset, 2-knapps styrespak" +msgid "3-axis, 3-button joystick" +msgstr "3-akset, 4-knapps styrespak" + msgid "3-axis, 4-button joystick" msgstr "3-akset, 4-knapps styrespak" +msgid "4-axis, 2-button joystick" +msgstr "4-akset, 2-knapps styrespak" + +msgid "4-axis, 3-button joystick" +msgstr "4-akset, 3-knapps styrespak" + msgid "4-axis, 4-button joystick" msgstr "4-akset, 4-knapps styrespak" +msgid "2-button gamepad(s)" +msgstr "2-knapps gamepad(er)" + +msgid "3-button gamepad" +msgstr "3-knapps gamepad" + +msgid "4-button gamepad" +msgstr "4-knapps gamepad" + +msgid "6-button gamepad" +msgstr "6-knapps gamepad" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2-knapps flystyre" + +msgid "3-button flight yoke" +msgstr "3-knapps flystyre" + +msgid "4-button flight yoke" +msgstr "4-knapps flystyre" + +msgid "2-button flight yoke with throttle" +msgstr "2-knapps flystyre med gass" + +msgid "3-button flight yoke with throttle" +msgstr "3-knapps flystyre med gass" + +msgid "4-button flight yoke with throttle" +msgstr "4-knapps flystyre med gass" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Ratt (3-akset, 3-knapps)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Ratt (3-akset, 3-knapps)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Ratt (3-akset, 4-knapps)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedaler" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedaler Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedaler" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedaler Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedaler" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedaler Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedaler" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedaler Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Ror-kontrollsystem" -msgid "2-button gamepad(s)" -msgstr "2-knapps gamepad(er)" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2-knapps flystyre" - -msgid "4-button gamepad" -msgstr "4-knapps gamepad" - -msgid "4-button flight yoke" -msgstr "4-knapps flystyre" - -msgid "2-button flight yoke with throttle" -msgstr "2-knapps flystyre med gass" - -msgid "4-button flight yoke with throttle" -msgstr "4-knapps flystyre med gass" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 Ratt (3-akset, 4-knapps)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Ingen" @@ -2988,6 +3063,9 @@ msgstr "Inngangsstrekkmodus for OpenGL" msgid "Color scheme" msgstr "Fargevalg" +msgid "System" +msgstr "" + msgid "Light" msgstr "Lys" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index ee57f32a1..deb53176c 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -852,9 +852,18 @@ msgstr "Geen PCap-apparaten gevonden" msgid "Invalid PCap device" msgstr "Ongeldig PCap-apparaat" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Joystick(s) met 2 assen en 1 knoppen" + msgid "2-axis, 2-button joystick(s)" msgstr "Joystick(s) met 2 assen en 2 knoppen" +msgid "2-axis, 3-button joystick" +msgstr "Joystick met 2 assen en 3 knoppen" + msgid "2-axis, 4-button joystick" msgstr "Joystick met 2 assen en 4 knoppen" @@ -867,18 +876,99 @@ msgstr "Joystick met 2 assen en 8 knoppen" msgid "3-axis, 2-button joystick" msgstr "Joystick met 3 assen en 2 knoppen" +msgid "3-axis, 3-button joystick" +msgstr "Joystick met 3 assen en 3 knoppen" + msgid "3-axis, 4-button joystick" msgstr "Joystick met 3 assen en 4 knoppen" +msgid "4-axis, 2-button joystick" +msgstr "Joystick met 4 assen en 2 knoppen" + +msgid "4-axis, 3-button joystick" +msgstr "Joystick met 4 assen en 3 knoppen" + msgid "4-axis, 4-button joystick" msgstr "Joystick met 4 assen en 4 knoppen" +msgid "2-button gamepad(s)" +msgstr "2-knops gamepad(s)" + +msgid "3-button gamepad" +msgstr "3-knops gamepad" + +msgid "4-button gamepad" +msgstr "4-knops gamepad" + +msgid "6-button gamepad" +msgstr "6-knops gamepad" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2-knops stuurknuppel" + +msgid "3-button flight yoke" +msgstr "3-knops stuurknuppel" + +msgid "4-button flight yoke" +msgstr "4-knops stuurknuppel" + +msgid "2-button flight yoke with throttle" +msgstr "2-kops stuurknuppel met gashendel " + +msgid "3-button flight yoke with throttle" +msgstr "3-kops stuurknuppel met gashendel" + +msgid "4-button flight yoke with throttle" +msgstr "4-kops stuurknuppel met gashendel" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Stuurwiel (3 assen, 2 knoppen)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Stuurwiel (3 assen, 3 knoppen)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Stuurwiel (3 assen, 4 knoppen)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedalen" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedalen Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedalen" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedalen Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedalen" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedalen Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedalen" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedalen Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control systeem" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Roer Control Systeem" -msgid "2-button gamepad(s)" -msgstr "2-knops gamepad(s)" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2-knops stuurknuppel" - -msgid "4-button gamepad" -msgstr "4-knops gamepad" - -msgid "4-button flight yoke" -msgstr "4-knops stuurknuppel" - -msgid "2-button flight yoke with throttle" -msgstr "2-kops stuurknuppel met gashendel " - -msgid "4-button flight yoke with throttle" -msgstr "2-kops stuurknuppel met gashendel" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 Stuurwiel (3 assen, 4 knoppen)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Geen" @@ -2988,6 +3063,9 @@ msgstr "Input stretch-modus van OpenGL" msgid "Color scheme" msgstr "Kleurenschema" +msgid "System" +msgstr "" + msgid "Light" msgstr "Licht" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 4398dcafb..643957399 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -852,9 +852,18 @@ msgstr "Nie znaleziono urządzeń PCap" msgid "Invalid PCap device" msgstr "Nieprawidłowe urządzenie PCap" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Joysticki 2-osiowe, 1-przyciskowe" + msgid "2-axis, 2-button joystick(s)" msgstr "Joysticki 2-osiowe, 2-przyciskowe" +msgid "2-axis, 3-button joystick" +msgstr "Joystick 2-osiowy, 3-przyciskowy" + msgid "2-axis, 4-button joystick" msgstr "Joystick 2-osiowy, 4-przyciskowy" @@ -867,18 +876,99 @@ msgstr "Joystick 2-osiowy, 8-przyciskowy" msgid "3-axis, 2-button joystick" msgstr "Joystick 3-osiowy, 2-przyciskowy" +msgid "3-axis, 3-button joystick" +msgstr "Joystick 3-osiowy, 2-przyciskowy" + msgid "3-axis, 4-button joystick" msgstr "Joystick 3-osiowy, 4-przyciskowy" +msgid "4-axis, 2-button joystick" +msgstr "Joystick 4-osiowy, 2-przyciskowy" + +msgid "4-axis, 3-button joystick" +msgstr "Joystick 4-osiowy, 3-przyciskowy" + msgid "4-axis, 4-button joystick" msgstr "Joystick 4-osiowy, 4-przyciskowy" +msgid "2-button gamepad(s)" +msgstr "Pad(y) z dwoma przyciskami" + +msgid "3-button gamepad" +msgstr "Pad z trzy przyciskami" + +msgid "4-button gamepad" +msgstr "Pad z czterema przyciskami" + +msgid "6-button gamepad" +msgstr "Pad z sześć przyciskami" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Wolant z dwoma przyciskami" + +msgid "3-button flight yoke" +msgstr "Wolant z trzema guzikami" + +msgid "4-button flight yoke" +msgstr "Wolant z czterema przyciskami" + +msgid "2-button flight yoke with throttle" +msgstr "Wolant z dwoma przyciskami i przepustnicą" + +msgid "3-button flight yoke with throttle" +msgstr "Wolant z trzema przyciskami i przepustnicą" + +msgid "4-button flight yoke with throttle" +msgstr "Wolant z czterema przyciskami i przepustnicą" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Kierownica (3 osie, 2 przyciski)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Kierownica (3 osie, 3 przyciski)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Kierownica (3 osie, 4 przyciski)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Pad(y) z dwoma przyciskami" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Wolant z dwoma przyciskami" - -msgid "4-button gamepad" -msgstr "Pad z czterema przyciskami" - -msgid "4-button flight yoke" -msgstr "Wolant z czterema przyciskami" - -msgid "2-button flight yoke with throttle" -msgstr "Wolant z dwoma przyciskami i przepustnicą" - -msgid "4-button flight yoke with throttle" -msgstr "Wolant z czterema przyciskami i przepustnicą" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Kierownica Win95 (3 osie, 4 przyciski)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Żaden" @@ -2988,6 +3063,9 @@ msgstr "Tryb rozciągania wejściowego OpenGL" msgid "Color scheme" msgstr "Schemat kolorów" +msgid "System" +msgstr "" + msgid "Light" msgstr "Światło" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 010005780..0f9b81277 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -852,9 +852,18 @@ msgstr "Nenhum dispositivo PCap encontrado" msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Joystick(s) de 2 eixos, 1 botões" + msgid "2-axis, 2-button joystick(s)" msgstr "Joystick(s) de 2 eixos, 2 botões" +msgid "2-axis, 3-button joystick" +msgstr "Joystick de 2 eixos, 3 botões" + msgid "2-axis, 4-button joystick" msgstr "Joystick de 2 eixos, 4 botões" @@ -867,18 +876,99 @@ msgstr "Joystick de 2 eixos, 8 botões" msgid "3-axis, 2-button joystick" msgstr "Joystick de 3 eixos, 2 botões" +msgid "3-axis, 3-button joystick" +msgstr "Joystick de 3 eixos, 3 botões" + msgid "3-axis, 4-button joystick" msgstr "Joystick de 3 eixos, 4 botões" +msgid "4-axis, 2-button joystick" +msgstr "Joystick de 4 eixos, 2 botões" + +msgid "4-axis, 3-button joystick" +msgstr "Joystick de 4 eixos, 3 botões" + msgid "4-axis, 4-button joystick" msgstr "Joystick de 4 eixos, 4 botões" +msgid "2-button gamepad(s)" +msgstr "Gamepad(s) de 2 botões" + +msgid "3-button gamepad" +msgstr "Gamepad de 3 botões" + +msgid "4-button gamepad" +msgstr "Gamepad de 4 botões" + +msgid "6-button gamepad" +msgstr "Gamepad de 6 botões" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Manche de voo de 2 botões" + +msgid "3-button flight yoke" +msgstr "Manche de voo de 3 botões" + +msgid "4-button flight yoke" +msgstr "Manche de voo de 4 botões" + +msgid "2-button flight yoke with throttle" +msgstr "Manche de voo de 2 botões com acelerador" + +msgid "3-button flight yoke with throttle" +msgstr "Manche de voo de 3 botões com acelerador" + +msgid "4-button flight yoke with throttle" +msgstr "Manche de voo de 4 botões com acelerador" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volante (3 eixos, 2 botões)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volante (3 eixos, 3 botões)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volante (3 eixos, 4 botões)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + Pedais CH" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + Pedais CH Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + Pedais CH" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + Pedais CH Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + Pedais CH" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + Pedais CH Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Sistema de Controle de Voo Thrustmaster" msgid "Thrustmaster FCS + Rudder Control System" msgstr "SCV Thrustmaster + Sistema de Controle de Leme" -msgid "2-button gamepad(s)" -msgstr "Gamepad(s) de 2 botões" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Manche de voo de 2 botões" - -msgid "4-button gamepad" -msgstr "Gamepad de 4 botões" - -msgid "4-button flight yoke" -msgstr "Manche de voo de 4 botões" - -msgid "2-button flight yoke with throttle" -msgstr "Manche de voo de 2 botões com acelerador" - -msgid "4-button flight yoke with throttle" -msgstr "Manche de voo de 4 botões com acelerador" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volante Win95 (3 eixos, 4 botões)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Nenhum" @@ -2988,6 +3063,9 @@ msgstr "Modo de expansão de entrada do OpenGL" msgid "Color scheme" msgstr "Esquema de cores" +msgid "System" +msgstr "" + msgid "Light" msgstr "Claro" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index a33ba0119..9cc796af4 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -852,9 +852,18 @@ msgstr "Não foi encontrado um dispositivo PCap" msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Joystick(s) de 2 eixos, 1 botões" + msgid "2-axis, 2-button joystick(s)" msgstr "Joystick(s) de 2 eixos, 2 botões" +msgid "2-axis, 3-button joystick" +msgstr "Joystick de 2 eixos, 3 botões" + msgid "2-axis, 4-button joystick" msgstr "Joystick de 2 eixos, 4 botões" @@ -867,18 +876,99 @@ msgstr "Joystick de 2 eixos, 8 botões" msgid "3-axis, 2-button joystick" msgstr "Joystick de 3 eixos, 2 botões" +msgid "3-axis, 3-button joystick" +msgstr "Joystick de 3 eixos, 3 botões" + msgid "3-axis, 4-button joystick" msgstr "Joystick de 3 eixos, 4 botões" +msgid "4-axis, 2-button joystick" +msgstr "Joystick de 4 eixos, 2 botões" + +msgid "4-axis, 3-button joystick" +msgstr "Joystick de 4 eixos, 3 botões" + msgid "4-axis, 4-button joystick" msgstr "Joystick de 4 eixos, 4 botões" +msgid "2-button gamepad(s)" +msgstr "Manípulo(s) de jogos de 2 botões" + +msgid "3-button gamepad" +msgstr "Manípulo(s) de jogos de 3 botões" + +msgid "4-button gamepad" +msgstr "Manípulo(s) de jogos de 4 botões" + +msgid "6-button gamepad" +msgstr "Manípulo(s) de jogos de 6 botões" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Manípulo de voo de 2 botões" + +msgid "3-button flight yoke" +msgstr "Manípulo de voo de 2 botões" + +msgid "4-button flight yoke" +msgstr "Manípulo de voo de 4 botões" + +msgid "2-button flight yoke with throttle" +msgstr "Manípulo de voo de 2 botões com acelerador" + +msgid "3-button flight yoke with throttle" +msgstr "Manípulo de voo de 3 botões com acelerador" + +msgid "4-button flight yoke with throttle" +msgstr "Manípulo de voo de 4 botões com acelerador" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volante (de 3 eixos, 2 botões)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volante (de 3 eixos, 3 botões)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volante (de 3 eixos, 4 botões)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Manípulo(s) de jogos de 2 botões" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Manípulo de voo de 2 botões" - -msgid "4-button gamepad" -msgstr "Manípulo(s) de jogos de 4 botões" - -msgid "4-button flight yoke" -msgstr "Manípulo de voo de 4 botões" - -msgid "2-button flight yoke with throttle" -msgstr "Manípulo de voo de 2 botões com acelerador" - -msgid "4-button flight yoke with throttle" -msgstr "Manípulo de voo de 4 botões com acelerador" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volante Win95 (de 3 eixos, 4 botões)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Nenhum" @@ -2988,6 +3063,9 @@ msgstr "Modo de expansão de entrada do OpenGL" msgid "Color scheme" msgstr "Esquema de cores" +msgid "System" +msgstr "" + msgid "Light" msgstr "Claro" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 2d71499dc..cd0c70e51 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -852,9 +852,18 @@ msgstr "Устройства PCap не найдены" msgid "Invalid PCap device" msgstr "Неверное устройство PCap" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2-осевой, 1-кнопочный джойстик" + msgid "2-axis, 2-button joystick(s)" msgstr "2-осевой, 2-кнопочный джойстик" +msgid "2-axis, 3-button joystick" +msgstr "2-осевой, 3-кнопочный джойстик" + msgid "2-axis, 4-button joystick" msgstr "2-осевой, 4-кнопочный джойстик" @@ -867,18 +876,99 @@ msgstr "2-осевой, 8-кнопочный джойстик" msgid "3-axis, 2-button joystick" msgstr "3-осевой, 2-кнопочный джойстик" +msgid "3-axis, 3-button joystick" +msgstr "3-осевой, 3-кнопочный джойстик" + msgid "3-axis, 4-button joystick" msgstr "3-осевой, 4-кнопочный джойстик" +msgid "4-axis, 2-button joystick" +msgstr "4-осевой, 2-кнопочный джойстик" + +msgid "4-axis, 3-button joystick" +msgstr "4-осевой, 3-кнопочный джойстик" + msgid "4-axis, 4-button joystick" msgstr "4-осевой, 4-кнопочный джойстик" +msgid "2-button gamepad(s)" +msgstr "2-кнопочный геймпад" + +msgid "3-button gamepad" +msgstr "3-кнопочный геймпад" + +msgid "4-button gamepad" +msgstr "4-кнопочный геймпад" + +msgid "6-button gamepad" +msgstr "6-кнопочный геймпад" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2-кнопочный flight yoke" + +msgid "3-button flight yoke" +msgstr "3-кнопочный flight yoke" + +msgid "4-button flight yoke" +msgstr "4-кнопочный flight yoke" + +msgid "2-button flight yoke with throttle" +msgstr "2-кнопочный flight yoke с дросселем" + +msgid "3-button flight yoke with throttle" +msgstr "3-кнопочный flight yoke с дросселем" + +msgid "4-button flight yoke with throttle" +msgstr "4-кнопочный flight yoke с дросселем" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Руль (3-осевой, 2-кнопочный)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Руль (3-осевой, 3-кнопочный)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Руль (3-осевой, 4-кнопочный)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Педали" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Педали Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Педали" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Педали Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Педали" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Педали Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Педали" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Педали Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Система управления полётом Thrustmaster" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Система управления рулем" -msgid "2-button gamepad(s)" -msgstr "2-кнопочный геймпад" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2-кнопочный flight yoke" - -msgid "4-button gamepad" -msgstr "4-кнопочный геймпад" - -msgid "4-button flight yoke" -msgstr "4-кнопочный flight yoke" - -msgid "2-button flight yoke with throttle" -msgstr "2-кнопочный flight yoke с дросселем" - -msgid "4-button flight yoke with throttle" -msgstr "4-кнопочный flight yoke с дросселем" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Руль Win95 (3-осевой, 4-кнопочный)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Нет" @@ -2988,6 +3063,9 @@ msgstr "Режим растяжения ввода OpenGL" msgid "Color scheme" msgstr "Цветовая схема" +msgid "System" +msgstr "" + msgid "Light" msgstr "Светлая" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 436c8c674..c0230ea6d 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -852,9 +852,18 @@ msgstr "Neboli nájdené žiadne PCap zariadenia" msgid "Invalid PCap device" msgstr "Neplatné PCap zariadenie" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2-osový, 1-tlačidlový joystick" + msgid "2-axis, 2-button joystick(s)" msgstr "2-osový, 2-tlačidlový joystick" +msgid "2-axis, 3-button joystick" +msgstr "2-osový, 4-tlačidlový joystick" + msgid "2-axis, 4-button joystick" msgstr "2-osový, 4-tlačidlový joystick" @@ -867,18 +876,99 @@ msgstr "2-osový, 8-tlačidlový joystick" msgid "3-axis, 2-button joystick" msgstr "3-osový, 2-tlačidlový joystick" +msgid "3-axis, 3-button joystick" +msgstr "3-osový, 3-tlačidlový joystick" + msgid "3-axis, 4-button joystick" msgstr "3-osový, 4-tlačidlový joystick" +msgid "4-axis, 2-button joystick" +msgstr "4-osový, 2-tlačidlový joystick" + +msgid "4-axis, 3-button joystick" +msgstr "4-osový, 3-tlačidlový joystick" + msgid "4-axis, 4-button joystick" msgstr "4-osový, 4-tlačidlový joystick" +msgid "2-button gamepad(s)" +msgstr "Ovládač s 2 tlačidlami" + +msgid "3-button gamepad" +msgstr "Ovládač so 3 tlačidlami" + +msgid "4-button gamepad" +msgstr "Ovládač so 4 tlačidlami" + +msgid "6-button gamepad" +msgstr "Ovládač so 6 tlačidlami" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Letecký knipl s 2 tlačidlami" + +msgid "3-button flight yoke" +msgstr "Letecký knipl s 3 tlačidlami" + +msgid "4-button flight yoke" +msgstr "Letecký knipl so 4 tlačidlami" + +msgid "2-button flight yoke with throttle" +msgstr "Letecký knipl s 2 tlačidlami a pákou" + +msgid "3-button flight yoke with throttle" +msgstr "Letecký knipl s 3 tlačidlami a pákou" + +msgid "4-button flight yoke with throttle" +msgstr "Letecký knipl s 4 tlačidlami a pákou" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volant (3 osy, 2 tlačítka)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volant (3 osy, 3 tlačítka)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volant (3 osy, 4 tlačítka)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Ovládač s 2 tlačidlami" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Letecký knipl s 2 tlačidlami" - -msgid "4-button gamepad" -msgstr "Ovládač so 4 tlačidlami" - -msgid "4-button flight yoke" -msgstr "Letecký knipl so 4 tlačidlami" - -msgid "2-button flight yoke with throttle" -msgstr "Letecký knipl s 2 tlačidlami a pákou" - -msgid "4-button flight yoke with throttle" -msgstr "Letecký knipl s 4 tlačidlami a pákou" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volant pre Windows 95 (3 osy, 4 tlačítka)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Žiadne" @@ -2988,6 +3063,9 @@ msgstr "Režim rozťahovania vstupu OpenGL" msgid "Color scheme" msgstr "Farebná schéma" +msgid "System" +msgstr "" + msgid "Light" msgstr "Svetlo" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 8ef710a15..81026fe06 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -852,9 +852,18 @@ msgstr "Najdena ni bila nobena naprava PCap" msgid "Invalid PCap device" msgstr "Neveljavna naprava PCap" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Igralna palica z 2 osema, 1 gumboma" + msgid "2-axis, 2-button joystick(s)" msgstr "Igralna palica z 2 osema, 2 gumboma" +msgid "2-axis, 3-button joystick" +msgstr "Igralna palica z 2 osema, 3 gumbi" + msgid "2-axis, 4-button joystick" msgstr "Igralna palica z 2 osema, 4 gumbi" @@ -865,20 +874,101 @@ msgid "2-axis, 8-button joystick" msgstr "Igralna palica z 2 osema, 8 gumbi" msgid "3-axis, 2-button joystick" -msgstr "Igralna palica s 3 osmi, 2 gumboma" +msgstr "Igralna palica s 3 osmi, 2 gumbi" + +msgid "3-axis, 3-button joystick" +msgstr "Igralna palica s 3 osmi, 3 gumbi" msgid "3-axis, 4-button joystick" msgstr "Igralna palica s 3 osmi, 4 gumbi" +msgid "4-axis, 2-button joystick" +msgstr "Igralna palica s 4 osmi, 2 gumbi" + +msgid "4-axis, 3-button joystick" +msgstr "Igralna palica s 4 osmi, 3 gumbi" + msgid "4-axis, 4-button joystick" msgstr "Igralna palica s 4 osmi, 4 gumbi" +msgid "2-button gamepad(s)" +msgstr "Igralna ploščica z 2 gumboma" + +msgid "3-button gamepad" +msgstr "Igralna ploščica s 3 gumbi" + +msgid "4-button gamepad" +msgstr "Igralna ploščica s 4 gumbi" + +msgid "6-button gamepad" +msgstr "Igralna ploščica s 6 gumbi" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Letalski krmilni drog z 2 gumbi" + +msgid "3-button flight yoke" +msgstr "Letalski krmilni drog z 3 gumbi" + +msgid "4-button flight yoke" +msgstr "Letalski krmilni drog s 4 gumbi" + +msgid "2-button flight yoke with throttle" +msgstr "Letalski krmilni drog z 2 gumbi gumboma ročico za plin" + +msgid "3-button flight yoke with throttle" +msgstr "Letalski krmilni drog s 3 gumbi z ročico za plin" + +msgid "4-button flight yoke with throttle" +msgstr "Letalski krmilni drog s 4 gumbi z ročico za plin" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Volan s 3 osmi, 2 gumbi" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Volan s 3 osmi, 3 gumbi" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Volan s 3 osmi, 4 gumbi" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Igralna ploščica z 2 gumboma" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Letalski krmilni drog z 2 gumbi" - -msgid "4-button gamepad" -msgstr "Igralna ploščica s 4 gumbi" - -msgid "4-button flight yoke" -msgstr "Letalski krmilni drog s 4 gumbi" - -msgid "2-button flight yoke with throttle" -msgstr "Letalski krmilni drog z 2 gumbi gumboma ročico za plin" - -msgid "4-button flight yoke with throttle" -msgstr "Letalski krmilni drog s 4 gumbi z ročico za plin" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Volan Win95 s 3 osmi, 4 gumbi" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Brez" @@ -2988,6 +3063,9 @@ msgstr "Način raztezanja vhoda OpenGL" msgid "Color scheme" msgstr "Barvna shema" +msgid "System" +msgstr "" + msgid "Light" msgstr "Svetloba" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index 6f014e2dd..a04c58265 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -852,9 +852,18 @@ msgstr "Inga PCap-enheter hittade" msgid "Invalid PCap device" msgstr "Ogiltig PCap-enhet" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Styrspak med 2 axlar och 1 knappar" + msgid "2-axis, 2-button joystick(s)" msgstr "Styrspak med 2 axlar och 2 knappar" +msgid "2-axis, 3-button joystick" +msgstr "Styrspak med 2 axlar och 3 knappar" + msgid "2-axis, 4-button joystick" msgstr "Styrspak med 2 axlar och 4 knappar" @@ -867,18 +876,99 @@ msgstr "Styrspak med 2 axlar och 8 knappar" msgid "3-axis, 2-button joystick" msgstr "Styrspak med 3 axlar och 2 knappar" +msgid "3-axis, 3-button joystick" +msgstr "Styrspak med 3 axlar och 2 knappar" + msgid "3-axis, 4-button joystick" msgstr "Styrspak med 3 axlar och 4 knappar" +msgid "4-axis, 2-button joystick" +msgstr "Styrspak med 4 axlar och 2 knappar" + +msgid "4-axis, 3-button joystick" +msgstr "Styrspak med 4 axlar och 3 knappar" + msgid "4-axis, 4-button joystick" msgstr "Styrspak med 4 axlar och 4 knappar" +msgid "2-button gamepad(s)" +msgstr "Handkontroll(er) med två knappar" + +msgid "3-button gamepad" +msgstr "Handkontroll med tre knappar" + +msgid "4-button gamepad" +msgstr "Handkontroll med fyra knappar" + +msgid "6-button gamepad" +msgstr "Handkontroll med sex knappar" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Styrspak med två knappar" + +msgid "3-button flight yoke" +msgstr "Styrspak med tre knappar" + +msgid "4-button flight yoke" +msgstr "Styrspak med fyra knappar" + +msgid "2-button flight yoke with throttle" +msgstr "Styrspak med två knappar och gas" + +msgid "3-button flight yoke with throttle" +msgstr "Styrspak med tre knappar och gas" + +msgid "4-button flight yoke with throttle" +msgstr "Styrspak med fyra knappar och gas" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "ratt (tre axlar, två knappar)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "ratt (tre axlar, tre knappar)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "ratt (tre axlar, fyra knappar)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH-pedaler" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH-pedaler Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH-pedaler" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH-pedaler Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH-pedaler" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH-pedaler Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH-pedaler" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH-pedaler Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "Handkontroll(er) med två knappar" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Styrspak med två knappar" - -msgid "4-button gamepad" -msgstr "Handkontroll med fyra knappar" - -msgid "4-button flight yoke" -msgstr "Styrspak med fyra knappar" - -msgid "2-button flight yoke with throttle" -msgstr "Styrspak med två knappar och gas" - -msgid "4-button flight yoke with throttle" -msgstr "Styrspak med fyra knappar och gas" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95-ratt (tre axlar, fyra knappar)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Ingen" @@ -2988,6 +3063,9 @@ msgstr "Inmatningssträckningsläge för OpenGL" msgid "Color scheme" msgstr "Färgschema" +msgid "System" +msgstr "" + msgid "Light" msgstr "Ljus" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 073572e1b..43f52d394 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -852,9 +852,18 @@ msgstr "Herhangi bir PCap cihazı bulunamadı" msgid "Invalid PCap device" msgstr "Geçersiz PCap cihazı" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2 eksenli, 1 düğmeli oyun kolları" + msgid "2-axis, 2-button joystick(s)" msgstr "2 eksenli, 2 düğmeli oyun kolları" +msgid "2-axis, 3-button joystick" +msgstr "2 eksenli, 3 düğmeli oyun kolu" + msgid "2-axis, 4-button joystick" msgstr "2 eksenli, 4 düğmeli oyun kolu" @@ -867,18 +876,99 @@ msgstr "2 eksenli, 8 düğmeli oyun kolu" msgid "3-axis, 2-button joystick" msgstr "3 eksenli, 2 düğmeli oyun kollu" +msgid "3-axis, 3-button joystick" +msgstr "3 eksenli, 3 düğmeli oyun kolu" + msgid "3-axis, 4-button joystick" msgstr "3 eksenli, 4 düğmeli oyun kolu" +msgid "4-axis, 2-button joystick" +msgstr "4 eksenli, 2 düğmeli oyun kolu" + +msgid "4-axis, 3-button joystick" +msgstr "4 eksenli, 3 düğmeli oyun kolu" + msgid "4-axis, 4-button joystick" msgstr "4 eksenli, 4 düğmeli oyun kolu" +msgid "2-button gamepad(s)" +msgstr "2 düğmeli oyun tablası" + +msgid "3-button gamepad" +msgstr "3 düğmeli oyun tablası" + +msgid "4-button gamepad" +msgstr "4 düğmeli oyun tablası" + +msgid "6-button gamepad" +msgstr "6 düğmeli oyun tablası" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2 düğmeli uçuş dümeni" + +msgid "3-button flight yoke" +msgstr "3 düğmeli uçuş dümeni" + +msgid "4-button flight yoke" +msgstr "4 düğmeli uçuş dümeni" + +msgid "2-button flight yoke with throttle" +msgstr "2 düğmeli, gaz kollu uçuş dümeni" + +msgid "3-button flight yoke with throttle" +msgstr "3 düğmeli, gaz kollu uçuş dümeni" + +msgid "4-button flight yoke with throttle" +msgstr "4 düğmeli, gaz kollu uçuş dümeni" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "direksiyonu (3 eksenli, 2 düğmeli)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "direksiyonu (3 eksenli, 3 düğmeli)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "direksiyonu (3 eksenli, 4 düğmeli)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2 düğmeli oyun tablası" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2 düğmeli uçuş dümeni" - -msgid "4-button gamepad" -msgstr "4 düğmeli oyun tablası" - -msgid "4-button flight yoke" -msgstr "4 düğmeli uçuş dümeni" - -msgid "2-button flight yoke with throttle" -msgstr "2 düğmeli, gaz kollu uçuş dümeni" - -msgid "4-button flight yoke with throttle" -msgstr "4 düğmeli, gaz kollu uçuş dümeni" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 direksiyonu (3 eksenli, 4 düğmeli)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Hiçbiri" @@ -2988,6 +3063,9 @@ msgstr "OpenGL'nin giriş germe modu" msgid "Color scheme" msgstr "Renk şeması" +msgid "System" +msgstr "" + msgid "Light" msgstr "Işık" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 8228b7ae4..473030341 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -852,9 +852,18 @@ msgstr "Пристрої PCap не знайдені" msgid "Invalid PCap device" msgstr "Невірний пристрій PCap" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2-осьовий, 1-кнопковий джойстик" + msgid "2-axis, 2-button joystick(s)" msgstr "2-осьовий, 2-кнопковий джойстик" +msgid "2-axis, 3-button joystick" +msgstr "2-осьовий, 3-кнопковий джойстик" + msgid "2-axis, 4-button joystick" msgstr "2-осьовий, 4-кнопковий джойстик" @@ -867,18 +876,99 @@ msgstr "2-осьовий, 8-кнопковий джойстик" msgid "3-axis, 2-button joystick" msgstr "3-осьовий, 2-кнопковий джойстик" +msgid "3-axis, 3-button joystick" +msgstr "3-осьовий, 3-кнопковий джойстик" + msgid "3-axis, 4-button joystick" msgstr "3-осьовий, 4-кнопковий джойстик" +msgid "4-axis, 2-button joystick" +msgstr "4-осьовий, 2-кнопковий джойстик" + +msgid "4-axis, 3-button joystick" +msgstr "4-осьовий, 3-кнопковий джойстик" + msgid "4-axis, 4-button joystick" msgstr "4-осьовий, 4-кнопковий джойстик" +msgid "2-button gamepad(s)" +msgstr "2-кнопковий геймпад" + +msgid "3-button gamepad" +msgstr "3-кнопковий геймпад" + +msgid "4-button gamepad" +msgstr "4-кнопковий геймпад" + +msgid "6-button gamepad" +msgstr "6-кнопковий геймпад" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2-кнопковий flight yoke" + +msgid "3-button flight yoke" +msgstr "3-кнопковий геймпад" + +msgid "4-button flight yoke" +msgstr "4-кнопковий flight yoke" + +msgid "2-button flight yoke with throttle" +msgstr "2-кнопковий flight yoke з дроселем" + +msgid "3-button flight yoke with throttle" +msgstr "3-кнопковий flight yoke з дроселем" + +msgid "4-button flight yoke with throttle" +msgstr "4-кнопковий flight yoke з дроселем" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Кермо (3-осьове, 2-кнопкове)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Кермо (3-осьове, 3-кнопкове)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Кермо (3-осьове, 4-кнопкове)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Педалі" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Педалі Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Педалі" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Педалі Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Педалі" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Педалі Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Педалі" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Педалі Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Система управління польотом Thrustmaster" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Система управління кермом" -msgid "2-button gamepad(s)" -msgstr "4-кнопковий геймпад" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2-кнопковий flight yoke" - -msgid "4-button gamepad" -msgstr "4-кнопковий геймпад" - -msgid "4-button flight yoke" -msgstr "4-кнопковий flight yoke" - -msgid "2-button flight yoke with throttle" -msgstr "2-кнопковий flight yoke з дроселем" - -msgid "4-button flight yoke with throttle" -msgstr "4-кнопковий flight yoke з дроселем" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Кермо Win95 (3-осьове, 4-кнопкове)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Ні" @@ -2988,6 +3063,9 @@ msgstr "Режим розтягування вхідних даних OpenGL" msgid "Color scheme" msgstr "Колірна гамма" +msgid "System" +msgstr "" + msgid "Light" msgstr "Світло" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 24decb522..41f6d056e 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -852,9 +852,18 @@ msgstr "Không tìm thấy thiết bị PCap" msgid "Invalid PCap device" msgstr "Thiết bị PCap không hợp quy" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Cần điều khiển hai trục, một nút" + msgid "2-axis, 2-button joystick(s)" msgstr "Cần điều khiển hai trục, hai nút" +msgid "2-axis, 3-button joystick" +msgstr "Cần điều khiển hai trục, ba nút" + msgid "2-axis, 4-button joystick" msgstr "Cần điều khiển hai trục, bốn nút" @@ -867,18 +876,99 @@ msgstr "Cần điều khiển hai trục, tám nút" msgid "3-axis, 2-button joystick" msgstr "Cần điều khiển ba trục, hai nút" +msgid "3-axis, 3-button joystick" +msgstr "Cần điều khiển ba trục, ba nút" + msgid "3-axis, 4-button joystick" msgstr "Cần điều khiển ba trục, bốn nút" +msgid "4-axis, 2-button joystick" +msgstr "Cần điều khiển bốn trục, hai nút" + +msgid "4-axis, 3-button joystick" +msgstr "Cần điều khiển bốn trục, ba nút" + msgid "4-axis, 4-button joystick" msgstr "Cần điều khiển bốn trục, bốn nút" +msgid "2-button gamepad(s)" +msgstr "Tay cầm game hai nút" + +msgid "3-button gamepad" +msgstr "Tay cầm game ba nút" + +msgid "4-button gamepad" +msgstr "Tay cầm game bốn nút" + +msgid "6-button gamepad" +msgstr "Tay cầm game sáu nút" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "Vô lăng máy bay hai nút" + +msgid "3-button flight yoke" +msgstr "Vô lăng máy bay ba nút" + +msgid "4-button flight yoke" +msgstr "Vô lăng máy bay bốn nút" + +msgid "2-button flight yoke with throttle" +msgstr "Vô lăng máy bay hai nút có cần ga" + +msgid "3-button flight yoke with throttle" +msgstr "Vô lăng máy bay ba nút có cần ga" + +msgid "4-button flight yoke with throttle" +msgstr "Vô lăng máy bay bốn nút có cần ga" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "Vô lăng (ba trục, hai nút)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "Vô lăng (ba trục, ba nút)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "Vô lăng (ba trục, bốn nút)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + bàn giậm CH" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + bàn giậm CH Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + bàn giậm CH" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + bàn giậm CH Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + bàn giậm CH" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + bàn giậm CH Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + bàn giậm CH" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + bàn giậm CH Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Hệ thống bánh lái" -msgid "2-button gamepad(s)" -msgstr "Tay cầm game hai nút" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "Vô lăng máy bay hai nút" - -msgid "4-button gamepad" -msgstr "Tay cầm game bốn nút" - -msgid "4-button flight yoke" -msgstr "Vô lăng máy bay bốn nút" - -msgid "2-button flight yoke with throttle" -msgstr "Vô lăng máy bay hai nút có cần ga" - -msgid "4-button flight yoke with throttle" -msgstr "Vô lăng máy bay bốn nút có cần ga" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Vô lăng Win95 (ba trục, bốn nút)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "Không có" @@ -2988,6 +3063,9 @@ msgstr "Chế độ kéo giãn đầu vào của OpenGL" msgid "Color scheme" msgstr "Bảng màu" +msgid "System" +msgstr "" + msgid "Light" msgstr "Ánh sáng" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 48ffc0dc9..0014af5cd 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -852,9 +852,18 @@ msgstr "未找到 PCap 设备" msgid "Invalid PCap device" msgstr "无效 PCap 设备" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2 轴, 1 键操纵杆" + msgid "2-axis, 2-button joystick(s)" msgstr "2 轴, 2 键操纵杆" +msgid "2-axis, 3-button joystick" +msgstr "2 轴, 3 键操纵杆" + msgid "2-axis, 4-button joystick" msgstr "2 轴, 4 键操纵杆" @@ -867,18 +876,99 @@ msgstr "2 轴, 8 键操纵杆" msgid "3-axis, 2-button joystick" msgstr "3 轴, 2 键操纵杆" +msgid "3-axis, 3-button joystick" +msgstr "3 轴, 3 键操纵杆" + msgid "3-axis, 4-button joystick" msgstr "3 轴, 4 键操纵杆" +msgid "4-axis, 2-button joystick" +msgstr "4 轴, 2 键操纵杆" + +msgid "4-axis, 3-button joystick" +msgstr "4 轴, 3 键操纵杆" + msgid "4-axis, 4-button joystick" msgstr "4 轴, 4 键操纵杆" +msgid "2-button gamepad(s)" +msgstr "2 按钮游戏手柄" + +msgid "3-button gamepad" +msgstr "3 按钮游戏手柄" + +msgid "4-button gamepad" +msgstr "4 按钮游戏手柄" + +msgid "6-button gamepad" +msgstr "6 按钮游戏手柄" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2 按钮飞行摇杆" + +msgid "3-button flight yoke" +msgstr "3 按钮飞行摇杆" + +msgid "4-button flight yoke" +msgstr "4 按钮飞行摇杆" + +msgid "2-button flight yoke with throttle" +msgstr "2 按钮带油门飞行摇杆" + +msgid "3-button flight yoke with throttle" +msgstr "3 按钮带油门飞行摇杆" + +msgid "4-button flight yoke with throttle" +msgstr "4 按钮带油门飞行摇杆" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "方向盘 (3 轴, 2 键)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "方向盘 (3 轴, 3 键)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "方向盘 (3 轴, 4 键)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2 按钮游戏手柄" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2 按钮飞行摇杆" - -msgid "4-button gamepad" -msgstr "4 按钮游戏手柄" - -msgid "4-button flight yoke" -msgstr "4 按钮飞行摇杆" - -msgid "2-button flight yoke with throttle" -msgstr "2 按钮带油门飞行摇杆" - -msgid "4-button flight yoke with throttle" -msgstr "4 按钮带油门飞行摇杆" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 方向盘 (3 轴, 4 键)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "无" @@ -2988,6 +3063,9 @@ msgstr "OpenGL的输入拉伸模式" msgid "Color scheme" msgstr "配色方案" +msgid "System" +msgstr "" + msgid "Light" msgstr "亮色" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 1732cb914..94b0c2918 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -852,9 +852,18 @@ msgstr "未找到 PCap 裝置" msgid "Invalid PCap device" msgstr "無效 PCap 裝置" +msgid "Generic Paddle Controller(s)" +msgstr "" + +msgid "2-axis, 1-button joystick(s)" +msgstr "2 軸, 1 鍵搖桿" + msgid "2-axis, 2-button joystick(s)" msgstr "2 軸, 2 鍵搖桿" +msgid "2-axis, 3-button joystick" +msgstr "2 軸, 3 鍵搖桿" + msgid "2-axis, 4-button joystick" msgstr "2 軸, 4 鍵搖桿" @@ -867,18 +876,99 @@ msgstr "2 軸, 8 鍵搖桿" msgid "3-axis, 2-button joystick" msgstr "3 軸, 2 鍵搖桿" +msgid "3-axis, 3-button joystick" +msgstr "3 軸, 3 鍵搖桿" + msgid "3-axis, 4-button joystick" msgstr "3 軸, 4 鍵搖桿" +msgid "4-axis, 2-button joystick" +msgstr "4 軸, 2 鍵搖桿" + +msgid "4-axis, 3-button joystick" +msgstr "4 軸, 3 鍵搖桿" + msgid "4-axis, 4-button joystick" msgstr "4 軸, 4 鍵搖桿" +msgid "2-button gamepad(s)" +msgstr "2 鍵遊戲手柄" + +msgid "3-button gamepad" +msgstr "3 鍵遊戲手柄" + +msgid "4-button gamepad" +msgstr "4 鍵遊戲手柄" + +msgid "6-button gamepad" +msgstr "6 鍵遊戲手柄" + +msgid "Gravis PC GamePad" +msgstr "Gravis PC GamePad" + +msgid "2-button flight yoke" +msgstr "2 按鈕飛行搖桿" + +msgid "3-button flight yoke" +msgstr "3 按鈕飛行搖桿" + +msgid "4-button flight yoke" +msgstr "4 按鈕飛行搖桿" + +msgid "2-button flight yoke with throttle" +msgstr "2 按鈕帶油門飛行搖桿" + +msgid "3-button flight yoke with throttle" +msgstr "3 按鈕帶油門飛行搖桿" + +msgid "4-button flight yoke with throttle" +msgstr "4 按鈕帶油門飛行搖桿" + +msgid "Steering Wheel (3-axis, 2-button)" +msgstr "方向盤 (3 軸, 2 鍵搖桿)" + +msgid "Steering Wheel (3-axis, 3-button)" +msgstr "方向盤 (3 軸, 3 鍵搖桿)" + +msgid "Steering Wheel (3-axis, 4-button)" +msgstr "方向盤 (3 軸, 4 鍵搖桿)" + +msgid "CH Flightstick" +msgstr "CH Flightstick" + +msgid "CH Flightstick + CH Pedals" +msgstr "CH Flightstick + CH Pedals" + +msgid "CH Flightstick + CH Pedals Pro" +msgstr "CH Flightstick + CH Pedals Pro" + msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" msgid "CH Flightstick Pro + CH Pedals" msgstr "CH Flightstick Pro + CH Pedals" +msgid "CH Flightstick Pro + CH Pedals Pro" +msgstr "CH Flightstick Pro + CH Pedals Pro" + +msgid "CH Virtual Pilot" +msgstr "CH Virtual Pilot" + +msgid "CH Virtual Pilot + CH Pedals" +msgstr "CH Virtual Pilot + CH Pedals" + +msgid "CH Virtual Pilot + CH Pedals Pro" +msgstr "CH Virtual Pilot + CH Pedals Pro" + +msgid "CH Virtual Pilot Pro" +msgstr "CH Virtual Pilot Pro" + +msgid "CH Virtual Pilot Pro + CH Pedals" +msgstr "CH Virtual Pilot Pro + CH Pedals" + +msgid "CH Virtual Pilot Pro + CH Pedals Pro" +msgstr "CH Virtual Pilot Pro + CH Pedals Pro" + msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" @@ -888,26 +978,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "2-button gamepad(s)" -msgstr "2 鍵遊戲手柄" +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 with Adaptor" -msgid "2-button flight yoke" -msgstr "2 按鈕飛行搖桿" - -msgid "4-button gamepad" -msgstr "4 鍵遊戲手柄" - -msgid "4-button flight yoke" -msgstr "4 按鈕飛行搖桿" - -msgid "2-button flight yoke with throttle" -msgstr "2 按鈕帶油門飛行搖桿" - -msgid "4-button flight yoke with throttle" -msgstr "4 按鈕帶油門飛行搖桿" - -msgid "Win95 Steering Wheel (3-axis, 4-button)" -msgstr "Win95 方向盤 (3 軸, 4 鍵搖桿)" +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 without Adaptor" msgid "None" msgstr "無" @@ -2988,6 +3063,9 @@ msgstr "OpenGL 的輸入拉伸模式" msgid "Color scheme" msgstr "配色方案" +msgid "System" +msgstr "" + msgid "Light" msgstr "亮色" From fab6e92d0e3bd382183a966fcf6df7c9de4f9a0d Mon Sep 17 00:00:00 2001 From: Verloren50000 <110334428+Verloren50000@users.noreply.github.com> Date: Tue, 21 Oct 2025 09:38:36 +0800 Subject: [PATCH 035/113] Align array entries for ABit AB-LX6 Align array entries for ABit AB-LX6 in m_at_slot1.c --- src/machine/m_at_slot1.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index a89044af7..0b57b135c 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -168,7 +168,8 @@ static const device_config_t lx6_config[] = { .bios = { { .name = "Award Modular BIOS v4.51PG - Revision LY", - .internal_name = "lx6", .bios_type = BIOS_NORMAL, + .internal_name = "lx6", + .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 131072, From 0bf8d7583403d821b0e984365a35468035223dfd Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 11 Oct 2025 22:30:05 -0400 Subject: [PATCH 036/113] Fix POV hat config code --- src/config.c | 65 +++++++++++++++++++++++-------------- src/qt/qt_settingsinput.cpp | 18 +++++----- 2 files changed, 49 insertions(+), 34 deletions(-) diff --git a/src/config.c b/src/config.c index a06d9e8b4..590ba8119 100644 --- a/src/config.c +++ b/src/config.c @@ -569,6 +569,7 @@ load_input_devices(void) { ini_section_t cat = ini_find_section(config, "Input devices"); char temp[512]; + char tmp2[32]; char *p; p = ini_section_get_string(cat, "keyboard_type", NULL); @@ -646,18 +647,25 @@ load_input_devices(void) joystick_state[gp][js].plat_joystick_nr = ini_section_get_int(cat, temp, 0); if (joystick_state[gp][js].plat_joystick_nr) { + // --- Load Axis Mappings --- for (int axis_nr = 0; axis_nr < joystick_get_axis_count(joystick_type[joy_insn]); axis_nr++) { sprintf(temp, "joystick_%i_axis_%i", js, axis_nr); joystick_state[gp][js].axis_mapping[axis_nr] = ini_section_get_int(cat, temp, axis_nr); } + + // --- Load Button Mappings --- for (int button_nr = 0; button_nr < joystick_get_button_count(joystick_type[joy_insn]); button_nr++) { sprintf(temp, "joystick_%i_button_%i", js, button_nr); joystick_state[gp][js].button_mapping[button_nr] = ini_section_get_int(cat, temp, button_nr); } + + // --- Load POV (Hat Switch) Mappings --- for (int pov_nr = 0; pov_nr < joystick_get_pov_count(joystick_type[joy_insn]); pov_nr++) { sprintf(temp, "joystick_%i_pov_%i", js, pov_nr); - p = ini_section_get_string(cat, temp, "0, 0"); - joystick_state[gp][js].pov_mapping[pov_nr][0] = joystick_state[gp][js].pov_mapping[pov_nr][1] = 0; + sprintf(tmp2, "%i, %i", 0, 0); + p = ini_section_get_string(cat, temp, tmp2); + joystick_state[gp][js].pov_mapping[pov_nr][0] = 0; + joystick_state[gp][js].pov_mapping[pov_nr][1] = 0; sscanf(p, "%i, %i", &joystick_state[gp][js].pov_mapping[pov_nr][0], &joystick_state[gp][js].pov_mapping[pov_nr][1]); } @@ -2702,7 +2710,7 @@ save_input_devices(void) { ini_section_t cat = ini_find_or_create_section(config, "Input devices"); char temp[512]; - char tmp2[512]; + char tmp2[32]; ini_section_set_string(cat, "keyboard_type", keyboard_get_internal_name(keyboard_type)); @@ -2713,20 +2721,25 @@ save_input_devices(void) ini_section_delete_var(cat, "joystick_type"); for (int js = 0; js < MAX_PLAT_JOYSTICKS; js++) { - sprintf(tmp2, "joystick_%i_nr", js); - ini_section_delete_var(cat, tmp2); + sprintf(temp, "joystick_%i_nr", js); + ini_section_delete_var(cat, temp); + // --- Save Axis Mappings --- for (int axis_nr = 0; axis_nr < MAX_JOY_AXES; axis_nr++) { - sprintf(tmp2, "joystick_%i_axis_%i", js, axis_nr); - ini_section_delete_var(cat, tmp2); + sprintf(temp, "joystick_%i_axis_%i", js, axis_nr); + ini_section_delete_var(cat, temp); } + + // --- Save Button Mappings --- for (int button_nr = 0; button_nr < MAX_JOY_BUTTONS; button_nr++) { - sprintf(tmp2, "joystick_%i_button_%i", js, button_nr); - ini_section_delete_var(cat, tmp2); + sprintf(temp, "joystick_%i_button_%i", js, button_nr); + ini_section_delete_var(cat, temp); } + + // --- Save POV (Hat Switch) Mappings --- for (int pov_nr = 0; pov_nr < MAX_JOY_POVS; pov_nr++) { - sprintf(tmp2, "joystick_%i_pov_%i", js, pov_nr); - ini_section_delete_var(cat, tmp2); + sprintf(temp, "joystick_%i_pov_%i", js, pov_nr); + ini_section_delete_var(cat, temp); } } } else { @@ -2735,33 +2748,37 @@ save_input_devices(void) ini_section_set_string(cat, "joystick_type", joystick_get_internal_name(joystick_type[joy_insn])); for (int js = 0; js < joystick_get_max_joysticks(joystick_type[joy_insn]); js++) { - sprintf(tmp2, "joystick_%i_nr", js); - ini_section_set_int(cat, tmp2, joystick_state[gp][js].plat_joystick_nr); + sprintf(temp, "joystick_%i_nr", js); + ini_section_set_int(cat, temp, joystick_state[gp][js].plat_joystick_nr); if (joystick_state[gp][js].plat_joystick_nr) { + // --- Save Axis Mappings --- for (int axis_nr = 0; axis_nr < joystick_get_axis_count(joystick_type[joy_insn]); axis_nr++) { - sprintf(tmp2, "joystick_%i_axis_%i", js, axis_nr); - ini_section_set_int(cat, tmp2, joystick_state[gp][js].axis_mapping[axis_nr]); + sprintf(temp, "joystick_%i_axis_%i", js, axis_nr); + ini_section_set_int(cat, temp, joystick_state[gp][js].axis_mapping[axis_nr]); } + + // --- Save Button Mappings --- for (int button_nr = 0; button_nr < joystick_get_button_count(joystick_type[joy_insn]); button_nr++) { - sprintf(tmp2, "joystick_%i_button_%i", js, button_nr); - ini_section_set_int(cat, tmp2, joystick_state[gp][js].button_mapping[button_nr]); + sprintf(temp, "joystick_%i_button_%i", js, button_nr); + ini_section_set_int(cat, temp, joystick_state[gp][js].button_mapping[button_nr]); } + + // --- Save POV (Hat Switch) Mappings --- for (int pov_nr = 0; pov_nr < joystick_get_pov_count(joystick_type[joy_insn]); pov_nr++) { - sprintf(tmp2, "joystick_%i_pov_%i", js, pov_nr); - sprintf(temp, "%i, %i", joystick_state[gp][js].pov_mapping[pov_nr][0], - joystick_state[gp][js].pov_mapping[pov_nr][1]); - ini_section_set_string(cat, tmp2, temp); + sprintf(temp, "joystick_%i_pov_%i", js, pov_nr); + sprintf(tmp2, "%i, %i", joystick_state[gp][js].pov_mapping[pov_nr][0], + joystick_state[gp][js].pov_mapping[pov_nr][1]); + ini_section_set_string(cat, temp, tmp2); } } } } - if (tablet_tool_type != 1) { + if (tablet_tool_type != 1) ini_section_set_int(cat, "tablet_tool_type", tablet_tool_type); - } else { + else ini_section_delete_var(cat, "tablet_tool_type"); - } ini_delete_section_if_empty(config, cat); } diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index c540aa2ed..1bee01df6 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -335,7 +335,7 @@ SettingsInput::on_pushButtonConfigureMouse_clicked() } static int -get_axis(JoystickConfiguration &jc, int axis, uint8_t gameport_nr, int joystick_nr) +get_axis(JoystickConfiguration &jc, uint8_t gameport_nr, int joystick_nr, int axis) { int axis_sel = jc.selectedAxis(axis); int nr_axes = plat_joystick_state[joystick_state[gameport_nr][joystick_nr].plat_joystick_nr - 1].nr_axes; @@ -351,7 +351,7 @@ get_axis(JoystickConfiguration &jc, int axis, uint8_t gameport_nr, int joystick_ } static int -get_pov(JoystickConfiguration &jc, int pov, uint8_t gameport_nr, int joystick_nr) +get_pov(JoystickConfiguration &jc, uint8_t gameport_nr, int joystick_nr, int pov) { int pov_sel = jc.selectedPov(pov); int nr_povs = plat_joystick_state[joystick_state[gameport_nr][joystick_nr].plat_joystick_nr - 1].nr_povs * 2; @@ -379,17 +379,15 @@ updateJoystickConfig(int type, uint8_t gameport_nr, int joystick_nr, QWidget *pa joystick_state[gameport_nr][joystick_nr].plat_joystick_nr = jc.selectedDevice(); if (joystick_state[gameport_nr][joystick_nr].plat_joystick_nr) { - for (int axis_nr = 0; axis_nr < joystick_get_axis_count(type); axis_nr++) { - joystick_state[gameport_nr][joystick_nr].axis_mapping[axis_nr] = get_axis(jc, axis_nr, gameport_nr, joystick_nr); - } + for (int axis_nr = 0; axis_nr < joystick_get_axis_count(type); axis_nr++) + joystick_state[gameport_nr][joystick_nr].axis_mapping[axis_nr] = get_axis(jc, gameport_nr, joystick_nr, axis_nr); - for (int button_nr = 0; button_nr < joystick_get_button_count(type); button_nr++) { + for (int button_nr = 0; button_nr < joystick_get_button_count(type); button_nr++) joystick_state[gameport_nr][joystick_nr].button_mapping[button_nr] = jc.selectedButton(button_nr); - } - for (int pov_nr = 0; pov_nr < joystick_get_pov_count(type) * 2; pov_nr += 2) { - joystick_state[gameport_nr][joystick_nr].pov_mapping[pov_nr][0] = get_pov(jc, pov_nr, gameport_nr, joystick_nr); - joystick_state[gameport_nr][joystick_nr].pov_mapping[pov_nr][1] = get_pov(jc, pov_nr + 1, gameport_nr, joystick_nr); + for (int pov_nr = 0; pov_nr < joystick_get_pov_count(type); pov_nr++) { + joystick_state[gameport_nr][joystick_nr].pov_mapping[pov_nr][0] = get_pov(jc, gameport_nr, joystick_nr, pov_nr * 2); // X Axis + joystick_state[gameport_nr][joystick_nr].pov_mapping[pov_nr][1] = get_pov(jc, gameport_nr, joystick_nr, pov_nr * 2 + 1); // Y Axis } } } From c5c93ab90b92bb21971a79be29c2a5d205c807d0 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 20 Oct 2025 23:43:58 -0400 Subject: [PATCH 037/113] Fix duplicate messages warning for QT builds --- src/qt/languages/86box.pot | 3 --- src/qt/languages/cs-CZ.po | 3 --- src/qt/languages/de-DE.po | 3 --- src/qt/languages/es-ES.po | 3 --- src/qt/languages/fi-FI.po | 3 --- src/qt/languages/fr-FR.po | 3 --- src/qt/languages/hr-HR.po | 3 --- src/qt/languages/it-IT.po | 3 --- src/qt/languages/ja-JP.po | 3 --- src/qt/languages/ko-KR.po | 3 --- src/qt/languages/nb-NO.po | 3 --- src/qt/languages/nl-NL.po | 3 --- src/qt/languages/pl-PL.po | 3 --- src/qt/languages/pt-BR.po | 3 --- src/qt/languages/pt-PT.po | 3 --- src/qt/languages/ru-RU.po | 3 --- src/qt/languages/sk-SK.po | 3 --- src/qt/languages/sl-SI.po | 3 --- src/qt/languages/sv-SE.po | 3 --- src/qt/languages/tr-TR.po | 3 --- src/qt/languages/uk-UA.po | 3 --- src/qt/languages/vi-VN.po | 3 --- src/qt/languages/zh-CN.po | 3 --- src/qt/languages/zh-TW.po | 3 --- 24 files changed, 72 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index fd935ffc5..42aab9108 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -3063,9 +3063,6 @@ msgstr "" msgid "Color scheme" msgstr "" -msgid "System" -msgstr "" - msgid "Light" msgstr "" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 1aa30bdeb..6f210c9d8 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -3063,9 +3063,6 @@ msgstr "Režim roztažení vstupu OpenGL" msgid "Color scheme" msgstr "Barevné schéma" -msgid "System" -msgstr "" - msgid "Light" msgstr "Světlé" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index ed479ab13..8ecd7a003 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -3063,9 +3063,6 @@ msgstr "Eingabestreckungsmodus von OpenGL" msgid "Color scheme" msgstr "Farbschema" -msgid "System" -msgstr "" - msgid "Light" msgstr "Licht" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index bcf5a0026..4d00016b2 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -3063,9 +3063,6 @@ msgstr "Modo de estiramiento de entrada de OpenGL" msgid "Color scheme" msgstr "Esquema de colores" -msgid "System" -msgstr "" - msgid "Light" msgstr "Luz" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 96b1c03aa..e36559c19 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -3063,9 +3063,6 @@ msgstr "OpenGL-syötteen venytystila" msgid "Color scheme" msgstr "Väriteema" -msgid "System" -msgstr "" - msgid "Light" msgstr "Vaalea" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 928666268..3c5905f46 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -3063,9 +3063,6 @@ msgstr "Mode d'étirement des données d'entrée d'OpenGL" msgid "Color scheme" msgstr "Palette de couleurs" -msgid "System" -msgstr "" - msgid "Light" msgstr "Lumière" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index b0f5a352e..5d03a6773 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -3063,9 +3063,6 @@ msgstr "Način rastezanja ulaza u OpenGL-u" msgid "Color scheme" msgstr "Shema boja" -msgid "System" -msgstr "" - msgid "Light" msgstr "Svjetlo" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 7e08cf1c5..b0ef54fdf 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -3063,9 +3063,6 @@ msgstr "Modalità adattamento ingresso OpenGL" msgid "Color scheme" msgstr "Modalità colori" -msgid "System" -msgstr "" - msgid "Light" msgstr "Chiara" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 7cb67e505..2953997df 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -3063,9 +3063,6 @@ msgstr "OpenGLの入力ストレッチモード" msgid "Color scheme" msgstr "配色" -msgid "System" -msgstr "" - msgid "Light" msgstr "光" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index dea008ad8..49e407568 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -3063,9 +3063,6 @@ msgstr "OpenGL 입력 스트레치 모드" msgid "Color scheme" msgstr "색상 구성" -msgid "System" -msgstr "" - msgid "Light" msgstr "빛" diff --git a/src/qt/languages/nb-NO.po b/src/qt/languages/nb-NO.po index db70b8842..69591c4c1 100644 --- a/src/qt/languages/nb-NO.po +++ b/src/qt/languages/nb-NO.po @@ -3063,9 +3063,6 @@ msgstr "Inngangsstrekkmodus for OpenGL" msgid "Color scheme" msgstr "Fargevalg" -msgid "System" -msgstr "" - msgid "Light" msgstr "Lys" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index deb53176c..cce10e564 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -3063,9 +3063,6 @@ msgstr "Input stretch-modus van OpenGL" msgid "Color scheme" msgstr "Kleurenschema" -msgid "System" -msgstr "" - msgid "Light" msgstr "Licht" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 643957399..9b4e20136 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -3063,9 +3063,6 @@ msgstr "Tryb rozciągania wejściowego OpenGL" msgid "Color scheme" msgstr "Schemat kolorów" -msgid "System" -msgstr "" - msgid "Light" msgstr "Światło" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 0f9b81277..31b401fa8 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -3063,9 +3063,6 @@ msgstr "Modo de expansão de entrada do OpenGL" msgid "Color scheme" msgstr "Esquema de cores" -msgid "System" -msgstr "" - msgid "Light" msgstr "Claro" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 9cc796af4..75aa4498e 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -3063,9 +3063,6 @@ msgstr "Modo de expansão de entrada do OpenGL" msgid "Color scheme" msgstr "Esquema de cores" -msgid "System" -msgstr "" - msgid "Light" msgstr "Claro" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index cd0c70e51..24f49da45 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -3063,9 +3063,6 @@ msgstr "Режим растяжения ввода OpenGL" msgid "Color scheme" msgstr "Цветовая схема" -msgid "System" -msgstr "" - msgid "Light" msgstr "Светлая" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index c0230ea6d..7363fd459 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -3063,9 +3063,6 @@ msgstr "Režim rozťahovania vstupu OpenGL" msgid "Color scheme" msgstr "Farebná schéma" -msgid "System" -msgstr "" - msgid "Light" msgstr "Svetlo" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 81026fe06..3567aaa1a 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -3063,9 +3063,6 @@ msgstr "Način raztezanja vhoda OpenGL" msgid "Color scheme" msgstr "Barvna shema" -msgid "System" -msgstr "" - msgid "Light" msgstr "Svetloba" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index a04c58265..a65ded997 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -3063,9 +3063,6 @@ msgstr "Inmatningssträckningsläge för OpenGL" msgid "Color scheme" msgstr "Färgschema" -msgid "System" -msgstr "" - msgid "Light" msgstr "Ljus" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 43f52d394..759a8a4a2 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -3063,9 +3063,6 @@ msgstr "OpenGL'nin giriş germe modu" msgid "Color scheme" msgstr "Renk şeması" -msgid "System" -msgstr "" - msgid "Light" msgstr "Işık" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 473030341..0bca925fb 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -3063,9 +3063,6 @@ msgstr "Режим розтягування вхідних даних OpenGL" msgid "Color scheme" msgstr "Колірна гамма" -msgid "System" -msgstr "" - msgid "Light" msgstr "Світло" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 41f6d056e..e178a256c 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -3063,9 +3063,6 @@ msgstr "Chế độ kéo giãn đầu vào của OpenGL" msgid "Color scheme" msgstr "Bảng màu" -msgid "System" -msgstr "" - msgid "Light" msgstr "Ánh sáng" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 0014af5cd..f973a9512 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -3063,9 +3063,6 @@ msgstr "OpenGL的输入拉伸模式" msgid "Color scheme" msgstr "配色方案" -msgid "System" -msgstr "" - msgid "Light" msgstr "亮色" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 94b0c2918..675c3f517 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -3063,9 +3063,6 @@ msgstr "OpenGL 的輸入拉伸模式" msgid "Color scheme" msgstr "配色方案" -msgid "System" -msgstr "" - msgid "Light" msgstr "亮色" From cff55b210ce90bb800cdcfcf7b23e61c74fe3875 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 20 Oct 2025 23:46:23 -0400 Subject: [PATCH 038/113] Fix more compile warnings --- src/machine/m_at_socket7_3v.c | 4 ++-- src/utils/crc32.c | 4 +++- src/video/vid_ddc_edid_custom.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 69d37229f..264a220fc 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -280,8 +280,8 @@ machine_at_vectra500mt_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_at_common_init_ex(model, 2); - + machine_at_common_init_ex(model, 2); + pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x0F, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); diff --git a/src/utils/crc32.c b/src/utils/crc32.c index 6993654ae..a8d5dde26 100644 --- a/src/utils/crc32.c +++ b/src/utils/crc32.c @@ -22,7 +22,9 @@ #include #include -#define __USE_LARGEFILE64 +#ifndef __USE_LARGEFILE64 +#define __USE_LARGEFILE64 1 +#endif #include #if (defined(__HAIKU__) || defined(__unix__) || defined(__APPLE__)) && !defined(__linux__) diff --git a/src/video/vid_ddc_edid_custom.c b/src/video/vid_ddc_edid_custom.c index 4442fac10..ae427d7de 100644 --- a/src/video/vid_ddc_edid_custom.c +++ b/src/video/vid_ddc_edid_custom.c @@ -64,7 +64,7 @@ ddc_load_edid(char *path, uint8_t *buf, size_t size) // Check the beginning of the file for the EDID header. uint64_t header; - fread(&header, sizeof(header), 1, fp); + (void) !fread(&header, sizeof(header), 1, fp); if (header == EDID_HEADER) { // Binary format. Read as is From 24d524fa31f73a41f2c5ba23e8226cd420134790 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 12 Oct 2025 23:25:50 -0400 Subject: [PATCH 039/113] Correct formatting in machine_table.c --- src/machine/machine_table.c | 424 ++++++++++++++++++------------------ 1 file changed, 212 insertions(+), 212 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 47fb21303..efb1a31ed 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -12432,47 +12432,47 @@ const machine_t machines[] = { .net_device = NULL }, { - .name = "[i430FX] IBM PC 3x0 (type 65x6) (Morrison64)", - .internal_name = "pc330_65x6", - .type = MACHINE_TYPE_SOCKET5, - .chipset = MACHINE_CHIPSET_INTEL_430FX, - .init = machine_at_pc330_65x6_init, - .p1_handler = machine_generic_p1_handler, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, + .name = "[i430FX] IBM PC 3x0 (type 65x6) (Morrison64)", + .internal_name = "pc330_65x6", + .type = MACHINE_TYPE_SOCKET5, + .chipset = MACHINE_CHIPSET_INTEL_430FX, + .init = machine_at_pc330_65x6_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK(CPU_K5, CPU_5K86, CPU_Cx6x86), - .min_bus = 50000000, - .max_bus = 66666667, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK(CPU_K5, CPU_5K86, CPU_Cx6x86), + .min_bus = 50000000, + .max_bus = 66666667, .min_voltage = 3380, .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 2.0 + .min_multi = 1.5, + .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, - .ram = { - .min = 8192, - .max = 131072, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, + .ram = { + .min = 8192, + .max = 131072, .step = 8192 }, - .nvrmask = 255, - .jumpered_ecp_dma = MACHINE_DMA_DISABLED | MACHINE_DMA_1 | MACHINE_DMA_3, + .nvrmask = 255, + .jumpered_ecp_dma = MACHINE_DMA_DISABLED | MACHINE_DMA_1 | MACHINE_DMA_3, .default_jumpered_ecp_dma = 3, - .kbc_device = NULL, - .kbc_params = 0x00000000, - .kbc_p1 = 0x000044f0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = &s3_phoenix_trio64_onboard_pci_device, - .snd_device = NULL, - .net_device = NULL + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x000044f0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &s3_phoenix_trio64_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL }, /* According to tests from real hardware: This has AMI MegaKey KBC firmware on the PC87306 Super I/O chip, command 0xA1 returns '5'. @@ -13040,27 +13040,27 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_VIDEO, - .ram = { + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_VIDEO, + .ram = { .min = 4096, .max = 131072, .step = 4096 }, - .nvrmask = 127, - .jumpered_ecp_dma = MACHINE_DMA_USE_CONFIG, + .nvrmask = 127, + .jumpered_ecp_dma = MACHINE_DMA_USE_CONFIG, .default_jumpered_ecp_dma = -1, - .kbc_device = &kbc_at_device, - .kbc_params = KBC_VEN_PHOENIX | 0x00021400, /* Guess */ - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = &gd5434_onboard_pci_device, - .snd_device = NULL, - .net_device = NULL + .kbc_device = &kbc_at_device, + .kbc_params = KBC_VEN_PHOENIX | 0x00021400, /* Guess */ + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &gd5434_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL }, /* Has a VIA KBC chip */ { @@ -13084,27 +13084,27 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM, - .ram = { + .flags = MACHINE_IDE_DUAL | MACHINE_APM, + .ram = { .min = 4096, .max = 262144, .step = 4096 }, - .nvrmask = 127, - .jumpered_ecp_dma = MACHINE_DMA_1 | MACHINE_DMA_3, + .nvrmask = 127, + .jumpered_ecp_dma = MACHINE_DMA_1 | MACHINE_DMA_3, .default_jumpered_ecp_dma = 1, - .kbc_device = &kbc_at_device, - .kbc_params = KBC_VEN_VIA | 0x00424600, /* Guess */ - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = NULL, - .snd_device = NULL, - .net_device = NULL + .kbc_device = &kbc_at_device, + .kbc_params = KBC_VEN_VIA | 0x00424600, /* Guess */ + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL }, /* KBC firmware is unknown. No commands outside of the base PS/2 */ /* KBC command set are used. */ @@ -13129,27 +13129,27 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM, - .ram = { + .flags = MACHINE_IDE_DUAL | MACHINE_APM, + .ram = { .min = 4096, .max = 131072, .step = 4096 }, - .nvrmask = 127, - .jumpered_ecp_dma = MACHINE_DMA_DISABLED | MACHINE_DMA_1 | MACHINE_DMA_3, + .nvrmask = 127, + .jumpered_ecp_dma = MACHINE_DMA_DISABLED | MACHINE_DMA_1 | MACHINE_DMA_3, .default_jumpered_ecp_dma = 4, - .kbc_device = &kbc_at_device, - .kbc_params = KBC_VEN_PHOENIX | 0x00021400, /* Guess */ - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = NULL, - .snd_device = NULL, - .net_device = NULL + .kbc_device = &kbc_at_device, + .kbc_params = KBC_VEN_PHOENIX | 0x00021400, /* Guess */ + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL }, /* This has Phoenix KBC firmware. */ { @@ -13173,27 +13173,27 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_VIDEO, - .ram = { + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_VIDEO, + .ram = { .min = 8192, .max = 139264, .step = 4096 }, - .nvrmask = 127, - .jumpered_ecp_dma = MACHINE_DMA_1 | MACHINE_DMA_3, + .nvrmask = 127, + .jumpered_ecp_dma = MACHINE_DMA_1 | MACHINE_DMA_3, .default_jumpered_ecp_dma = 3, - .kbc_device = &kbc_at_device, - .kbc_params = KBC_VEN_PHOENIX | 0x00012900, /* Guess */ - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = &gd5430_onboard_pci_device, - .snd_device = NULL, - .net_device = NULL + .kbc_device = &kbc_at_device, + .kbc_params = KBC_VEN_PHOENIX | 0x00012900, /* Guess */ + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &gd5430_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL }, /* VLSI Wildcat */ @@ -13219,27 +13219,27 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_VIDEO, - .ram = { + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_VIDEO, + .ram = { .min = 4096, .max = 196608, .step = 4096 }, - .nvrmask = 127, - .jumpered_ecp_dma = MACHINE_DMA_3, + .nvrmask = 127, + .jumpered_ecp_dma = MACHINE_DMA_3, .default_jumpered_ecp_dma = 3, - .kbc_device = &kbc_at_device, - .kbc_params = KBC_VEN_PHOENIX | 0x00012900, /* Guess */ - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = &s3_phoenix_trio64_onboard_pci_device, - .snd_device = NULL, - .net_device = NULL + .kbc_device = &kbc_at_device, + .kbc_params = KBC_VEN_PHOENIX | 0x00012900, /* Guess */ + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &s3_phoenix_trio64_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL }, /* Socket 7 (Single Voltage) machines */ @@ -13334,90 +13334,90 @@ const machine_t machines[] = { .net_device = NULL }, { - .name = "[i430FX] HP Vectra VE 5/XXX Series 2", - .internal_name = "hpvectravexxx", - .type = MACHINE_TYPE_SOCKET7_3V, - .chipset = MACHINE_CHIPSET_INTEL_430FX, - .init = machine_at_hpvectravexxx_init, - .p1_handler = machine_generic_p1_handler, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, + .name = "[i430FX] HP Vectra VE 5/XXX Series 2", + .internal_name = "hpvectravexxx", + .type = MACHINE_TYPE_SOCKET7_3V, + .chipset = MACHINE_CHIPSET_INTEL_430FX, + .init = machine_at_hpvectravexxx_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK_NONE, - .min_bus = 50000000, - .max_bus = 66666667, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 50000000, + .max_bus = 66666667, .min_voltage = 3380, .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 3.0 + .min_multi = 1.5, + .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, - .ram = { - .min = 8192, - .max = 131072, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, + .ram = { + .min = 8192, + .max = 131072, .step = 8192 }, - .nvrmask = 255, - .jumpered_ecp_dma = 0, + .nvrmask = 255, + .jumpered_ecp_dma = 0, .default_jumpered_ecp_dma = -1, - .kbc_device = NULL, - .kbc_params = 0x00000000, - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = &hpvectravexxx_device, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = &gd5436_onboard_pci_device, - .snd_device = NULL, - .net_device = NULL + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = &hpvectravexxx_device, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &gd5436_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL }, { - .name = "[i430FX] HP Vectra 500 Series xxx/MT", - .internal_name = "vectra500mt", - .type = MACHINE_TYPE_SOCKET7_3V, - .chipset = MACHINE_CHIPSET_INTEL_430FX, - .init = machine_at_vectra500mt_init, - .p1_handler = machine_generic_p1_handler, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, + .name = "[i430FX] HP Vectra 500 Series xxx/MT", + .internal_name = "vectra500mt", + .type = MACHINE_TYPE_SOCKET7_3V, + .chipset = MACHINE_CHIPSET_INTEL_430FX, + .init = machine_at_vectra500mt_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK_NONE, - .min_bus = 50000000, - .max_bus = 66666667, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 50000000, + .max_bus = 66666667, .min_voltage = 3380, .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 3.0 + .min_multi = 1.5, + .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, - .ram = { - .min = 8192, - .max = 131072, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, + .ram = { + .min = 8192, + .max = 131072, .step = 8192 }, - .nvrmask = 511, - .jumpered_ecp_dma = 0, + .nvrmask = 511, + .jumpered_ecp_dma = 0, .default_jumpered_ecp_dma = -1, - .kbc_device = NULL, - .kbc_params = 0x00000000, - .kbc_p1 = 0x000044f0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = NULL, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = &s3_phoenix_trio64_onboard_pci_device, - .snd_device = NULL, - .net_device = NULL + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x000044f0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &s3_phoenix_trio64_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL }, /* Has a SM(S)C FDC37C932 Super I/O chip with on-chip KBC with AMI MegaKey (revision '5') KBC firmware. */ @@ -15778,48 +15778,48 @@ const machine_t machines[] = { }, /* This has the Phoenix MultiKey KBC firmware on the NSC Super I/O chip. */ { - .name = "[i430TX] Intel AN430TX (Anchorage)", - .internal_name = "an430tx", - .type = MACHINE_TYPE_SOCKET7, - .chipset = MACHINE_CHIPSET_INTEL_430TX, - .init = machine_at_an430tx_init, - .p1_handler = machine_generic_p1_handler, + .name = "[i430TX] Intel AN430TX (Anchorage)", + .internal_name = "an430tx", + .type = MACHINE_TYPE_SOCKET7, + .chipset = MACHINE_CHIPSET_INTEL_430TX, + .init = machine_at_an430tx_init, + .p1_handler = machine_generic_p1_handler, .gpio_handler = machine_ap440fx_vs440fx_gpio_handler, - .available_flag = MACHINE_AVAILABLE, + .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK(CPU_K5, CPU_5K86, CPU_K6, CPU_K6_2, CPU_K6_2C, CPU_K6_3, CPU_K6_2P, - CPU_K6_3P, CPU_Cx6x86, CPU_Cx6x86MX, CPU_Cx6x86L), - .min_bus = 60000000, - .max_bus = 66666667, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK(CPU_K5, CPU_5K86, CPU_K6, CPU_K6_2, CPU_K6_2C, CPU_K6_3, CPU_K6_2P, + CPU_K6_3P, CPU_Cx6x86, CPU_Cx6x86MX, CPU_Cx6x86L), + .min_bus = 60000000, + .max_bus = 66666667, .min_voltage = 2800, .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 3.5 + .min_multi = 1.5, + .max_multi = 3.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_SOUND | MACHINE_GAMEPORT, /* Machine has internal video: ATI Mach64GT-B 3D Rage II */ - .ram = { - .min = 8192, - .max = 262144, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_SOUND | MACHINE_GAMEPORT, /* Machine has internal video: ATI Mach64GT-B 3D Rage II */ + .ram = { + .min = 8192, + .max = 262144, .step = 8192 }, - .nvrmask = 255, - .jumpered_ecp_dma = 0, + .nvrmask = 255, + .jumpered_ecp_dma = 0, .default_jumpered_ecp_dma = -1, - .kbc_device = NULL, - .kbc_params = 0x00000000, - .kbc_p1 = 0x000044f0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = &an430tx_device, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = NULL, - .snd_device = &ymf715_onboard_device, - .net_device = NULL + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x000044f0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = &an430tx_device, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = &ymf715_onboard_device, + .net_device = NULL }, /* This has the Winbond W83977 Super I/O Chip with AMIKey-2 KBC firmware, which is type 'H'. */ { From 63c01b6b9f3179f027594cabe4f85e84ff2c3e78 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 21 Oct 2025 01:07:47 -0400 Subject: [PATCH 040/113] Remove ACPI flag from the Abit AH4T --- src/machine/machine_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index efb1a31ed..da791a850 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -8831,7 +8831,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_VLB, - .flags = MACHINE_APM | MACHINE_ACPI, + .flags = MACHINE_APM, .ram = { .min = 1024, .max = 131072, From 003eef6aeb0c84a4d87f1a943865b74bbc5fc889 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 21 Oct 2025 01:44:28 -0400 Subject: [PATCH 041/113] Fix several joystick Button names --- src/game/joystick_ch_flightstick_pro.c | 12 ++++++------ src/game/joystick_standard.c | 4 ++-- src/game/joystick_tm_fcs.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/game/joystick_ch_flightstick_pro.c b/src/game/joystick_ch_flightstick_pro.c index 0c318555a..5c35b85a8 100644 --- a/src/game/joystick_ch_flightstick_pro.c +++ b/src/game/joystick_ch_flightstick_pro.c @@ -239,7 +239,7 @@ const joystick_t joystick_ch_flightstick = { .pov_count = 0, .max_joysticks = 1, .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle" }, - .button_names = { "Button 1", "Button 2" }, + .button_names = { "Trigger", "Button 2" }, .pov_names = { NULL } }; @@ -257,7 +257,7 @@ const joystick_t joystick_ch_flightstick_ch_pedals = { .pov_count = 0, .max_joysticks = 1, .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, - .button_names = { "Button 1", "Button 2" }, + .button_names = { "Trigger", "Button 2" }, .pov_names = { NULL } }; @@ -275,7 +275,7 @@ const joystick_t joystick_ch_flightstick_ch_pedals_pro = { .pov_count = 0, .max_joysticks = 1, .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Right Pedal", "Left Pedal" }, - .button_names = { "Button 1", "Button 2" }, + .button_names = { "Trigger", "Button 2" }, .pov_names = { NULL } }; @@ -293,7 +293,7 @@ const joystick_t joystick_ch_flightstick_pro = { .pov_count = 1, .max_joysticks = 1, .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; @@ -311,7 +311,7 @@ const joystick_t joystick_ch_flightstick_pro_ch_pedals = { .pov_count = 1, .max_joysticks = 1, .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; @@ -329,7 +329,7 @@ const joystick_t joystick_ch_flightstick_pro_ch_pedals_pro = { .pov_count = 1, .max_joysticks = 1, .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Right Pedal", "Left Pedal" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; diff --git a/src/game/joystick_standard.c b/src/game/joystick_standard.c index 8bb47937f..0876a21a2 100644 --- a/src/game/joystick_standard.c +++ b/src/game/joystick_standard.c @@ -765,7 +765,7 @@ const joystick_t joystick_3button_yoke_throttle = { .pov_count = 0, .max_joysticks = 1, .axis_names = { "Roll axis", "Pitch axis", "Throttle axis" }, - .button_names = { "Button 1", "Button 2", "Button 3" }, + .button_names = { "Trigger", "Button 2", "Button 3" }, .pov_names = { NULL } }; @@ -783,7 +783,7 @@ const joystick_t joystick_4button_yoke_throttle = { .pov_count = 0, .max_joysticks = 1, .axis_names = { "Roll axis", "Pitch axis", "Throttle axis" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, .pov_names = { NULL } }; diff --git a/src/game/joystick_tm_fcs.c b/src/game/joystick_tm_fcs.c index c8368612d..93f54db36 100644 --- a/src/game/joystick_tm_fcs.c +++ b/src/game/joystick_tm_fcs.c @@ -167,7 +167,7 @@ const joystick_t joystick_tm_fcs = { .pov_count = 1, .max_joysticks = 1, .axis_names = { "X axis", "Y axis" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; @@ -185,6 +185,6 @@ const joystick_t joystick_tm_fcs_rcs = { .pov_count = 1, .max_joysticks = 1, .axis_names = { "X axis", "Y axis", "Rudder" }, - .button_names = { "Button 1", "Button 2", "Button 3", "Button 4" }, + .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; From 6a20196bc363e398ea195786bebeb94c7cb98d96 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 21 Oct 2025 01:44:51 -0400 Subject: [PATCH 042/113] Fix incorrect joystick button counts --- src/game/joystick_standard.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/joystick_standard.c b/src/game/joystick_standard.c index 0876a21a2..59b3460a2 100644 --- a/src/game/joystick_standard.c +++ b/src/game/joystick_standard.c @@ -544,7 +544,7 @@ const joystick_t joystick_4axis_2button = { .read_axis = joystick_standard_read_axis_4axis, .a0_over = joystick_standard_a0_over, .axis_count = 4, - .button_count = 3, + .button_count = 2, .pov_count = 0, .max_joysticks = 1, .axis_names = { "X axis", "Y axis", "Z axis", "zX axis" }, @@ -797,7 +797,7 @@ const joystick_t joystick_steering_wheel_2_button = { .read_axis = joystick_standard_read_axis_3axis, .a0_over = joystick_standard_a0_over, .axis_count = 3, - .button_count = 4, + .button_count = 2, .pov_count = 0, .max_joysticks = 1, .axis_names = { "Steering axis", "Accelerator axis", "Brake axis" }, @@ -815,7 +815,7 @@ const joystick_t joystick_steering_wheel_3_button = { .read_axis = joystick_standard_read_axis_3axis, .a0_over = joystick_standard_a0_over, .axis_count = 3, - .button_count = 4, + .button_count = 3, .pov_count = 0, .max_joysticks = 1, .axis_names = { "Steering axis", "Accelerator axis", "Brake axis" }, From 5b0267e4d3738ece390f664cc0cac9ebe31939fe Mon Sep 17 00:00:00 2001 From: MaxwellS04 Date: Tue, 21 Oct 2025 16:28:37 +0700 Subject: [PATCH 043/113] Added the 1999 v4.51PG BIOS to P5VX-B --- src/include/86box/machine.h | 3 ++ src/machine/m_at_socket7.c | 65 ++++++++++++++++++++++++++++++++++--- src/machine/machine_table.c | 2 +- 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 061c6473f..8cc928f91 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -1062,6 +1062,9 @@ extern int machine_at_8500tvxa_init(const machine_t *); extern int machine_at_presario2240_init(const machine_t *); extern int machine_at_presario4500_init(const machine_t *); extern int machine_at_dellhannibalp_init(const machine_t *); +#ifdef EMU_DEVICE_H +extern const device_t p5vxb_device; +#endif extern int machine_at_p5vxb_init(const machine_t *); extern int machine_at_p55va_init(const machine_t *); extern int machine_at_gw2kte_init(const machine_t *); diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 7916db2d4..15e0316f2 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -813,17 +813,72 @@ machine_at_dellhannibalp_init(const machine_t *model) return ret; } +static const device_config_t p5vxb_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "p5vxb", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Award Modular BIOS v4.50PG - Revision 1.0", + .internal_name = "p5vxb", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/p5vxb/P5VXB10.BIN", "" } + }, + { + .name = "Award Modular BIOS v4.51PG - Revision 1.5c", + .internal_name = "p5vxb_451pg", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/p5vxb/P5VXB15C.BIN", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t p5vxb_device = { + .name = "ECS P5VX-B", + .internal_name = "p5vxb_device", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = p5vxb_config +}; + int machine_at_p5vxb_init(const machine_t *model) { - int ret; + int ret = 0; + const char *fn; - ret = bios_load_linear("roms/machines/p5vxb/P5VXB10.BIN", - 0x000e0000, 131072, 0); - - if (bios_only || !ret) + /* No ROMs available */ + if (!device_available(model->device)) return ret; + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + ret = bios_load_linear(fn, 0x000e0000, 131072, 0); + device_context_restore(); + machine_at_common_init(model); pci_init(PCI_CONFIG_TYPE_1); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 47fb21303..244bf83df 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -15218,7 +15218,7 @@ const machine_t machines[] = { .kbc_p1 = 0x00000cf0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = NULL, + .device = &p5vxb_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, From 7f9720d746bb2d8ad32bf23938f58280d1d6bcf9 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 20 Oct 2025 05:28:42 +0500 Subject: [PATCH 044/113] Qt: Move the CPU frame size option next to time sync --- src/qt/qt_settingsmachine.ui | 209 ++++++++++++++++++----------------- 1 file changed, 110 insertions(+), 99 deletions(-) diff --git a/src/qt/qt_settingsmachine.ui b/src/qt/qt_settingsmachine.ui index 34f0b6160..e14e113f8 100644 --- a/src/qt/qt_settingsmachine.ui +++ b/src/qt/qt_settingsmachine.ui @@ -106,7 +106,7 @@ Frequency: - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter @@ -312,7 +312,7 @@ - Qt::Orientation::Horizontal + Qt::Horizontal @@ -325,92 +325,116 @@ - - - - - - 0 - 0 - - - - CPU frame size - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop - - - - - - Larger frames (less smooth) - - - - - - - Smaller frames (smoother) - - - - - + + + + + + + + 0 + 0 + + + + Time synchronization + + + + + + Disabled + + + + + + + Enabled (local time) + + + + + + + Enabled (UTC) + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 40 + + + + + - - + + + + + + + 0 + 0 + + + + CPU frame size + + + + + + Larger frames (less smooth) + + + + + + + Smaller frames (smoother) + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 40 + + + + + + + + - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - Time synchronization - - - - - - Disabled - - - - - - - Enabled (local time) - - - - - - - Enabled (UTC) - - - - - - - - - - Qt::Orientation::Horizontal + Qt::Horizontal @@ -422,19 +446,6 @@ - - - - Qt::Orientation::Vertical - - - - 20 - 40 - - - - From 591517d85caa79c3545e50ce3a3b15f4aef71dca Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Tue, 21 Oct 2025 16:28:01 +0500 Subject: [PATCH 045/113] Qt: Clean up the .ui files for v5.2 - properly order the elements in QGridLayouts - add non-generic names to text labels and some layouts - fix enums for Qt 5 Designer compatibility - fix tab order on some settings dialog pages --- src/qt/qt_cgasettingsdialog.ui | 162 ++++++++-------- src/qt/qt_harddiskdialog.ui | 18 +- src/qt/qt_joystickconfiguration.ui | 2 +- src/qt/qt_mainwindow.ui | 18 +- src/qt/qt_newfloppydialog.ui | 4 +- src/qt/qt_progsettings.ui | 211 ++++++++++---------- src/qt/qt_settingsdisplay.cpp | 12 +- src/qt/qt_settingsdisplay.ui | 239 ++++++++++++----------- src/qt/qt_settingsmachine.ui | 298 ++++++++++++++--------------- src/qt/qt_vmmanager_preferences.ui | 10 +- 10 files changed, 504 insertions(+), 470 deletions(-) diff --git a/src/qt/qt_cgasettingsdialog.ui b/src/qt/qt_cgasettingsdialog.ui index 7367b2099..dc5acb0fc 100644 --- a/src/qt/qt_cgasettingsdialog.ui +++ b/src/qt/qt_cgasettingsdialog.ui @@ -15,84 +15,15 @@ - QLayout::SizeConstraint::SetFixedSize + QLayout::SetFixedSize - - - - -100 - - - 100 - - - Qt::Orientation::Horizontal - - - - - - - 360 - - - 100 - - - Qt::Orientation::Horizontal - - - - + Hue - - - - -50 - - - 50 - - - Qt::Orientation::Horizontal - - - - - - - Qt::Orientation::Horizontal - - - QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok|QDialogButtonBox::StandardButton::Reset - - - - - - - 360 - - - 100 - - - Qt::Orientation::Horizontal - - - - - - - Contrast - - - @@ -102,31 +33,100 @@ 360 - Qt::Orientation::Horizontal - - - - - - - Sharpness + Qt::Horizontal - + Saturation + + + + 360 + + + 100 + + + Qt::Horizontal + + + - + Brightness + + + + -100 + + + 100 + + + Qt::Horizontal + + + + + + + Contrast + + + + + + + 360 + + + 100 + + + Qt::Horizontal + + + + + + + Sharpness + + + + + + + -50 + + + 50 + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset + + + diff --git a/src/qt/qt_harddiskdialog.ui b/src/qt/qt_harddiskdialog.ui index e2dea0220..6de39375f 100644 --- a/src/qt/qt_harddiskdialog.ui +++ b/src/qt/qt_harddiskdialog.ui @@ -33,7 +33,7 @@ - + File name: @@ -43,7 +43,7 @@ - + Cylinders: @@ -66,7 +66,7 @@ - + Heads: @@ -92,7 +92,7 @@ - + Sectors: @@ -118,7 +118,7 @@ - + Size (MB): @@ -141,7 +141,7 @@ - + Type: @@ -155,7 +155,7 @@ - + Bus: @@ -169,7 +169,7 @@ - + Channel: @@ -183,7 +183,7 @@ - + Model: diff --git a/src/qt/qt_joystickconfiguration.ui b/src/qt/qt_joystickconfiguration.ui index 139b99ca5..f5f2773b3 100644 --- a/src/qt/qt_joystickconfiguration.ui +++ b/src/qt/qt_joystickconfiguration.ui @@ -32,7 +32,7 @@ - + Device diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui index 38aba061f..45c4f70ae 100644 --- a/src/qt/qt_mainwindow.ui +++ b/src/qt/qt_mainwindow.ui @@ -260,7 +260,7 @@ - Qt::ContextMenuPolicy::PreventContextMenu + Qt::PreventContextMenu toolBar @@ -272,7 +272,7 @@ false - Qt::ToolBarArea::TopToolBarArea + Qt::TopToolBarArea @@ -281,7 +281,7 @@ - Qt::ToolButtonStyle::ToolButtonIconOnly + Qt::ToolButtonIconOnly false @@ -396,7 +396,7 @@ E&xit - QAction::MenuRole::QuitRole + QAction::QuitRole @@ -408,7 +408,7 @@ &Settings... - QAction::MenuRole::NoRole + QAction::NoRole false @@ -710,7 +710,7 @@ false - QAction::MenuRole::AboutQtRole + QAction::AboutQtRole @@ -718,7 +718,7 @@ &About 86Box... - QAction::MenuRole::AboutRole + QAction::AboutRole @@ -771,7 +771,7 @@ &Preferences... - QAction::MenuRole::PreferencesRole + QAction::PreferencesRole @@ -844,7 +844,7 @@ Renderer &options... - QAction::MenuRole::NoRole + QAction::NoRole diff --git a/src/qt/qt_newfloppydialog.ui b/src/qt/qt_newfloppydialog.ui index c0437d810..98bfd8be4 100644 --- a/src/qt/qt_newfloppydialog.ui +++ b/src/qt/qt_newfloppydialog.ui @@ -27,7 +27,7 @@ - + File name: @@ -44,7 +44,7 @@ - + Disk size: diff --git a/src/qt/qt_progsettings.ui b/src/qt/qt_progsettings.ui index ca33726b1..6d5f80830 100644 --- a/src/qt/qt_progsettings.ui +++ b/src/qt/qt_progsettings.ui @@ -27,49 +27,15 @@ - QLayout::SizeConstraint::SetFixedSize + QLayout::SetFixedSize - + Language: - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - Inhibit multimedia keys - - - - - - - Mouse sensitivity: - - - - - - - Default - - - @@ -82,10 +48,30 @@ - - + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + - Ask for confirmation before saving settings + Default + + + + + + + Mouse sensitivity: @@ -107,31 +93,14 @@ 100 - Qt::Orientation::Horizontal - - - - - - - <html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html> - - - Select media images from program working directory - - - - - - - Default + Qt::Horizontal - Qt::Orientation::Horizontal + Qt::Horizontal @@ -141,58 +110,106 @@ - + + + + Default + + + + + + + <html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html> + + + Select media images from program working directory + + + + + + + Inhibit multimedia keys + + + + + + + Ask for confirmation before saving settings + + + + Ask for confirmation before quitting - - - - Qt::Orientation::Horizontal - - - QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok - - - - + Ask for confirmation before hard resetting - - - - Color scheme + + + + + + Color scheme + + + + + + System + + + + + + + Light + + + + + + + Dark + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - System - - - - - - - Light - - - - - - - Dark - - - - diff --git a/src/qt/qt_settingsdisplay.cpp b/src/qt/qt_settingsdisplay.cpp index 8e3a72589..89a2530be 100644 --- a/src/qt/qt_settingsdisplay.cpp +++ b/src/qt/qt_settingsdisplay.cpp @@ -46,7 +46,7 @@ SettingsDisplay::SettingsDisplay(QWidget *parent) for (uint8_t i = 0; i < GFXCARD_MAX; i ++) videoCard[i] = gfxcard[i]; - ui->lineEdit->setFilter(tr("EDID") % util::DlgFilter({ "bin", "dat", "edid", "txt" }) % tr("All files") % util::DlgFilter({ "*" }, true)); + ui->lineEditCustomEDID->setFilter(tr("EDID") % util::DlgFilter({ "bin", "dat", "edid", "txt" }) % tr("All files") % util::DlgFilter({ "*" }, true)); onCurrentMachineChanged(machine); } @@ -77,7 +77,7 @@ SettingsDisplay::save() da2_standalone_enabled = ui->checkBoxDa2->isChecked() ? 1 : 0; monitor_edid = ui->radioButtonCustom->isChecked() ? 1 : 0; - strncpy(monitor_edid_path, ui->lineEdit->fileName().toUtf8().data(), sizeof(monitor_edid_path) - 1); + strncpy(monitor_edid_path, ui->lineEditCustomEDID->fileName().toUtf8().data(), sizeof(monitor_edid_path) - 1); } void @@ -135,8 +135,8 @@ SettingsDisplay::onCurrentMachineChanged(int machineId) ui->radioButtonDefault->setChecked(monitor_edid == 0); ui->radioButtonCustom->setChecked(monitor_edid == 1); - ui->lineEdit->setFileName(monitor_edid_path); - ui->lineEdit->setEnabled(monitor_edid == 1); + ui->lineEditCustomEDID->setFileName(monitor_edid_path); + ui->lineEditCustomEDID->setEnabled(monitor_edid == 1); } void @@ -326,7 +326,7 @@ void SettingsDisplay::on_radioButtonDefault_clicked() { ui->radioButtonDefault->setChecked(true); ui->radioButtonCustom->setChecked(false); - ui->lineEdit->setEnabled(false); + ui->lineEditCustomEDID->setEnabled(false); } @@ -334,7 +334,7 @@ void SettingsDisplay::on_radioButtonCustom_clicked() { ui->radioButtonDefault->setChecked(false); ui->radioButtonCustom->setChecked(true); - ui->lineEdit->setEnabled(true); + ui->lineEditCustomEDID->setEnabled(true); } void SettingsDisplay::on_pushButtonExportDefault_clicked() diff --git a/src/qt/qt_settingsdisplay.ui b/src/qt/qt_settingsdisplay.ui index 6e4c14152..5ab71f4c0 100644 --- a/src/qt/qt_settingsdisplay.ui +++ b/src/qt/qt_settingsdisplay.ui @@ -26,27 +26,45 @@ 0 - - + + + + + 0 + 0 + + - Voodoo 1 or 2 Graphics + Video: - - + + + + + 0 + 0 + + + + 30 + + + + + + + + 0 + 0 + + Configure - - - - IBM 8514/A Graphics - - - @@ -60,6 +78,47 @@ + + + + + 0 + 0 + + + + 30 + + + + + + + Configure + + + + + + + Voodoo 1 or 2 Graphics + + + + + + + Configure + + + + + + + IBM 8514/A Graphics + + + @@ -67,6 +126,13 @@ + + + + XGA Graphics + + + @@ -74,8 +140,22 @@ + + + + IBM PS/55 Display Adapter Graphics + + + + + + + Configure + + + - + 0 @@ -85,9 +165,9 @@ Monitor EDID - + - + @@ -111,9 +191,9 @@ - + - QLayout::SizeConstraint::SetNoConstraint + QLayout::SetNoConstraint @@ -123,7 +203,7 @@ - + 0 @@ -137,99 +217,6 @@ - - - - - 0 - 0 - - - - 30 - - - - - - - Qt::Orientation::Vertical - - - - 20 - 40 - - - - - - - - Configure - - - - - - - - 0 - 0 - - - - Configure - - - - - - - - 0 - 0 - - - - Video: - - - - - - - Configure - - - - - - - - 0 - 0 - - - - 30 - - - - - - - XGA Graphics - - - - - - - IBM PS/55 Display Adapter Graphics - - - @@ -240,6 +227,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + @@ -250,6 +250,23 @@ 1 + + comboBoxVideo + pushButtonConfigureVideo + comboBoxVideoSecondary + pushButtonConfigureVideoSecondary + checkBoxVoodoo + pushButtonConfigureVoodoo + checkBox8514 + pushButtonConfigure8514 + checkBoxXga + pushButtonConfigureXga + checkBoxDa2 + pushButtonConfigureDa2 + radioButtonDefault + pushButtonExportDefault + radioButtonCustom + diff --git a/src/qt/qt_settingsmachine.ui b/src/qt/qt_settingsmachine.ui index e14e113f8..fdfda37b6 100644 --- a/src/qt/qt_settingsmachine.ui +++ b/src/qt/qt_settingsmachine.ui @@ -41,144 +41,18 @@ 0 - - + + - Machine: + Search: - - - - CPU type: - - - - - - - - 0 - 0 - - - - - - - - Memory: - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - 30 - - - - - - - Frequency: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - 30 - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - 30 - - - - - - - PIT mode: - - - - - - - - 0 - 0 - - - - 30 - - - - - + + - + Machine type: @@ -191,17 +65,10 @@ - - - - 30 - - - - - + + - Wait states: + Machine: @@ -243,22 +110,155 @@ + + + + CPU type: + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + 30 + + + + + + + Frequency: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + 30 + + + + + + - + FPU: - - - - Search: + + + + 30 - - + + + + Wait states: + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + 30 + + + + + + + PIT mode: + + + + + + + + 0 + 0 + + + + 30 + + + + + + + + + + Memory: + + + + + + + + 0 + 0 + + + diff --git a/src/qt/qt_vmmanager_preferences.ui b/src/qt/qt_vmmanager_preferences.ui index 7f7b94fa4..7206b79bf 100644 --- a/src/qt/qt_vmmanager_preferences.ui +++ b/src/qt/qt_vmmanager_preferences.ui @@ -15,10 +15,10 @@ - QLayout::SizeConstraint::SetFixedSize + QLayout::SetFixedSize - + System Directory: @@ -146,7 +146,7 @@ - Qt::Orientation::Vertical + Qt::Vertical @@ -159,10 +159,10 @@ - Qt::Orientation::Horizontal + Qt::Horizontal - QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + QDialogButtonBox::Cancel|QDialogButtonBox::Ok From ad64553992233d4c31133423fc53dad6e96b8ab8 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Tue, 21 Oct 2025 16:14:21 +0500 Subject: [PATCH 046/113] Properly fix the workaround for OpenGL 3.0-3.1 It was incorrectly comparing the OpenGL version and the GLSL version, plus the pointer arithmetic broke with debug builds Also rename the misleadingly-named array and fix logging --- src/qt/qt_openglrenderer.cpp | 19 +++++++++---------- src/qt/qt_openglrenderer.hpp | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp index c8c2e2fc6..9b1233f7d 100644 --- a/src/qt/qt_openglrenderer.cpp +++ b/src/qt/qt_openglrenderer.cpp @@ -42,6 +42,8 @@ extern MainWindow* main_window; #include #include +#include +#define HAVE_STDARG_H #include "qt_openglrenderer.hpp" #include "qt_openglshadermanagerdialog.hpp" @@ -152,7 +154,7 @@ ogl3_log(const char *fmt, ...) if (ogl3_do_log) { va_start(ap, fmt); - ogl3_log_ex(fmt, ap); + pclog_ex(fmt, ap); va_end(ap); } } @@ -219,10 +221,7 @@ OpenGLRenderer::compile_shader(GLenum shader_type, const char *prepend, const ch snprintf(version, 49, "%s\n", versionRegex.match(progSource).captured(1).toLatin1().data()); progSource.remove(versionRegex); } else { - version_loc = ((char *) this->glslVersion.toLatin1().data()) + 9; - char glsl_ver[4] = { 0 }; - memcpy(glsl_ver, version_loc, 3); - int ver = atoi((char *) glsl_ver); + int ver = gl_version[0] * 100 + gl_version[1] * 10; if (ver == 300) ver = 130; else if (ver == 310) @@ -875,11 +874,11 @@ OpenGLRenderer::initialize() glw.initializeOpenGLFunctions(); ogl3_log("OpenGL information: [%s] %s (%s)\n", glw.glGetString(GL_VENDOR), glw.glGetString(GL_RENDERER), glw.glGetString(GL_VERSION)); - glsl_version[0] = glsl_version[1] = -1; - glw.glGetIntegerv(GL_MAJOR_VERSION, &glsl_version[0]); - glw.glGetIntegerv(GL_MINOR_VERSION, &glsl_version[1]); - if (glsl_version[0] < 3) { - throw opengl_init_error(tr("OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2").arg(glsl_version[0]).arg(glsl_version[1])); + gl_version[0] = gl_version[1] = -1; + glw.glGetIntegerv(GL_MAJOR_VERSION, &gl_version[0]); + glw.glGetIntegerv(GL_MINOR_VERSION, &gl_version[1]); + if (gl_version[0] < 3) { + throw opengl_init_error(tr("OpenGL version 3.0 or greater is required. Current GLSL version is %1.%2").arg(gl_version[0]).arg(gl_version[1])); } ogl3_log("Using OpenGL %s\n", glw.glGetString(GL_VERSION)); ogl3_log("Using Shading Language %s\n", glw.glGetString(GL_SHADING_LANGUAGE_VERSION)); diff --git a/src/qt/qt_openglrenderer.hpp b/src/qt/qt_openglrenderer.hpp index c2dc32917..22a8a17d3 100644 --- a/src/qt/qt_openglrenderer.hpp +++ b/src/qt/qt_openglrenderer.hpp @@ -102,7 +102,7 @@ private: void *unpackBuffer = nullptr; - int glsl_version[2] = { 0, 0 }; + int gl_version[2] = { 0, 0 }; void initialize(); void initializeExtensions(); From da70e8ab502481ca170ea63f109f9199be1b2b39 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Tue, 21 Oct 2025 16:15:21 +0500 Subject: [PATCH 047/113] Qt: Change the file picker button label to "Browse..." --- src/qt/languages/86box.pot | 3 --- src/qt/languages/cs-CZ.po | 5 +---- src/qt/languages/de-DE.po | 3 --- src/qt/languages/es-ES.po | 3 --- src/qt/languages/fi-FI.po | 3 --- src/qt/languages/fr-FR.po | 3 --- src/qt/languages/hr-HR.po | 5 +---- src/qt/languages/it-IT.po | 3 --- src/qt/languages/ja-JP.po | 5 +---- src/qt/languages/ko-KR.po | 3 --- src/qt/languages/nb-NO.po | 3 --- src/qt/languages/nl-NL.po | 3 --- src/qt/languages/pl-PL.po | 3 --- src/qt/languages/pt-BR.po | 3 --- src/qt/languages/pt-PT.po | 3 --- src/qt/languages/ru-RU.po | 3 --- src/qt/languages/sk-SK.po | 3 --- src/qt/languages/sl-SI.po | 3 --- src/qt/languages/sv-SE.po | 3 --- src/qt/languages/tr-TR.po | 3 --- src/qt/languages/uk-UA.po | 5 +---- src/qt/languages/vi-VN.po | 3 --- src/qt/languages/zh-CN.po | 3 --- src/qt/languages/zh-TW.po | 3 --- src/qt/qt_filefield.ui | 2 +- 25 files changed, 5 insertions(+), 77 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 9b6ce9399..54b87c64d 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -603,9 +603,6 @@ msgstr "" msgid "ID:" msgstr "" -msgid "&Specify..." -msgstr "" - msgid "Sectors:" msgstr "" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 03103a3e3..67cc395e6 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -603,9 +603,6 @@ msgstr "Kanál:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Zadat..." - msgid "Sectors:" msgstr "Sektory:" @@ -1714,7 +1711,7 @@ msgid "Remove" msgstr "Odstranit" msgid "Browse..." -msgstr "Browse..." +msgstr "Procházet..." msgid "Couldn't create OpenGL context." msgstr "Nepodařilo se vytvořit kontext OpenGL." diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index bdcddfe8d..151c1971c 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -603,9 +603,6 @@ msgstr "Kanal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Festlegen..." - msgid "Sectors:" msgstr "Sektoren:" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 2bf3f5181..099d7fb2e 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -603,9 +603,6 @@ msgstr "Canal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "E&specificar..." - msgid "Sectors:" msgstr "Sectores:" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 24102f071..010af305b 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -603,9 +603,6 @@ msgstr "Kanava:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Määritä..." - msgid "Sectors:" msgstr "Sektorit:" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index c98280f3b..a518bbebf 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -603,9 +603,6 @@ msgstr "Canal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Spécifier..." - msgid "Sectors:" msgstr "Secteurs:" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 0ea717dce..86dd3b73a 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -603,9 +603,6 @@ msgstr "Kanal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Odredi..." - msgid "Sectors:" msgstr "Sektori:" @@ -1714,7 +1711,7 @@ msgid "Remove" msgstr "Ukloni" msgid "Browse..." -msgstr "Pregledajte..." +msgstr "Pretraži..." msgid "Couldn't create OpenGL context." msgstr "Nije moguće stvoriti kontekst OpenGL." diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index a399c59e6..765bdd5d3 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -603,9 +603,6 @@ msgstr "Canale:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Specifica..." - msgid "Sectors:" msgstr "Settori:" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 5c6aa485c..5d725bb34 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -603,9 +603,6 @@ msgstr "チャンネル:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "参照(&S)..." - msgid "Sectors:" msgstr "セクター:" @@ -1714,7 +1711,7 @@ msgid "Remove" msgstr "削除" msgid "Browse..." -msgstr "ブラウズ..." +msgstr "参照..." msgid "Couldn't create OpenGL context." msgstr "OpenGLコンテキストを作成できませんでした。" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 4474138b2..b7d1669a9 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -603,9 +603,6 @@ msgstr "채널:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "열기(&S)..." - msgid "Sectors:" msgstr "섹터:" diff --git a/src/qt/languages/nb-NO.po b/src/qt/languages/nb-NO.po index 06b7a4f25..2524d991f 100644 --- a/src/qt/languages/nb-NO.po +++ b/src/qt/languages/nb-NO.po @@ -603,9 +603,6 @@ msgstr "Kanal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Angi..." - msgid "Sectors:" msgstr "Sektorer:" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index ee57f32a1..9f9c73a10 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -603,9 +603,6 @@ msgstr "Kanaal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Specificeer..." - msgid "Sectors:" msgstr "Sectoren:" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 4398dcafb..838434b55 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -603,9 +603,6 @@ msgstr "Kanał:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Określ..." - msgid "Sectors:" msgstr "Sektory:" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 010005780..e3bad48e4 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -603,9 +603,6 @@ msgstr "Canal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Especificar..." - msgid "Sectors:" msgstr "Setores:" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index a33ba0119..af9500c16 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -603,9 +603,6 @@ msgstr "Canal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Especificar..." - msgid "Sectors:" msgstr "Sectores:" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 2d71499dc..4f60516e3 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -603,9 +603,6 @@ msgstr "Канал:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Указать..." - msgid "Sectors:" msgstr "Секторы:" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 436c8c674..c25253d8c 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -603,9 +603,6 @@ msgstr "Kanál:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Zadať..." - msgid "Sectors:" msgstr "Sektory:" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 8ef710a15..12660fce7 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -603,9 +603,6 @@ msgstr "Kanal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Določi..." - msgid "Sectors:" msgstr "Sektorji:" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index 6f014e2dd..46b1c6e43 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -603,9 +603,6 @@ msgstr "Kanal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Specificera..." - msgid "Sectors:" msgstr "Sektorer:" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 073572e1b..c9d980bc9 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -603,9 +603,6 @@ msgstr "Kanal:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Belirle..." - msgid "Sectors:" msgstr "Sektörler:" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 8228b7ae4..00fb49fe8 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -603,9 +603,6 @@ msgstr "Канал:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "&Вказати..." - msgid "Sectors:" msgstr "Сектора:" @@ -1714,7 +1711,7 @@ msgid "Remove" msgstr "Видалити" msgid "Browse..." -msgstr "Переглянути..." +msgstr "Огляд..." msgid "Couldn't create OpenGL context." msgstr "Не вдалося створити контекст OpenGL." diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 24decb522..471f8e9a3 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -603,9 +603,6 @@ msgstr "Kênh:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "Chỉ &rõ..." - msgid "Sectors:" msgstr "Sector:" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 48ffc0dc9..bd11441c5 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -603,9 +603,6 @@ msgstr "通道:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "指定(&S)..." - msgid "Sectors:" msgstr "扇区(S):" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 1732cb914..7544557c6 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -603,9 +603,6 @@ msgstr "通道:" msgid "ID:" msgstr "ID:" -msgid "&Specify..." -msgstr "指定(&S)..." - msgid "Sectors:" msgstr "磁區(S):" diff --git a/src/qt/qt_filefield.ui b/src/qt/qt_filefield.ui index 3a1e3e753..91000af50 100644 --- a/src/qt/qt_filefield.ui +++ b/src/qt/qt_filefield.ui @@ -51,7 +51,7 @@ - &Specify... + Browse... From adc5680073720511c2e129c2c338b17152397836 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Tue, 21 Oct 2025 21:07:59 +0500 Subject: [PATCH 048/113] es-ES.po: Fix a duplicate message warning --- src/qt/languages/es-ES.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index d1953bcf8..64bb8b526 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -891,7 +891,7 @@ msgstr "Mando de 4 ejes, 4 botones" msgid "2-button gamepad(s)" msgstr "Mando(s) de juegos de 2 botones" -msgid "4-button gamepad" +msgid "3-button gamepad" msgstr "Mando de juegos de 3 botones" msgid "4-button gamepad" From 7f9f2db2fdf61f56eaea1d0f410964426a650ed3 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 21 Oct 2025 12:53:52 -0400 Subject: [PATCH 049/113] Throttle fixes --- src/game/joystick_standard.c | 43 +++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/game/joystick_standard.c b/src/game/joystick_standard.c index 59b3460a2..c0497b05a 100644 --- a/src/game/joystick_standard.c +++ b/src/game/joystick_standard.c @@ -267,9 +267,30 @@ joystick_standard_read_axis_3axis(UNUSED(void *priv), int axis) return joystick_state[gp][0].axis[0]; case 1: return joystick_state[gp][0].axis[1]; - case 2: + case 2: // Rudder Axis return joystick_state[gp][0].axis[2]; - case 3: + case 3: // Throttle Axis + default: + return 0; + } +} + +static int +joystick_standard_read_axis_3axis_throttle(UNUSED(void *priv), int axis) +{ + uint8_t gp = 0; + + if (!JOYSTICK_PRESENT(gp, 0)) + return AXIS_NOT_PRESENT; + + switch (axis) { + case 0: + return joystick_state[gp][0].axis[0]; + case 1: + return joystick_state[gp][0].axis[1]; + case 3: // Throttle Axis + return joystick_state[gp][0].axis[2]; + case 2: // Rudder Axis default: return 0; } @@ -288,10 +309,10 @@ joystick_standard_read_axis_4axis(UNUSED(void *priv), int axis) return joystick_state[gp][0].axis[0]; case 1: return joystick_state[gp][0].axis[1]; - case 2: - return joystick_state[gp][0].axis[2]; - case 3: + case 2: // Rudder Axis return joystick_state[gp][0].axis[3]; + case 3: // Throttle Axis + return joystick_state[gp][0].axis[2]; default: return 0; } @@ -487,7 +508,7 @@ const joystick_t joystick_3axis_2button = { .close = joystick_standard_close, .read = joystick_standard_read, .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, + .read_axis = joystick_standard_read_axis_3axis_throttle, .a0_over = joystick_standard_a0_over, .axis_count = 3, .button_count = 2, @@ -505,7 +526,7 @@ const joystick_t joystick_3axis_3button = { .close = joystick_standard_close, .read = joystick_standard_read_3button, .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, + .read_axis = joystick_standard_read_axis_3axis_throttle, .a0_over = joystick_standard_a0_over, .axis_count = 3, .button_count = 3, @@ -523,7 +544,7 @@ const joystick_t joystick_3axis_4button = { .close = joystick_standard_close, .read = joystick_standard_read_4button, .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, + .read_axis = joystick_standard_read_axis_3axis_throttle, .a0_over = joystick_standard_a0_over, .axis_count = 3, .button_count = 4, @@ -740,7 +761,7 @@ const joystick_t joystick_2button_yoke_throttle = { .close = joystick_standard_close, .read = joystick_standard_read, .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, + .read_axis = joystick_standard_read_axis_3axis_throttle, .a0_over = joystick_standard_a0_over, .axis_count = 3, .button_count = 2, @@ -758,7 +779,7 @@ const joystick_t joystick_3button_yoke_throttle = { .close = joystick_standard_close, .read = joystick_standard_read_3button, .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, + .read_axis = joystick_standard_read_axis_3axis_throttle, .a0_over = joystick_standard_a0_over, .axis_count = 3, .button_count = 3, @@ -776,7 +797,7 @@ const joystick_t joystick_4button_yoke_throttle = { .close = joystick_standard_close, .read = joystick_standard_read_4button, .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, + .read_axis = joystick_standard_read_axis_3axis_throttle, .a0_over = joystick_standard_a0_over, .axis_count = 3, .button_count = 4, From 6339f65087412b84ae69156036233cfcc6c486cb Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 21 Oct 2025 14:04:17 -0400 Subject: [PATCH 050/113] Swap axis names on CH products things with pedals --- src/game/joystick_ch_flightstick_pro.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/game/joystick_ch_flightstick_pro.c b/src/game/joystick_ch_flightstick_pro.c index 5c35b85a8..4d8a4cf29 100644 --- a/src/game/joystick_ch_flightstick_pro.c +++ b/src/game/joystick_ch_flightstick_pro.c @@ -256,7 +256,7 @@ const joystick_t joystick_ch_flightstick_ch_pedals = { .button_count = 2, .pov_count = 0, .max_joysticks = 1, - .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Rudder (Yaw)", "Throttle" }, .button_names = { "Trigger", "Button 2" }, .pov_names = { NULL } }; @@ -274,7 +274,7 @@ const joystick_t joystick_ch_flightstick_ch_pedals_pro = { .button_count = 2, .pov_count = 0, .max_joysticks = 1, - .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Right Pedal", "Left Pedal" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Left Pedal", "Right Pedal" }, .button_names = { "Trigger", "Button 2" }, .pov_names = { NULL } }; @@ -310,7 +310,7 @@ const joystick_t joystick_ch_flightstick_pro_ch_pedals = { .button_count = 4, .pov_count = 1, .max_joysticks = 1, - .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Rudder (Yaw)", "Throttle" }, .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; @@ -328,7 +328,7 @@ const joystick_t joystick_ch_flightstick_pro_ch_pedals_pro = { .button_count = 4, .pov_count = 1, .max_joysticks = 1, - .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Right Pedal", "Left Pedal" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Left Pedal", "Right Pedal" }, .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; @@ -364,7 +364,7 @@ const joystick_t joystick_ch_virtual_pilot_ch_pedals = { .button_count = 2, .pov_count = 0, .max_joysticks = 1, - .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Rudder (Yaw)", "Throttle" }, .button_names = { "Button 1", "Button 2" }, .pov_names = { NULL } }; @@ -382,7 +382,7 @@ const joystick_t joystick_ch_virtual_pilot_ch_pedals_pro = { .button_count = 2, .pov_count = 0, .max_joysticks = 1, - .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Right Pedal", "Left Pedal" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Left Pedal", "Right Pedal" }, .button_names = { "Button 1", "Button 2" }, .pov_names = { NULL } }; @@ -418,7 +418,7 @@ const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals = { .button_count = 6, .pov_count = 2, .max_joysticks = 1, - .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Rudder (Yaw)", "Throttle" }, .button_names = { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6" }, .pov_names = { "Right POV", "Left POV" } }; @@ -436,7 +436,7 @@ const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals_pro = { .button_count = 6, .pov_count = 2, .max_joysticks = 1, - .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Right Pedal", "Left Pedal" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Left Pedal", "Right Pedal" }, .button_names = { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6" }, .pov_names = { "Right POV", "Left POV" } }; From b36381e76cce06d82aee3a23401b4b62d3b454ea Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 21 Oct 2025 16:46:09 -0400 Subject: [PATCH 051/113] Share Joystick code --- src/game/joystick_ch_flightstick_pro.c | 217 ++++++++----------------- src/game/joystick_standard.c | 38 +++-- src/game/joystick_tm_fcs.c | 68 ++------ src/include/86box/joystick.h | 27 +++ 4 files changed, 133 insertions(+), 217 deletions(-) create mode 100644 src/include/86box/joystick.h diff --git a/src/game/joystick_ch_flightstick_pro.c b/src/game/joystick_ch_flightstick_pro.c index 4d8a4cf29..cefb86e73 100644 --- a/src/game/joystick_ch_flightstick_pro.c +++ b/src/game/joystick_ch_flightstick_pro.c @@ -44,34 +44,7 @@ #include <86box/timer.h> #include <86box/gameport.h> #include <86box/plat_unused.h> - -static void * -ch_flightstick_pro_init(void) -{ - return NULL; -} - -static void -ch_flightstick_pro_close(UNUSED(void *priv)) -{ - // -} - -static uint8_t -ch_flightstick_read(UNUSED(void *priv)) -{ - uint8_t ret = 0xf0; - uint8_t gp = 0; - - if (JOYSTICK_PRESENT(gp, 0)) { - if (joystick_state[gp][0].button[0]) - ret &= ~0x10; - if (joystick_state[gp][0].button[1]) - ret &= ~0x20; - } - - return ret; -} +#include <86box/joystick.h> static uint8_t ch_flightstick_pro_read(UNUSED(void *priv)) @@ -169,71 +142,15 @@ ch_virtual_pilot_pro_read(UNUSED(void *priv)) return ret; } -static void -ch_flightstick_pro_write(UNUSED(void *priv)) -{ - // -} - -static int -ch_flightstick_pro_read_axis(UNUSED(void *priv), int axis) -{ - uint8_t gp = 0; - - if (!JOYSTICK_PRESENT(gp, 0)) - return AXIS_NOT_PRESENT; - - switch (axis) { - case 0: - return joystick_state[gp][0].axis[0]; - case 1: - return joystick_state[gp][0].axis[1]; - case 2: - return 0; - case 3: - return joystick_state[gp][0].axis[2]; - default: - return 0; - } -} - -static int -ch_flightstick_pro_ch_pedals_read_axis(UNUSED(void *priv), int axis) -{ - uint8_t gp = 0; - - if (!JOYSTICK_PRESENT(gp, 0)) - return AXIS_NOT_PRESENT; - - switch (axis) { - case 0: - return joystick_state[gp][0].axis[0]; - case 1: - return joystick_state[gp][0].axis[1]; - case 2: - return joystick_state[gp][0].axis[3]; - case 3: - return joystick_state[gp][0].axis[2]; - default: - return 0; - } -} - -static void -ch_flightstick_pro_a0_over(UNUSED(void *priv)) -{ - // -} - const joystick_t joystick_ch_flightstick = { .name = "CH Flightstick", .internal_name = "ch_flightstick", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, - .read = ch_flightstick_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, .axis_count = 3, .button_count = 2, .pov_count = 0, @@ -246,12 +163,12 @@ const joystick_t joystick_ch_flightstick = { const joystick_t joystick_ch_flightstick_ch_pedals = { .name = "CH Flightstick + CH Pedals", .internal_name = "ch_flightstick_ch_pedals", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, - .read = ch_flightstick_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_ch_pedals_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, .axis_count = 4, .button_count = 2, .pov_count = 0, @@ -264,12 +181,12 @@ const joystick_t joystick_ch_flightstick_ch_pedals = { const joystick_t joystick_ch_flightstick_ch_pedals_pro = { .name = "CH Flightstick + CH Pedals Pro", .internal_name = "ch_flightstick_ch_pedals_pro", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, - .read = ch_flightstick_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_ch_pedals_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, .axis_count = 4, .button_count = 2, .pov_count = 0, @@ -282,12 +199,12 @@ const joystick_t joystick_ch_flightstick_ch_pedals_pro = { const joystick_t joystick_ch_flightstick_pro = { .name = "CH Flightstick Pro", .internal_name = "ch_flightstick_pro", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, + .init = joystick_standard_init, + .close = joystick_standard_close, .read = ch_flightstick_pro_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, .axis_count = 3, .button_count = 4, .pov_count = 1, @@ -300,12 +217,12 @@ const joystick_t joystick_ch_flightstick_pro = { const joystick_t joystick_ch_flightstick_pro_ch_pedals = { .name = "CH Flightstick Pro + CH Pedals", .internal_name = "ch_flightstick_pro_ch_pedals", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, + .init = joystick_standard_init, + .close = joystick_standard_close, .read = ch_flightstick_pro_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_ch_pedals_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, .axis_count = 4, .button_count = 4, .pov_count = 1, @@ -318,12 +235,12 @@ const joystick_t joystick_ch_flightstick_pro_ch_pedals = { const joystick_t joystick_ch_flightstick_pro_ch_pedals_pro = { .name = "CH Flightstick Pro + CH Pedals Pro", .internal_name = "ch_flightstick_pro_ch_pedals_pro", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, + .init = joystick_standard_init, + .close = joystick_standard_close, .read = ch_flightstick_pro_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_ch_pedals_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, .axis_count = 4, .button_count = 4, .pov_count = 1, @@ -336,12 +253,12 @@ const joystick_t joystick_ch_flightstick_pro_ch_pedals_pro = { const joystick_t joystick_ch_virtual_pilot = { .name = "CH Virtual Pilot", .internal_name = "ch_virtual_pilot", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, - .read = ch_flightstick_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, .axis_count = 3, .button_count = 2, .pov_count = 0, @@ -354,12 +271,12 @@ const joystick_t joystick_ch_virtual_pilot = { const joystick_t joystick_ch_virtual_pilot_ch_pedals = { .name = "CH Virtual Pilot + CH Pedals", .internal_name = "ch_virtual_pilot_ch_pedals", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, - .read = ch_flightstick_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_ch_pedals_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, .axis_count = 4, .button_count = 2, .pov_count = 0, @@ -372,12 +289,12 @@ const joystick_t joystick_ch_virtual_pilot_ch_pedals = { const joystick_t joystick_ch_virtual_pilot_ch_pedals_pro = { .name = "CH Virtual Pilot + CH Pedals Pro", .internal_name = "ch_virtual_pilot_ch_pedals_pro", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, - .read = ch_flightstick_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_ch_pedals_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_2button, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, .axis_count = 4, .button_count = 2, .pov_count = 0, @@ -390,12 +307,12 @@ const joystick_t joystick_ch_virtual_pilot_ch_pedals_pro = { const joystick_t joystick_ch_virtual_pilot_pro = { .name = "CH Virtual Pilot Pro", .internal_name = "ch_virtual_pilot_pro", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, + .init = joystick_standard_init, + .close = joystick_standard_close, .read = ch_virtual_pilot_pro_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_3axis_throttle, + .a0_over = joystick_standard_a0_over, .axis_count = 3, .button_count = 6, .pov_count = 2, @@ -408,12 +325,12 @@ const joystick_t joystick_ch_virtual_pilot_pro = { const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals = { .name = "CH Virtual Pilot Pro + CH Pedals", .internal_name = "ch_virtual_pilot_pro_ch_pedals", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, + .init = joystick_standard_init, + .close = joystick_standard_close, .read = ch_virtual_pilot_pro_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_ch_pedals_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, .axis_count = 4, .button_count = 6, .pov_count = 2, @@ -426,12 +343,12 @@ const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals = { const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals_pro = { .name = "CH Virtual Pilot Pro + CH Pedals Pro", .internal_name = "ch_virtual_pilot_pro_ch_pedals_pro", - .init = ch_flightstick_pro_init, - .close = ch_flightstick_pro_close, + .init = joystick_standard_init, + .close = joystick_standard_close, .read = ch_virtual_pilot_pro_read, - .write = ch_flightstick_pro_write, - .read_axis = ch_flightstick_pro_ch_pedals_read_axis, - .a0_over = ch_flightstick_pro_a0_over, + .write = joystick_standard_write, + .read_axis = joystick_standard_read_axis_4axis, + .a0_over = joystick_standard_a0_over, .axis_count = 4, .button_count = 6, .pov_count = 2, diff --git a/src/game/joystick_standard.c b/src/game/joystick_standard.c index c0497b05a..a9e3da402 100644 --- a/src/game/joystick_standard.c +++ b/src/game/joystick_standard.c @@ -45,13 +45,13 @@ #include <86box/gameport.h> #include <86box/plat_unused.h> -static void * +void * joystick_standard_init(void) { return NULL; } -static void +void joystick_standard_close(UNUSED(void *priv)) { // @@ -101,6 +101,22 @@ joystick_standard_read(UNUSED(void *priv)) return ret; } +uint8_t +joystick_standard_read_2button(UNUSED(void *priv)) +{ + uint8_t gp = 0; + uint8_t ret = 0xf0; + + if (JOYSTICK_PRESENT(gp, 0)) { + if (joystick_state[gp][0].button[0]) + ret &= ~0x10; + if (joystick_state[gp][0].button[1]) + ret &= ~0x20; + } + + return ret; +} + static uint8_t joystick_standard_read_3button(UNUSED(void *priv)) { @@ -119,7 +135,7 @@ joystick_standard_read_3button(UNUSED(void *priv)) return ret; } -static uint8_t +uint8_t joystick_standard_read_4button(UNUSED(void *priv)) { uint8_t gp = 0; @@ -139,7 +155,7 @@ joystick_standard_read_4button(UNUSED(void *priv)) return ret; } -static void +void joystick_standard_write(UNUSED(void *priv)) { // @@ -275,7 +291,7 @@ joystick_standard_read_axis_3axis(UNUSED(void *priv), int axis) } } -static int +int joystick_standard_read_axis_3axis_throttle(UNUSED(void *priv), int axis) { uint8_t gp = 0; @@ -296,7 +312,7 @@ joystick_standard_read_axis_3axis_throttle(UNUSED(void *priv), int axis) } } -static int +int joystick_standard_read_axis_4axis(UNUSED(void *priv), int axis) { uint8_t gp = 0; @@ -369,7 +385,7 @@ joystick_standard_read_axis_8button(UNUSED(void *priv), int axis) } } -static void +void joystick_standard_a0_over(UNUSED(void *priv)) { // @@ -506,7 +522,7 @@ const joystick_t joystick_3axis_2button = { .internal_name = "3axis_2button", .init = joystick_standard_init, .close = joystick_standard_close, - .read = joystick_standard_read, + .read = joystick_standard_read_2button, .write = joystick_standard_write, .read_axis = joystick_standard_read_axis_3axis_throttle, .a0_over = joystick_standard_a0_over, @@ -560,7 +576,7 @@ const joystick_t joystick_4axis_2button = { .internal_name = "4axis_2button", .init = joystick_standard_init, .close = joystick_standard_close, - .read = joystick_standard_read, + .read = joystick_standard_read_2button, .write = joystick_standard_write, .read_axis = joystick_standard_read_axis_4axis, .a0_over = joystick_standard_a0_over, @@ -759,7 +775,7 @@ const joystick_t joystick_2button_yoke_throttle = { .internal_name = "2button_yoke_throttle", .init = joystick_standard_init, .close = joystick_standard_close, - .read = joystick_standard_read, + .read = joystick_standard_read_2button, .write = joystick_standard_write, .read_axis = joystick_standard_read_axis_3axis_throttle, .a0_over = joystick_standard_a0_over, @@ -813,7 +829,7 @@ const joystick_t joystick_steering_wheel_2_button = { .internal_name = "steering_wheel_2_button", .init = joystick_standard_init, .close = joystick_standard_close, - .read = joystick_standard_read, + .read = joystick_standard_read_2button, .write = joystick_standard_write, .read_axis = joystick_standard_read_axis_3axis, .a0_over = joystick_standard_a0_over, diff --git a/src/game/joystick_tm_fcs.c b/src/game/joystick_tm_fcs.c index 93f54db36..1f420ef0c 100644 --- a/src/game/joystick_tm_fcs.c +++ b/src/game/joystick_tm_fcs.c @@ -44,44 +44,7 @@ #include <86box/timer.h> #include <86box/gameport.h> #include <86box/plat_unused.h> - -static void * -tm_fcs_init(void) -{ - return NULL; -} - -static void -tm_fcs_close(UNUSED(void *priv)) -{ - // -} - -static uint8_t -tm_fcs_read(UNUSED(void *priv)) -{ - uint8_t gp = 0; - uint8_t ret = 0xf0; - - if (JOYSTICK_PRESENT(gp, 0)) { - if (joystick_state[gp][0].button[0]) - ret &= ~0x10; - if (joystick_state[gp][0].button[1]) - ret &= ~0x20; - if (joystick_state[gp][0].button[2]) - ret &= ~0x40; - if (joystick_state[gp][0].button[3]) - ret &= ~0x80; - } - - return ret; -} - -static void -tm_fcs_write(UNUSED(void *priv)) -{ - // -} +#include <86box/joystick.h> static int tm_fcs_read_axis(UNUSED(void *priv), int axis) @@ -96,8 +59,6 @@ tm_fcs_read_axis(UNUSED(void *priv), int axis) return joystick_state[gp][0].axis[0]; case 1: return joystick_state[gp][0].axis[1]; - case 2: - return 0; case 3: if (joystick_state[gp][0].pov[0] == -1) return 32767; @@ -110,6 +71,7 @@ tm_fcs_read_axis(UNUSED(void *priv), int axis) if (joystick_state[gp][0].pov[0] >= 225 && joystick_state[gp][0].pov[0] < 315) return 16384; return 0; + case 2: default: return 0; } @@ -147,21 +109,15 @@ tm_fcs_rcs_read_axis(UNUSED(void *priv), int axis) } } -static void -tm_fcs_a0_over(UNUSED(void *priv)) -{ - // -} - const joystick_t joystick_tm_fcs = { .name = "Thrustmaster Flight Control System", .internal_name = "thrustmaster_fcs", - .init = tm_fcs_init, - .close = tm_fcs_close, - .read = tm_fcs_read, - .write = tm_fcs_write, + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, .read_axis = tm_fcs_read_axis, - .a0_over = tm_fcs_a0_over, + .a0_over = joystick_standard_a0_over, .axis_count = 2, .button_count = 4, .pov_count = 1, @@ -174,12 +130,12 @@ const joystick_t joystick_tm_fcs = { const joystick_t joystick_tm_fcs_rcs = { .name = "Thrustmaster FCS + Rudder Control System", .internal_name = "thrustmaster_fcs_rcs", - .init = tm_fcs_init, - .close = tm_fcs_close, - .read = tm_fcs_read, - .write = tm_fcs_write, + .init = joystick_standard_init, + .close = joystick_standard_close, + .read = joystick_standard_read_4button, + .write = joystick_standard_write, .read_axis = tm_fcs_rcs_read_axis, - .a0_over = tm_fcs_a0_over, + .a0_over = joystick_standard_a0_over, .axis_count = 3, .button_count = 4, .pov_count = 1, diff --git a/src/include/86box/joystick.h b/src/include/86box/joystick.h new file mode 100644 index 000000000..c8cbf32d1 --- /dev/null +++ b/src/include/86box/joystick.h @@ -0,0 +1,27 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Definitions for the analog joystick handlers. + * + * Authors: Jasmine Iwanek, + * + * Copyright 2025 Jasmine Iwanek. + */ +#ifndef EMU_JOYSTICK_H +#define EMU_JOYSTICK_H + +void *joystick_standard_init(void); +void joystick_standard_close(UNUSED(void *priv)); +uint8_t joystick_standard_read_2button(UNUSED(void *priv)); +uint8_t joystick_standard_read_4button(UNUSED(void *priv)); +void joystick_standard_write(UNUSED(void *priv)); +int joystick_standard_read_axis_3axis_throttle(UNUSED(void *priv), int axis); +int joystick_standard_read_axis_4axis(UNUSED(void *priv), int axis); +void joystick_standard_a0_over(UNUSED(void *priv)); + +#endif /*EMU_JOYSTICK_H*/ From 43db1f3dfe8008ea330a34282980de55af69aa3a Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 21 Oct 2025 18:01:07 -0400 Subject: [PATCH 052/113] Fix typo in gameport.h --- src/include/86box/gameport.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/include/86box/gameport.h b/src/include/86box/gameport.h index 878472a55..a1bec69fb 100644 --- a/src/include/86box/gameport.h +++ b/src/include/86box/gameport.h @@ -183,7 +183,7 @@ extern const joystick_t joystick_2axis_4button; extern const joystick_t joystick_2axis_6button; extern const joystick_t joystick_2axis_8button; -// 2 axis Generic Joysticks +// 3 axis Generic Joysticks extern const joystick_t joystick_3axis_2button; extern const joystick_t joystick_3axis_3button; extern const joystick_t joystick_3axis_4button; From 9c20533d829eb81b7dc09f28cf7d6e394ec6b658 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 21 Oct 2025 20:24:03 -0400 Subject: [PATCH 053/113] Correct Throttle and Rudder order on ch pedals --- src/game/joystick_ch_flightstick_pro.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game/joystick_ch_flightstick_pro.c b/src/game/joystick_ch_flightstick_pro.c index cefb86e73..dc82feb8b 100644 --- a/src/game/joystick_ch_flightstick_pro.c +++ b/src/game/joystick_ch_flightstick_pro.c @@ -173,7 +173,7 @@ const joystick_t joystick_ch_flightstick_ch_pedals = { .button_count = 2, .pov_count = 0, .max_joysticks = 1, - .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Rudder (Yaw)", "Throttle" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, .button_names = { "Trigger", "Button 2" }, .pov_names = { NULL } }; @@ -227,7 +227,7 @@ const joystick_t joystick_ch_flightstick_pro_ch_pedals = { .button_count = 4, .pov_count = 1, .max_joysticks = 1, - .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Rudder (Yaw)", "Throttle" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, .button_names = { "Trigger", "Button 2", "Button 3", "Button 4" }, .pov_names = { "POV" } }; @@ -281,7 +281,7 @@ const joystick_t joystick_ch_virtual_pilot_ch_pedals = { .button_count = 2, .pov_count = 0, .max_joysticks = 1, - .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Rudder (Yaw)", "Throttle" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, .button_names = { "Button 1", "Button 2" }, .pov_names = { NULL } }; @@ -335,7 +335,7 @@ const joystick_t joystick_ch_virtual_pilot_pro_ch_pedals = { .button_count = 6, .pov_count = 2, .max_joysticks = 1, - .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Rudder (Yaw)", "Throttle" }, + .axis_names = { "X axis (Roll)", "Y axis (Pitch)", "Throttle", "Rudder (Yaw)" }, .button_names = { "Button 1", "Button 2", "Button 3", "Button 4", "Button 5", "Button 6" }, .pov_names = { "Right POV", "Left POV" } }; From 52e22e90fcd631a9bf8e3b9733e72277a48bf73d Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Tue, 21 Oct 2025 20:29:46 -0500 Subject: [PATCH 054/113] AD1848: I12 bit 4 is read-only, fixes CODEC detection in OS/2 driver --- src/sound/snd_ad1848.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/snd_ad1848.c b/src/sound/snd_ad1848.c index 6c32b1892..62c3e35e9 100644 --- a/src/sound/snd_ad1848.c +++ b/src/sound/snd_ad1848.c @@ -344,7 +344,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) case 12: if (ad1848->type >= AD1848_TYPE_CS4248) { - ad1848->regs[12] = 0x80 | (val & 0x70) | (ad1848->regs[12] & 0x0f); + ad1848->regs[12] = 0x80 | (val & 0x60) | (ad1848->regs[12] & 0x0f); if ((ad1848->type >= AD1848_TYPE_CS4231) && (ad1848->type < AD1848_TYPE_CS4235)) { if (val & 0x40) ad1848->fmt_mask |= 0x80; From ceeb2d057dcaf49c24edfe4fbf6bd87424a11dc0 Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Tue, 21 Oct 2025 20:32:13 -0500 Subject: [PATCH 055/113] AD1848: I18/I19 directly control FM volume on CS4232/4236 non-B --- src/sound/snd_ad1848.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/sound/snd_ad1848.c b/src/sound/snd_ad1848.c index 62c3e35e9..ebfa9423b 100644 --- a/src/sound/snd_ad1848.c +++ b/src/sound/snd_ad1848.c @@ -425,6 +425,19 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) ad1848->fm_vol_r = (int) ad1848_vols_5bits_aux_gain[val & 0x1f]; } } + if ((ad1848->type >= AD1848_TYPE_CS4232) && (ad1848->type <= AD1848_TYPE_CS4236)) { + if (ad1848->index == 18) { + if (val & 0x80) + ad1848->fm_vol_l = 0; + else + ad1848->fm_vol_l = (int) ad1848_vols_5bits_aux_gain[val & 0x1f]; + } else { + if (val & 0x80) + ad1848->fm_vol_r = 0; + else + ad1848->fm_vol_r = (int) ad1848_vols_5bits_aux_gain[val & 0x1f]; + } + } break; case 20 ... 21: From 71fe92daed87ba1f6ead953d2f50c8c1f94ea8e3 Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Tue, 21 Oct 2025 20:34:09 -0500 Subject: [PATCH 056/113] AD1848: I23 bits 7-1 are read-only on CS4232/4236 non-B, fixes CS4236 non-B detection on Windows 2000 --- src/sound/snd_ad1848.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sound/snd_ad1848.c b/src/sound/snd_ad1848.c index ebfa9423b..c25890c50 100644 --- a/src/sound/snd_ad1848.c +++ b/src/sound/snd_ad1848.c @@ -521,6 +521,8 @@ readonly_x: } if (ad1848->type == AD1848_TYPE_CS4231) /* I23 is reserved and read-only on CS4231 non-A */ goto readonly_i; + if ((ad1848->type >= AD1848_TYPE_CS4232) || (ad1848->type <= AD1848_TYPE_CS4236)) /* I23 bits 7-1 are read-only on CS4231A/4232/4236 non-B, Win2k relies on this for detection */ + val = (val & 0x01); break; case 24: From 755e25285b55f781757010e4e59e632dd0e6116c Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Tue, 21 Oct 2025 20:38:21 -0500 Subject: [PATCH 057/113] CS423x: Always enable OPL3 on CS4232/4236 during context switch as they lack X registers --- src/sound/snd_cs423x.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/sound/snd_cs423x.c b/src/sound/snd_cs423x.c index 15ad71782..6c0d9e80b 100644 --- a/src/sound/snd_cs423x.c +++ b/src/sound/snd_cs423x.c @@ -568,7 +568,11 @@ cs423x_ctxswitch_write(uint16_t addr, UNUSED(uint8_t val), void *priv) { cs423x_t *dev = (cs423x_t *) priv; uint8_t ctx = (dev->regs[7] & 0x80); - uint8_t enable_opl = (dev->ad1848.xregs[4] & 0x10) && !(dev->indirect_regs[2] & 0x85); + uint8_t enable_opl = (dev->ad1848.xregs[4] & 0x10) && !(dev->indirect_regs[2] & 0x85); /* CS4236B+ */ + + /* CS4232/4236 (non-B) doesn't have an IFM bit, always enable the OPL on these chips */ + if (dev->type <= CRYSTAL_CS4236) + enable_opl = 1; /* Check if a context switch (WSS=1 <-> SBPro=0) occurred through the address being written. */ if ((dev->regs[7] & 0x80) ? ((addr & 0xfff0) == dev->sb_base) : ((addr & 0xfffc) == dev->wss_base)) { From 429aa7260c507f14c138e3dc841e5e420e19ad2c Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Tue, 21 Oct 2025 20:40:18 -0500 Subject: [PATCH 058/113] CS423x: Add SBPro OPL3 music handler during SBPro init, fixes OPL3 in SBPro context --- src/sound/snd_cs423x.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sound/snd_cs423x.c b/src/sound/snd_cs423x.c index 6c0d9e80b..78b628b3b 100644 --- a/src/sound/snd_cs423x.c +++ b/src/sound/snd_cs423x.c @@ -1009,6 +1009,7 @@ cs423x_init(const device_t *info) /* Initialize SBPro codec. The WSS codec is initialized later by cs423x_reset */ dev->sb = device_add_inst(&sb_pro_compat_device, 1); sound_set_cd_audio_filter(sbpro_filter_cd_audio, dev->sb); /* CD audio filter for the default context */ + music_add_handler(sb_get_music_buffer_sbpro, dev->sb); /* Init the SBPro OPL3 since sb_pro_compat_init does not */ /* Initialize RAM, registers and WSS codec. */ cs423x_reset(dev); From cee8fa0ae40287561be6dda9677aeeb76be1af1e Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 22 Sep 2025 00:22:32 -0400 Subject: [PATCH 059/113] Allow PCjr FDC to be disabled --- src/include/86box/m_pcjr.h | 3 +++ src/machine/m_pcjr.c | 10 +++++++++- src/machine/machine_table.c | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/include/86box/m_pcjr.h b/src/include/86box/m_pcjr.h index 6fb0ee2ed..9b4a7cbaf 100644 --- a/src/include/86box/m_pcjr.h +++ b/src/include/86box/m_pcjr.h @@ -66,6 +66,9 @@ typedef struct pcjr_s { int serial_pos; uint8_t pa; uint8_t pb; + + uint8_t option_fdc; + pc_timer_t send_delay_timer; } pcjr_t; diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 519933b23..c1b7aba9b 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -41,6 +41,7 @@ #include <86box/rom.h> #include <86box/fdd.h> #include <86box/fdc.h> +#include <86box/fdc_ext.h> #include <86box/sound.h> #include <86box/snd_speaker.h> #include <86box/snd_sn76489.h> @@ -653,6 +654,8 @@ kbd_read(uint16_t port, void *priv) case 0x62: ret = (pcjr->latched ? 1 : 0); ret |= 0x02; /* Modem card not installed */ + if (!pcjr->option_fdc) + ret |= 0x04; /* Diskette card not installed */ if (mem_size < 128) ret |= 0x08; /* 64k expansion card not installed */ if ((pcjr->pb & 0x08) || (cassette == NULL)) @@ -846,6 +849,8 @@ machine_pcjr_init(UNUSED(const machine_t *model)) pcjr = calloc(1, sizeof(pcjr_t)); + pcjr->option_fdc = 0; + is_pcjr = 1; pic_init_pcjr(); @@ -877,7 +882,10 @@ machine_pcjr_init(UNUSED(const machine_t *model)) nmi_mask = 0x80; - device_add(&fdc_pcjr_device); + if (fdc_current[0] == FDC_INTERNAL) { + device_add(&fdc_pcjr_device); + pcjr->option_fdc = 1; + } device_add(&ns8250_pcjr_device); /* So that serial_standalone_init() won't do anything. */ diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 6bb120b03..8816ce42c 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -300,7 +300,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_PCJR, - .flags = MACHINE_VIDEO_FIXED | MACHINE_KEYBOARD | MACHINE_CARTRIDGE, + .flags = MACHINE_VIDEO_FIXED | MACHINE_KEYBOARD | MACHINE_CARTRIDGE | MACHINE_FDC, .ram = { .min = 64, .max = 640, @@ -316,7 +316,7 @@ const machine_t machines[] = { .gpio_acpi = 0xffffffff, .device = NULL, .kbd_device = NULL, - .fdc_device = NULL, + .fdc_device = &fdc_pcjr_device, .sio_device = NULL, .vid_device = &pcjr_device, .snd_device = NULL, From e78d078d627be55fc4941cf7a74fb3e3bd65b620 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 22 Oct 2025 04:59:02 +0200 Subject: [PATCH 060/113] Temporarily disable the touch events commit. --- src/qt/qt_renderercommon.cpp | 2 ++ src/qt/qt_rendererstack.cpp | 50 ++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/qt/qt_renderercommon.cpp b/src/qt/qt_renderercommon.cpp index d34cad15b..25d3a5c28 100644 --- a/src/qt/qt_renderercommon.cpp +++ b/src/qt/qt_renderercommon.cpp @@ -220,10 +220,12 @@ RendererCommon::eventDelegate(QEvent *event, bool &result) case QEvent::MouseButtonPress: case QEvent::MouseMove: case QEvent::MouseButtonRelease: +#ifdef TOUCH_PR case QEvent::TouchBegin: case QEvent::TouchEnd: case QEvent::TouchCancel: case QEvent::TouchUpdate: +#endif case QEvent::Wheel: case QEvent::Enter: case QEvent::Leave: diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index ad8172d11..b95fe3b73 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -35,7 +35,9 @@ #include #include +#ifdef TOUCH_PR #include +#endif #include #include @@ -91,7 +93,9 @@ RendererStack::RendererStack(QWidget *parent, int monitor_index) , ui(new Ui::RendererStack) { boxLayout->setContentsMargins(0, 0, 0, 0); +#ifdef TOUCH_PR setAttribute(Qt::WA_AcceptTouchEvents, true); +#endif #ifdef Q_OS_WINDOWS setAttribute(Qt::WA_NativeWindow, true); (void)winId(); @@ -520,12 +524,22 @@ RendererStack::event(QEvent* event) if (m_monitor_index >= 1) { if (mouse_input_mode >= 1) { +#ifdef TOUCH_PR #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) mouse_x_abs = (mouse_event->position().x()) / (double)width(); mouse_y_abs = (mouse_event->position().y()) / (double)height(); #else mouse_x_abs = (mouse_event->localPos().x()) / (double)width(); mouse_y_abs = (mouse_event->localPos().y()) / (double)height(); +#endif +#else +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + mouse_x_abs = (mouse_event->position().x()) / (long double)width(); + mouse_y_abs = (mouse_event->position().y()) / (long double)height(); +#else + mouse_x_abs = (mouse_event->localPos().x()) / (long double)width(); + mouse_y_abs = (mouse_event->localPos().y()) / (long double)height(); +#endif #endif if (!mouse_tablet_in_proximity) mouse_tablet_in_proximity = mousedata.mouse_tablet_in_proximity; @@ -544,6 +558,7 @@ RendererStack::event(QEvent* event) return QWidget::event(event); } +#ifdef TOUCH_PR #ifdef Q_OS_WINDOWS if (mouse_input_mode == 0) { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) @@ -574,6 +589,39 @@ RendererStack::event(QEvent* event) #else mouse_x_abs = (mouse_event->localPos().x()) / (double)width(); mouse_y_abs = (mouse_event->localPos().y()) / (double)height(); +#endif +#else +#ifdef Q_OS_WINDOWS + if (mouse_input_mode == 0) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + mouse_x_abs = (mouse_event->position().x()) / (long double)width(); + mouse_y_abs = (mouse_event->position().y()) / (long double)height(); +#else + mouse_x_abs = (mouse_event->localPos().x()) / (long double)width(); + mouse_y_abs = (mouse_event->localPos().y()) / (long double)height(); +#endif + mouse_x_abs -= rendererWindow->destinationF.left(); + mouse_y_abs -= rendererWindow->destinationF.top(); + + if (mouse_x_abs < 0) mouse_x_abs = 0; + if (mouse_y_abs < 0) mouse_y_abs = 0; + + mouse_x_abs /= rendererWindow->destinationF.width(); + mouse_y_abs /= rendererWindow->destinationF.height(); + + if (mouse_x_abs > 1) mouse_x_abs = 1; + if (mouse_y_abs > 1) mouse_y_abs = 1; + return QWidget::event(event); + } +#endif + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + mouse_x_abs = (mouse_event->position().x()) / (long double)width(); + mouse_y_abs = (mouse_event->position().y()) / (long double)height(); +#else + mouse_x_abs = (mouse_event->localPos().x()) / (long double)width(); + mouse_y_abs = (mouse_event->localPos().y()) / (long double)height(); +#endif #endif mouse_x_abs -= rendererWindow->destinationF.left(); mouse_y_abs -= rendererWindow->destinationF.top(); @@ -587,6 +635,7 @@ RendererStack::event(QEvent* event) if (mouse_x_abs > 1) mouse_x_abs = 1; if (mouse_y_abs > 1) mouse_y_abs = 1; mouse_tablet_in_proximity = mousedata.mouse_tablet_in_proximity; +#ifdef TOUCH_PR } else switch (event->type()) { case QEvent::TouchBegin: case QEvent::TouchUpdate: @@ -685,6 +734,7 @@ RendererStack::event(QEvent* event) default: return QWidget::event(event); +#endif } return QWidget::event(event); From 27ac9cf6e6ee577213b35b55d331a0d0ec450de0 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 21 Oct 2025 22:07:41 -0400 Subject: [PATCH 061/113] Support for PCjr keyboard IR reciever option Currently disabled as it Error B's --- src/include/86box/m_pcjr.h | 1 + src/machine/m_pcjr.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/include/86box/m_pcjr.h b/src/include/86box/m_pcjr.h index 9b4a7cbaf..f957252a6 100644 --- a/src/include/86box/m_pcjr.h +++ b/src/include/86box/m_pcjr.h @@ -68,6 +68,7 @@ typedef struct pcjr_s { uint8_t pb; uint8_t option_fdc; + uint8_t option_ir; pc_timer_t send_delay_timer; diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index c1b7aba9b..1b9e8a8f4 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -667,6 +667,8 @@ kbd_read(uint16_t port, void *priv) ret |= (pcjr->data ? 0x40 : 0); if (pcjr->data) ret |= 0x40; + if (pcjr->option_ir) + ret |= 0x80; /* Keyboard cable not connected */ break; case 0xa0: @@ -816,6 +818,19 @@ static const device_config_t pcjr_config[] = { .selection = { { 0 } }, .bios = { { 0 } } }, +#if 0 + { + .name = "ir_reciever", + .description = "Enable IR Reciever", + .type = CONFIG_BINARY, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { { 0 } } + }, +#endif { .name = "", .description = "", .type = CONFIG_END } // clang-format on }; @@ -850,6 +865,11 @@ machine_pcjr_init(UNUSED(const machine_t *model)) pcjr = calloc(1, sizeof(pcjr_t)); pcjr->option_fdc = 0; +#if 0 + pcjr->option_ir = device_get_config_int("ir_reciever"); +#else + pcjr->option_ir = 0; +#endif is_pcjr = 1; From 57704c962443a0b0d53232543cbc73b3eaa5e7e8 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 21 Oct 2025 23:10:52 -0400 Subject: [PATCH 062/113] Support for Serial card in PCjr modem slot --- src/device/serial.c | 33 ++++++++++++++++++++++++++------- src/include/86box/m_pcjr.h | 1 + src/include/86box/serial.h | 20 +++++++++++--------- src/machine/m_pcjr.c | 33 ++++++++++++++++++++++++++++----- 4 files changed, 66 insertions(+), 21 deletions(-) diff --git a/src/device/serial.c b/src/device/serial.c index 63f20cbee..38220485f 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -141,7 +141,7 @@ serial_update_ints(serial_t *dev) } } - serial_do_irq(dev, !(dev->iir & 0x01) && ((dev->mctrl & 8) || (dev->type == SERIAL_8250_PCJR))); + serial_do_irq(dev, !(dev->iir & 0x01) && ((dev->mctrl & 8) || ((dev->type == SERIAL_8250_PCJR_3F8) || (dev->type == SERIAL_8250_PCJR_2F8)))); } static void @@ -971,15 +971,20 @@ serial_init(const device_t *info) serial_setup(dev, COM4_ADDR, COM4_IRQ); else if (next_inst == 2) serial_setup(dev, COM3_ADDR, COM3_IRQ); - else if ((next_inst == 1) || (info->local == SERIAL_8250_PCJR)) + else if ((next_inst == 1) || (info->local == SERIAL_8250_PCJR_2F8)) serial_setup(dev, COM2_ADDR, COM2_IRQ); + // TODO +#if 0 + else if ((next_inst == 1) || (info->local == SERIAL_8250_PCJR_3F8)) + serial_setup(dev, COM1_ADDR, COM1_IRQ); +#endif else if (next_inst == 0) serial_setup(dev, COM1_ADDR, COM1_IRQ); /* Default to 1200,N,7. */ dev->dlab = 96; dev->fcr = 0x06; - if (info->local == SERIAL_8250_PCJR) + if ((info->local == SERIAL_8250_PCJR_3F8) || (info->local == SERIAL_8250_PCJR_2F8)) dev->clock_src = 1789500.0; else dev->clock_src = 1843200.0; @@ -1039,11 +1044,25 @@ const device_t ns8250_device = { .config = NULL }; -const device_t ns8250_pcjr_device = { - .name = "National Semiconductor 8250(-compatible) UART for PCjr", - .internal_name = "ns8250_pcjr", +const device_t ns8250_pcjr_3f8_device = { + .name = "National Semiconductor 8250(-compatible) UART for PCjr (0x3f8)", + .internal_name = "ns8250_pcjr_3f8", .flags = 0, - .local = SERIAL_8250_PCJR, + .local = SERIAL_8250_PCJR_3F8, + .init = serial_init, + .close = serial_close, + .reset = serial_reset, + .available = NULL, + .speed_changed = serial_speed_changed, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ns8250_pcjr_2f8_device = { + .name = "National Semiconductor 8250(-compatible) UART for PCjr (0x2f8)", + .internal_name = "ns8250_pcjr_2f8", + .flags = 0, + .local = SERIAL_8250_PCJR_2F8, .init = serial_init, .close = serial_close, .reset = serial_reset, diff --git a/src/include/86box/m_pcjr.h b/src/include/86box/m_pcjr.h index f957252a6..f1a31954d 100644 --- a/src/include/86box/m_pcjr.h +++ b/src/include/86box/m_pcjr.h @@ -67,6 +67,7 @@ typedef struct pcjr_s { uint8_t pa; uint8_t pb; + uint8_t option_modem; uint8_t option_fdc; uint8_t option_ir; diff --git a/src/include/86box/serial.h b/src/include/86box/serial.h index 5231c491a..816672825 100644 --- a/src/include/86box/serial.h +++ b/src/include/86box/serial.h @@ -20,14 +20,15 @@ #ifndef EMU_SERIAL_H #define EMU_SERIAL_H -#define SERIAL_8250 0 -#define SERIAL_8250_PCJR 1 -#define SERIAL_16450 2 -#define SERIAL_16550 3 -#define SERIAL_16650 4 -#define SERIAL_16750 5 -#define SERIAL_16850 6 -#define SERIAL_16950 7 +#define SERIAL_8250 0 +#define SERIAL_8250_PCJR_3F8 1 +#define SERIAL_8250_PCJR_2F8 2 +#define SERIAL_16450 3 +#define SERIAL_16550 4 +#define SERIAL_16650 5 +#define SERIAL_16750 6 +#define SERIAL_16850 7 +#define SERIAL_16950 8 #define SERIAL_FIFO_SIZE 16 @@ -151,7 +152,8 @@ extern int serial_get_ri(serial_t *dev); extern uint8_t serial_get_shadow(serial_t *dev); extern const device_t ns8250_device; -extern const device_t ns8250_pcjr_device; +extern const device_t ns8250_pcjr_3f8_device; +extern const device_t ns8250_pcjr_2f8_device; extern const device_t ns16450_device; extern const device_t ns16550_device; extern const device_t ns16650_device; diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 1b9e8a8f4..047c0201d 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -653,7 +653,8 @@ kbd_read(uint16_t port, void *priv) case 0x62: ret = (pcjr->latched ? 1 : 0); - ret |= 0x02; /* Modem card not installed */ + if (!pcjr->option_modem) + ret |= 0x02; /* Modem card not installed */ if (!pcjr->option_fdc) ret |= 0x04; /* Diskette card not installed */ if (mem_size < 128) @@ -819,6 +820,17 @@ static const device_config_t pcjr_config[] = { .bios = { { 0 } } }, #if 0 + { + .name = "modem_slot", + .description = "Enable Serial Port in Modem Slot", + .type = CONFIG_BINARY, + .default_string = NULL, + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { { 0 } } + }, { .name = "ir_reciever", .description = "Enable IR Reciever", @@ -864,11 +876,16 @@ machine_pcjr_init(UNUSED(const machine_t *model)) pcjr = calloc(1, sizeof(pcjr_t)); - pcjr->option_fdc = 0; #if 0 - pcjr->option_ir = device_get_config_int("ir_reciever"); + pcjr->option_modem = device_get_config_int("modem_slot"); #else - pcjr->option_ir = 0; + pcjr->option_modem = 0; +#endif + pcjr->option_fdc = 0; +#if 0 + pcjr->option_ir = device_get_config_int("ir_reciever"); +#else + pcjr->option_ir = 0; #endif is_pcjr = 1; @@ -907,7 +924,13 @@ machine_pcjr_init(UNUSED(const machine_t *model)) pcjr->option_fdc = 1; } - device_add(&ns8250_pcjr_device); + if (!pcjr->option_modem) + device_add(&ns8250_pcjr_2f8_device); + else { + device_add(&ns8250_pcjr_3f8_device); + device_add(&ns8250_pcjr_2f8_device); + } + /* So that serial_standalone_init() won't do anything. */ serial_set_next_inst(SERIAL_MAX - 1); From 5a24fda546fe6da9e3ef5b902fd29ebfce202b16 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 21 Oct 2025 23:29:45 -0400 Subject: [PATCH 063/113] Minor cleanups in m_pcjr.c --- src/machine/m_pcjr.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 047c0201d..77a0ee392 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -907,9 +907,13 @@ machine_pcjr_init(UNUSED(const machine_t *model)) keyboard_scan = 1; key_queue_start = key_queue_end = 0; io_sethandler(0x0060, 4, - kbd_read, NULL, NULL, kbd_write, NULL, NULL, pcjr); + kbd_read, NULL, NULL, + kbd_write, NULL, NULL, + pcjr); io_sethandler(0x00a0, 8, - kbd_read, NULL, NULL, kbd_write, NULL, NULL, pcjr); + kbd_read, NULL, NULL, + kbd_write, NULL, NULL, + pcjr); timer_add(&pcjr->send_delay_timer, kbd_poll, pcjr, 1); keyboard_set_table(scancode_pcjr); keyboard_send = kbd_adddata_ex; From de42224028ad91556c0be117acf85175f9304e7a Mon Sep 17 00:00:00 2001 From: MaxwellS04 Date: Wed, 22 Oct 2025 16:22:59 +0700 Subject: [PATCH 064/113] Alphabetize the Vectra S7SV machines --- src/machine/machine_table.c | 86 ++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 8816ce42c..1c7b78deb 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -13332,49 +13332,6 @@ const machine_t machines[] = { .vid_device = NULL, .snd_device = NULL, .net_device = NULL - }, - { - .name = "[i430FX] HP Vectra VE 5/XXX Series 2", - .internal_name = "hpvectravexxx", - .type = MACHINE_TYPE_SOCKET7_3V, - .chipset = MACHINE_CHIPSET_INTEL_430FX, - .init = machine_at_hpvectravexxx_init, - .p1_handler = machine_generic_p1_handler, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, - .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK_NONE, - .min_bus = 50000000, - .max_bus = 66666667, - .min_voltage = 3380, - .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 3.0 - }, - .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, - .ram = { - .min = 8192, - .max = 131072, - .step = 8192 - }, - .nvrmask = 255, - .jumpered_ecp_dma = 0, - .default_jumpered_ecp_dma = -1, - .kbc_device = NULL, - .kbc_params = 0x00000000, - .kbc_p1 = 0x00000cf0, - .gpio = 0xffffffff, - .gpio_acpi = 0xffffffff, - .device = &hpvectravexxx_device, - .kbd_device = NULL, - .fdc_device = NULL, - .sio_device = NULL, - .vid_device = &gd5436_onboard_pci_device, - .snd_device = NULL, - .net_device = NULL }, { .name = "[i430FX] HP Vectra 500 Series xxx/MT", @@ -13419,6 +13376,49 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + { + .name = "[i430FX] HP Vectra VE 5/xxx Series 2", + .internal_name = "hpvectravexxx", + .type = MACHINE_TYPE_SOCKET7_3V, + .chipset = MACHINE_CHIPSET_INTEL_430FX, + .init = machine_at_hpvectravexxx_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 50000000, + .max_bus = 66666667, + .min_voltage = 3380, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 3.0 + }, + .bus_flags = MACHINE_PS2_PCI, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, + .ram = { + .min = 8192, + .max = 131072, + .step = 8192 + }, + .nvrmask = 255, + .jumpered_ecp_dma = 0, + .default_jumpered_ecp_dma = -1, + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = &hpvectravexxx_device, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &gd5436_onboard_pci_device, + .snd_device = NULL, + .net_device = NULL + }, /* Has a SM(S)C FDC37C932 Super I/O chip with on-chip KBC with AMI MegaKey (revision '5') KBC firmware. */ { From bb37f1d2a9e2d70d149cb48cf9057eaeaf006f3b Mon Sep 17 00:00:00 2001 From: Lili Kurek Date: Wed, 22 Oct 2025 11:42:57 +0200 Subject: [PATCH 065/113] Update pl-PL.po --- src/qt/languages/pl-PL.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 73b6952bd..a518957a8 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -850,13 +850,13 @@ msgid "Invalid PCap device" msgstr "Nieprawidłowe urządzenie PCap" msgid "Generic Paddle Controller(s)" -msgstr "" +msgstr "Generyczny kontroler paddle" msgid "2-axis, 1-button joystick(s)" -msgstr "Joysticki 2-osiowe, 1-przyciskowe" +msgstr "Joystick(i) 2-osiowe, 1-przyciskowe" msgid "2-axis, 2-button joystick(s)" -msgstr "Joysticki 2-osiowe, 2-przyciskowe" +msgstr "Joystick(i) 2-osiowe, 2-przyciskowe" msgid "2-axis, 3-button joystick" msgstr "Joystick 2-osiowy, 3-przyciskowy" @@ -892,13 +892,13 @@ msgid "2-button gamepad(s)" msgstr "Pad(y) z dwoma przyciskami" msgid "3-button gamepad" -msgstr "Pad z trzy przyciskami" +msgstr "Pad z trzema przyciskami" msgid "4-button gamepad" msgstr "Pad z czterema przyciskami" msgid "6-button gamepad" -msgstr "Pad z sześć przyciskami" +msgstr "Pad z sześcioma przyciskami" msgid "Gravis PC GamePad" msgstr "Gravis PC GamePad" @@ -976,10 +976,10 @@ msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 z Adaptorem" msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 bez Adaptora" msgid "None" msgstr "Żaden" @@ -3049,19 +3049,19 @@ msgid "Export EDID" msgstr "Eksportuj EDID" msgid "EDID file \"%ls\" is too large." -msgstr "Plik EDID \"%ls\" jest zbyt duży." +msgstr "Plik EDID „%ls” jest zbyt duży." msgid "OpenGL input scale" -msgstr "Skala wejściowa OpenGL" +msgstr "Skala wejścia OpenGL" msgid "OpenGL input stretch mode" -msgstr "Tryb rozciągania wejściowego OpenGL" +msgstr "Tryb rozciągania wejścia OpenGL" msgid "Color scheme" msgstr "Schemat kolorów" msgid "Light" -msgstr "Światło" +msgstr "Jasny" msgid "Dark" msgstr "Ciemny" From ff54ead1ec6a960cc8e4ec19cb526e2f5113c4d2 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 23 Oct 2025 00:07:15 +0500 Subject: [PATCH 066/113] Qt: Fix up the TAP bridge device option Also add its string to translation files --- src/qt/languages/86box.pot | 3 +++ src/qt/languages/cs-CZ.po | 3 +++ src/qt/languages/de-DE.po | 3 +++ src/qt/languages/es-ES.po | 3 +++ src/qt/languages/fi-FI.po | 3 +++ src/qt/languages/fr-FR.po | 3 +++ src/qt/languages/hr-HR.po | 3 +++ src/qt/languages/it-IT.po | 3 +++ src/qt/languages/ja-JP.po | 3 +++ src/qt/languages/ko-KR.po | 3 +++ src/qt/languages/nb-NO.po | 3 +++ src/qt/languages/nl-NL.po | 3 +++ src/qt/languages/pl-PL.po | 3 +++ src/qt/languages/pt-BR.po | 3 +++ src/qt/languages/pt-PT.po | 3 +++ src/qt/languages/ru-RU.po | 3 +++ src/qt/languages/sk-SK.po | 3 +++ src/qt/languages/sl-SI.po | 3 +++ src/qt/languages/sv-SE.po | 3 +++ src/qt/languages/tr-TR.po | 3 +++ src/qt/languages/uk-UA.po | 3 +++ src/qt/languages/vi-VN.po | 3 +++ src/qt/languages/zh-CN.po | 3 +++ src/qt/languages/zh-TW.po | 3 +++ src/qt/qt_settingsnetwork.ui | 16 ++++++++-------- 25 files changed, 80 insertions(+), 8 deletions(-) diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 28652d3e5..7eaa2359c 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -1854,6 +1854,9 @@ msgstr "" msgid "VDE Socket:" msgstr "" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index d4b9fc6ca..af3d76537 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -1854,6 +1854,9 @@ msgstr "Adaptér:" msgid "VDE Socket:" msgstr "Zásuvka VDE:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "86Box Unit Tester" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index c5d908733..864d1e1e3 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -1854,6 +1854,9 @@ msgstr "Adapter:" msgid "VDE Socket:" msgstr "VDE Anschluss:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "86Box-Gerätetester" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 64bb8b526..dc2f6272b 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -1854,6 +1854,9 @@ msgstr "Adaptador:" msgid "VDE Socket:" msgstr "Toma VDE:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "Comprobador de unidad 86Box" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 388659dba..89c545b08 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -1854,6 +1854,9 @@ msgstr "Sovitin:" msgid "VDE Socket:" msgstr "VDE-socket:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "86Box Unit Tester" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 97ed25e57..24bd0eb7d 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -1854,6 +1854,9 @@ msgstr "Adaptateur:" msgid "VDE Socket:" msgstr "Prise VDE:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "Testeur d'unité de 86Box" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 27b304d9b..450492d3c 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -1854,6 +1854,9 @@ msgstr "Adapter:" msgid "VDE Socket:" msgstr "VDE utičnica:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "Jedinični ispitivač 86Box-a" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 860083676..9875e999c 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -1854,6 +1854,9 @@ msgstr "Adattatore:" msgid "VDE Socket:" msgstr "Presa VDE:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "Tester di unità 86Box" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 0e854d189..aeceee65e 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -1854,6 +1854,9 @@ msgstr "アダプター:" msgid "VDE Socket:" msgstr "VDEソケット:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "86Boxユニットテスター" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index c95d073fa..961bea792 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -1854,6 +1854,9 @@ msgstr "어댑터:" msgid "VDE Socket:" msgstr "VDE 소켓:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "86Box 유닛 테스터" diff --git a/src/qt/languages/nb-NO.po b/src/qt/languages/nb-NO.po index e088c27cf..2d9154546 100644 --- a/src/qt/languages/nb-NO.po +++ b/src/qt/languages/nb-NO.po @@ -1854,6 +1854,9 @@ msgstr "Adapter:" msgid "VDE Socket:" msgstr "VDE-kontakt:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "86Box-enhetstester" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index df48e62d8..2d4140495 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -1854,6 +1854,9 @@ msgstr "Adapter:" msgid "VDE Socket:" msgstr "VDE-socket:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "86Box Apparaattester" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index a518957a8..1cc56e09b 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -1854,6 +1854,9 @@ msgstr "Adapter:" msgid "VDE Socket:" msgstr "Gniazdo VDE:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "Tester urządzeń 86Box" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index f1ff0bc09..53a8aed39 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -1854,6 +1854,9 @@ msgstr "Adaptador:" msgid "VDE Socket:" msgstr "Soquete VDE:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "Testador de unidade 86Box" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index dd4c61d1c..2d8b812f0 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -1854,6 +1854,9 @@ msgstr "Adaptador:" msgid "VDE Socket:" msgstr "Tomada VDE:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "Testador de unidades 86Box" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 3e15daf98..ddc584b91 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1854,6 +1854,9 @@ msgstr "Адаптер:" msgid "VDE Socket:" msgstr "VDE сокет:" +msgid "TAP Bridge Device:" +msgstr "Устройство моста TAP:" + msgid "86Box Unit Tester" msgstr "Модульный Тестер 86Box" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 7ea0446fb..dfd71bb45 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -1854,6 +1854,9 @@ msgstr "Adaptér:" msgid "VDE Socket:" msgstr "Zásuvka VDE:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "86Box Unit Tester" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index dd1b643c2..f7bdf7a38 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -1854,6 +1854,9 @@ msgstr "Mrežna kartica:" msgid "VDE Socket:" msgstr "Vtičnica VDE:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "Tester enote 86Box" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index 5a5c48bb9..d858e6189 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -1854,6 +1854,9 @@ msgstr "Adapter:" msgid "VDE Socket:" msgstr "VDE-sockel:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "86Box enhetsprövare" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 2a6eedeab..9355ec4ba 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -1854,6 +1854,9 @@ msgstr "Adaptör:" msgid "VDE Socket:" msgstr "VDE Soketi:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "86Box Test Cihazı" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index a5a4f5853..8866a1486 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -1854,6 +1854,9 @@ msgstr "Адаптер:" msgid "VDE Socket:" msgstr "VDE сокет:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "Тестер блоків 86Box" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 1d6d80c35..c81f5691a 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -1854,6 +1854,9 @@ msgstr "Bộ chuyển đổi:" msgid "VDE Socket:" msgstr "Ổ cắm VDE:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "Trình kiểm tra đơn vị 86box" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 288b7deaf..b51c02769 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -1854,6 +1854,9 @@ msgstr "适配器:" msgid "VDE Socket:" msgstr "VDE 套接字:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "86Box 装置测试仪" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index a11bd7f6d..0bbd32190 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -1854,6 +1854,9 @@ msgstr "配接器:" msgid "VDE Socket:" msgstr "VDE 插座:" +msgid "TAP Bridge Device:" +msgstr "" + msgid "86Box Unit Tester" msgstr "86Box 單元測試器" diff --git a/src/qt/qt_settingsnetwork.ui b/src/qt/qt_settingsnetwork.ui index 767b4244d..12b74004f 100644 --- a/src/qt/qt_settingsnetwork.ui +++ b/src/qt/qt_settingsnetwork.ui @@ -158,11 +158,11 @@ - TAP Bridge Device + TAP Bridge Device: - + 127 @@ -373,11 +373,11 @@ - TAP Bridge Device + TAP Bridge Device: - + 127 @@ -588,11 +588,11 @@ - TAP Bridge Device + TAP Bridge Device: - + 127 @@ -803,11 +803,11 @@ - TAP Bridge Device + TAP Bridge Device: - + 127 From 69662ac3c823b1d3dcdda9949d9eeaf1dc5a0efb Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 23 Oct 2025 00:10:27 +0500 Subject: [PATCH 067/113] Qt; Layout and size policy tweaks for settings dialog Fixes comboboxes not always filling the intended space, as well as oversized Configure buttons and uneven joystick confugration buttons --- src/qt/qt_settingsinput.ui | 141 +++++++++++++++--------- src/qt/qt_settingsports.ui | 39 ++++--- src/qt/qt_settingssound.ui | 22 ++-- src/qt/qt_settingsstoragecontrollers.ui | 12 ++ 4 files changed, 138 insertions(+), 76 deletions(-) diff --git a/src/qt/qt_settingsinput.ui b/src/qt/qt_settingsinput.ui index 02b3e388c..e4c0dc8fa 100644 --- a/src/qt/qt_settingsinput.ui +++ b/src/qt/qt_settingsinput.ui @@ -30,7 +30,7 @@ - + @@ -43,7 +43,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -76,7 +76,7 @@ - + @@ -96,40 +96,50 @@ - + 30 - - - - - - Joystick 1... + + + 0 + 0 + - - - - Joystick 2... - - - - - - - Joystick 3... - - - - - - - Joystick 4... - - + + + + + + Joystick 1... + + + + + + + Joystick 2... + + + + + + + Joystick 3... + + + + + + + Joystick 4... + + + + @@ -138,7 +148,7 @@ - + QAbstractItemView::NoEditTriggers @@ -157,25 +167,54 @@ - - - - false - - - Clear binding - - - - - - - false - - - Bind - - + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + + 100 + 0 + + + + Clear binding + + + + + + + false + + + + 100 + 0 + + + + Bind + + + + diff --git a/src/qt/qt_settingsports.ui b/src/qt/qt_settingsports.ui index 9a8533995..6be0e3a85 100644 --- a/src/qt/qt_settingsports.ui +++ b/src/qt/qt_settingsports.ui @@ -228,6 +228,12 @@ Serial port passthrough 1 + + + 0 + 0 + + @@ -242,6 +248,12 @@ Serial port passthrough 2 + + + 0 + 0 + + @@ -256,6 +268,12 @@ Serial port passthrough 3 + + + 0 + 0 + + @@ -270,6 +288,12 @@ Serial port passthrough 4 + + + 0 + 0 + + @@ -279,20 +303,7 @@ - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + Qt::Vertical diff --git a/src/qt/qt_settingssound.ui b/src/qt/qt_settingssound.ui index 97ef7c3ff..f93c5d374 100644 --- a/src/qt/qt_settingssound.ui +++ b/src/qt/qt_settingssound.ui @@ -46,7 +46,7 @@ - + Configure @@ -73,7 +73,7 @@ - + Configure @@ -100,7 +100,7 @@ - + Configure @@ -127,7 +127,7 @@ - + Configure @@ -154,7 +154,7 @@ - + Configure @@ -181,35 +181,35 @@ - + Configure - + Standalone MPU-401 - + Configure - + Use FLOAT32 sound - + @@ -238,7 +238,7 @@ - + Qt::Vertical diff --git a/src/qt/qt_settingsstoragecontrollers.ui b/src/qt/qt_settingsstoragecontrollers.ui index 2d6fa9d32..50ebbe7ef 100644 --- a/src/qt/qt_settingsstoragecontrollers.ui +++ b/src/qt/qt_settingsstoragecontrollers.ui @@ -40,6 +40,12 @@ 30 + + + 0 + 0 + + @@ -61,6 +67,12 @@ 30 + + + 0 + 0 + + From f3b5b6103af2c15432aaf12ce0e58b3284dd9561 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 23 Oct 2025 07:11:40 +0500 Subject: [PATCH 068/113] Remove unneeded capital letters from paddle and steering wheel's names --- src/game/joystick_standard.c | 8 ++++---- src/qt/languages/86box.pot | 8 ++++---- src/qt/languages/cs-CZ.po | 8 ++++---- src/qt/languages/de-DE.po | 8 ++++---- src/qt/languages/es-ES.po | 8 ++++---- src/qt/languages/fi-FI.po | 8 ++++---- src/qt/languages/fr-FR.po | 8 ++++---- src/qt/languages/hr-HR.po | 8 ++++---- src/qt/languages/it-IT.po | 8 ++++---- src/qt/languages/ja-JP.po | 8 ++++---- src/qt/languages/ko-KR.po | 8 ++++---- src/qt/languages/nb-NO.po | 8 ++++---- src/qt/languages/nl-NL.po | 8 ++++---- src/qt/languages/pl-PL.po | 8 ++++---- src/qt/languages/pt-BR.po | 8 ++++---- src/qt/languages/pt-PT.po | 8 ++++---- src/qt/languages/ru-RU.po | 8 ++++---- src/qt/languages/sk-SK.po | 8 ++++---- src/qt/languages/sl-SI.po | 8 ++++---- src/qt/languages/sv-SE.po | 8 ++++---- src/qt/languages/tr-TR.po | 8 ++++---- src/qt/languages/uk-UA.po | 8 ++++---- src/qt/languages/vi-VN.po | 8 ++++---- src/qt/languages/zh-CN.po | 8 ++++---- src/qt/languages/zh-TW.po | 8 ++++---- 25 files changed, 100 insertions(+), 100 deletions(-) diff --git a/src/game/joystick_standard.c b/src/game/joystick_standard.c index a9e3da402..fc0006b45 100644 --- a/src/game/joystick_standard.c +++ b/src/game/joystick_standard.c @@ -392,7 +392,7 @@ joystick_standard_a0_over(UNUSED(void *priv)) } const joystick_t joystick_generic_paddle = { - .name = "Generic Paddle Controller(s)", + .name = "Generic paddle controller(s)", .internal_name = "generic_paddle", .init = joystick_standard_init, .close = joystick_standard_close, @@ -825,7 +825,7 @@ const joystick_t joystick_4button_yoke_throttle = { }; const joystick_t joystick_steering_wheel_2_button = { - .name = "Steering Wheel (3-axis, 2-button)", + .name = "Steering wheel (3-axis, 2-button)", .internal_name = "steering_wheel_2_button", .init = joystick_standard_init, .close = joystick_standard_close, @@ -843,7 +843,7 @@ const joystick_t joystick_steering_wheel_2_button = { }; const joystick_t joystick_steering_wheel_3_button = { - .name = "Steering Wheel (3-axis, 3-button)", + .name = "Steering wheel (3-axis, 3-button)", .internal_name = "steering_wheel_3_button", .init = joystick_standard_init, .close = joystick_standard_close, @@ -861,7 +861,7 @@ const joystick_t joystick_steering_wheel_3_button = { }; const joystick_t joystick_steering_wheel_4_button = { - .name = "Steering Wheel (3-axis, 4-button)", + .name = "Steering wheel (3-axis, 4-button)", .internal_name = "steering_wheel_4_button", .init = joystick_standard_init, .close = joystick_standard_close, diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 7eaa2359c..54b328aa1 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -849,7 +849,7 @@ msgstr "" msgid "Invalid PCap device" msgstr "" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "" msgid "4-button flight yoke with throttle" msgstr "" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "" msgid "CH Flightstick" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index af3d76537..38cd36487 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -849,7 +849,7 @@ msgstr "Nebyla nalezena žádná PCap zařízení" msgid "Invalid PCap device" msgstr "Neplatné PCap zařízení" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "Letecký knipl s 3 tlačítky a pákou" msgid "4-button flight yoke with throttle" msgstr "Letecký knipl s 4 tlačítky a pákou" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Volant (3 osy, 2 tlačítka)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Volant (3 osy, 3 tlačítka)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Volant (3 osy, 4 tlačítka)" msgid "CH Flightstick" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 864d1e1e3..7463747a7 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -849,7 +849,7 @@ msgstr "Keine PCap-Geräte gefunden" msgid "Invalid PCap device" msgstr "Ungültiges PCap-Gerät" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "3-Tasten-Steuerhorn mit Schubregler" msgid "4-button flight yoke with throttle" msgstr "4-Tasten-Steuerhorn mit Schubregler" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Lenkrad (3-Achsen, 2-Tasten)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Lenkrad (3-Achsen, 3-Tasten)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Lenkrad (3-Achsen, 4-Tasten)" msgid "CH Flightstick" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index dc2f6272b..3210dc713 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -849,7 +849,7 @@ msgstr "No se encontraron dispositivos PCap" msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "Yugo de vuelo de 3 botones con acelerador" msgid "4-button flight yoke with throttle" msgstr "Yugo de vuelo de 4 botones con acelerador" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Volante (de 3 ejes, 2 botones)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Volante (de 3 ejes, 3 botones)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Volante (de 3 ejes, 4 botones)" msgid "CH Flightstick" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 89c545b08..ba494bb6e 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -849,7 +849,7 @@ msgstr "PCap-laitteita ei löytynyt" msgid "Invalid PCap device" msgstr "Virheellinen PCap-laite" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "3-painikkeinen lento-ohjain kaasuvivulla" msgid "4-button flight yoke with throttle" msgstr "4-painikkeinen lento-ohjain kaasuvivulla" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "ratti (3-akselinen, 2-painikkeinen)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "ratti (3-akselinen, 3-painikkeinen)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "ratti (3-akselinen, 4-painikkeinen)" msgid "CH Flightstick" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 24bd0eb7d..f62e55978 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -849,7 +849,7 @@ msgstr "Aucun dispositif PCap trouvé" msgid "Invalid PCap device" msgstr "Dispositif PCap invalide" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "Manette de vol à 3 boutons avec manette des gaz" msgid "4-button flight yoke with throttle" msgstr "Manette de vol à 4 boutons avec manette des gaz" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Volant (3 axes, 2 boutons)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Volant (3 axes, 3 boutons)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Volant (3 axes, 4 boutons)" msgid "CH Flightstick" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 450492d3c..7f460914a 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -849,7 +849,7 @@ msgstr "Nema PCap uređaja" msgid "Invalid PCap device" msgstr "Nevažeći PCap uređaj" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "Jaram za letenje s 3 tipke i gasom" msgid "4-button flight yoke with throttle" msgstr "Jaram za letenje s 4 tipke i gasom" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Volan (3 osi, 2 tipke)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Volan (3 osi, 3 tipke)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Volan (3 osi, 4 tipke)" msgid "CH Flightstick" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 9875e999c..c8eb2e6e7 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -849,7 +849,7 @@ msgstr "Nessun dispositivo PCap trovato" msgid "Invalid PCap device" msgstr "Dispositivo PCap non valido" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "Barra di comando a 4 pulsanti con acceleratore" msgid "4-button flight yoke with throttle" msgstr "Barra di comando a 4 pulsanti con acceleratore" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Volante (3 assi, 2 pulsanti)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Volante (3 assi, 3 pulsanti)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Volante (3 assi, 4 pulsanti)" msgid "CH Flightstick" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index aeceee65e..8cc00a146 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -849,7 +849,7 @@ msgstr "PCapデバイスがありません" msgid "Invalid PCap device" msgstr "不正なPCapデバイス" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "3ボタン式フライトヨーク(スロットル付き)" msgid "4-button flight yoke with throttle" msgstr "4ボタン式フライトヨーク(スロットル付き)" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "ステアリングホイール(3軸、2ボタン)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "ステアリングホイール(3軸、3ボタン)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "ステアリングホイール(3軸、4ボタン)" msgid "CH Flightstick" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 961bea792..4c15c0cb0 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -849,7 +849,7 @@ msgstr "PCap 장치가 없습니다" msgid "Invalid PCap device" msgstr "PCap 장치가 올바르지 않습니다" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "3버튼 비행 조종간과 스로틀" msgid "4-button flight yoke with throttle" msgstr "4버튼 비행 조종간과 스로틀" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "조타륜 (3축, 2버튼)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "조타륜 (3축, 3버튼)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "조타륜 (3축, 4버튼)" msgid "CH Flightstick" diff --git a/src/qt/languages/nb-NO.po b/src/qt/languages/nb-NO.po index 2d9154546..b4c7cd57c 100644 --- a/src/qt/languages/nb-NO.po +++ b/src/qt/languages/nb-NO.po @@ -849,7 +849,7 @@ msgstr "Ingen PCap-enheter funnet" msgid "Invalid PCap device" msgstr "Ugyldig PCap-enhet" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "3-knapps flystyre med gass" msgid "4-button flight yoke with throttle" msgstr "4-knapps flystyre med gass" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Ratt (3-akset, 3-knapps)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Ratt (3-akset, 3-knapps)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Ratt (3-akset, 4-knapps)" msgid "CH Flightstick" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 2d4140495..6710687a1 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -849,7 +849,7 @@ msgstr "Geen PCap-apparaten gevonden" msgid "Invalid PCap device" msgstr "Ongeldig PCap-apparaat" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "3-kops stuurknuppel met gashendel" msgid "4-button flight yoke with throttle" msgstr "4-kops stuurknuppel met gashendel" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Stuurwiel (3 assen, 2 knoppen)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Stuurwiel (3 assen, 3 knoppen)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Stuurwiel (3 assen, 4 knoppen)" msgid "CH Flightstick" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 1cc56e09b..1efe0ec97 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -849,7 +849,7 @@ msgstr "Nie znaleziono urządzeń PCap" msgid "Invalid PCap device" msgstr "Nieprawidłowe urządzenie PCap" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "Generyczny kontroler paddle" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "Wolant z trzema przyciskami i przepustnicą" msgid "4-button flight yoke with throttle" msgstr "Wolant z czterema przyciskami i przepustnicą" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Kierownica (3 osie, 2 przyciski)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Kierownica (3 osie, 3 przyciski)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Kierownica (3 osie, 4 przyciski)" msgid "CH Flightstick" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 53a8aed39..88fe48d00 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -849,7 +849,7 @@ msgstr "Nenhum dispositivo PCap encontrado" msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "Manche de voo de 3 botões com acelerador" msgid "4-button flight yoke with throttle" msgstr "Manche de voo de 4 botões com acelerador" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Volante (3 eixos, 2 botões)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Volante (3 eixos, 3 botões)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Volante (3 eixos, 4 botões)" msgid "CH Flightstick" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 2d8b812f0..bfd52adfa 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -849,7 +849,7 @@ msgstr "Não foi encontrado um dispositivo PCap" msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "Manípulo de voo de 3 botões com acelerador" msgid "4-button flight yoke with throttle" msgstr "Manípulo de voo de 4 botões com acelerador" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Volante (de 3 eixos, 2 botões)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Volante (de 3 eixos, 3 botões)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Volante (de 3 eixos, 4 botões)" msgid "CH Flightstick" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index ddc584b91..6235f224a 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -849,7 +849,7 @@ msgstr "Устройства PCap не найдены" msgid "Invalid PCap device" msgstr "Неверное устройство PCap" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "3-кнопочный flight yoke с дросселем" msgid "4-button flight yoke with throttle" msgstr "4-кнопочный flight yoke с дросселем" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Руль (3-осевой, 2-кнопочный)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Руль (3-осевой, 3-кнопочный)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Руль (3-осевой, 4-кнопочный)" msgid "CH Flightstick" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index dfd71bb45..f43059d58 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -849,7 +849,7 @@ msgstr "Neboli nájdené žiadne PCap zariadenia" msgid "Invalid PCap device" msgstr "Neplatné PCap zariadenie" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "Letecký knipl s 3 tlačidlami a pákou" msgid "4-button flight yoke with throttle" msgstr "Letecký knipl s 4 tlačidlami a pákou" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Volant (3 osy, 2 tlačítka)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Volant (3 osy, 3 tlačítka)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Volant (3 osy, 4 tlačítka)" msgid "CH Flightstick" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index f7bdf7a38..2438c1aa3 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -849,7 +849,7 @@ msgstr "Najdena ni bila nobena naprava PCap" msgid "Invalid PCap device" msgstr "Neveljavna naprava PCap" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "Letalski krmilni drog s 3 gumbi z ročico za plin" msgid "4-button flight yoke with throttle" msgstr "Letalski krmilni drog s 4 gumbi z ročico za plin" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Volan s 3 osmi, 2 gumbi" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Volan s 3 osmi, 3 gumbi" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Volan s 3 osmi, 4 gumbi" msgid "CH Flightstick" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index d858e6189..324fed452 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -849,7 +849,7 @@ msgstr "Inga PCap-enheter hittade" msgid "Invalid PCap device" msgstr "Ogiltig PCap-enhet" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "Styrspak med tre knappar och gas" msgid "4-button flight yoke with throttle" msgstr "Styrspak med fyra knappar och gas" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "ratt (tre axlar, två knappar)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "ratt (tre axlar, tre knappar)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "ratt (tre axlar, fyra knappar)" msgid "CH Flightstick" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 9355ec4ba..cf15db39b 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -849,7 +849,7 @@ msgstr "Herhangi bir PCap cihazı bulunamadı" msgid "Invalid PCap device" msgstr "Geçersiz PCap cihazı" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "3 düğmeli, gaz kollu uçuş dümeni" msgid "4-button flight yoke with throttle" msgstr "4 düğmeli, gaz kollu uçuş dümeni" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "direksiyonu (3 eksenli, 2 düğmeli)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "direksiyonu (3 eksenli, 3 düğmeli)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "direksiyonu (3 eksenli, 4 düğmeli)" msgid "CH Flightstick" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 8866a1486..b155d0da0 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -849,7 +849,7 @@ msgstr "Пристрої PCap не знайдені" msgid "Invalid PCap device" msgstr "Невірний пристрій PCap" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "3-кнопковий flight yoke з дроселем" msgid "4-button flight yoke with throttle" msgstr "4-кнопковий flight yoke з дроселем" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Кермо (3-осьове, 2-кнопкове)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Кермо (3-осьове, 3-кнопкове)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Кермо (3-осьове, 4-кнопкове)" msgid "CH Flightstick" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index c81f5691a..acb904b04 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -849,7 +849,7 @@ msgstr "Không tìm thấy thiết bị PCap" msgid "Invalid PCap device" msgstr "Thiết bị PCap không hợp quy" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "Vô lăng máy bay ba nút có cần ga" msgid "4-button flight yoke with throttle" msgstr "Vô lăng máy bay bốn nút có cần ga" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "Vô lăng (ba trục, hai nút)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "Vô lăng (ba trục, ba nút)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "Vô lăng (ba trục, bốn nút)" msgid "CH Flightstick" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index b51c02769..a53520c3f 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -849,7 +849,7 @@ msgstr "未找到 PCap 设备" msgid "Invalid PCap device" msgstr "无效 PCap 设备" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "3 按钮带油门飞行摇杆" msgid "4-button flight yoke with throttle" msgstr "4 按钮带油门飞行摇杆" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "方向盘 (3 轴, 2 键)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "方向盘 (3 轴, 3 键)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "方向盘 (3 轴, 4 键)" msgid "CH Flightstick" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 0bbd32190..053dde129 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -849,7 +849,7 @@ msgstr "未找到 PCap 裝置" msgid "Invalid PCap device" msgstr "無效 PCap 裝置" -msgid "Generic Paddle Controller(s)" +msgid "Generic paddle controller(s)" msgstr "" msgid "2-axis, 1-button joystick(s)" @@ -921,13 +921,13 @@ msgstr "3 按鈕帶油門飛行搖桿" msgid "4-button flight yoke with throttle" msgstr "4 按鈕帶油門飛行搖桿" -msgid "Steering Wheel (3-axis, 2-button)" +msgid "Steering wheel (3-axis, 2-button)" msgstr "方向盤 (3 軸, 2 鍵搖桿)" -msgid "Steering Wheel (3-axis, 3-button)" +msgid "Steering wheel (3-axis, 3-button)" msgstr "方向盤 (3 軸, 3 鍵搖桿)" -msgid "Steering Wheel (3-axis, 4-button)" +msgid "Steering wheel (3-axis, 4-button)" msgstr "方向盤 (3 軸, 4 鍵搖桿)" msgid "CH Flightstick" From b6d25018868700cf06c0feb5a8ebb67f507d3d30 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 23 Oct 2025 07:12:30 +0500 Subject: [PATCH 069/113] Update the Russian translation --- src/qt/languages/ru-RU.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 6235f224a..b40d4073e 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Неверное устройство PCap" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Стандартный контроллер-колесо" msgid "2-axis, 1-button joystick(s)" msgstr "2-осевой, 1-кнопочный джойстик" @@ -904,22 +904,22 @@ msgid "Gravis PC GamePad" msgstr "Gravis PC GamePad" msgid "2-button flight yoke" -msgstr "2-кнопочный flight yoke" +msgstr "2-кнопочный штурвал" msgid "3-button flight yoke" -msgstr "3-кнопочный flight yoke" +msgstr "3-кнопочный штурвал" msgid "4-button flight yoke" -msgstr "4-кнопочный flight yoke" +msgstr "4-кнопочный штурвал" msgid "2-button flight yoke with throttle" -msgstr "2-кнопочный flight yoke с дросселем" +msgstr "2-кнопочный штурвал с дросселем" msgid "3-button flight yoke with throttle" -msgstr "3-кнопочный flight yoke с дросселем" +msgstr "3-кнопочный штурвал с дросселем" msgid "4-button flight yoke with throttle" -msgstr "4-кнопочный flight yoke с дросселем" +msgstr "4-кнопочный штурвал с дросселем" msgid "Steering wheel (3-axis, 2-button)" msgstr "Руль (3-осевой, 2-кнопочный)" @@ -976,10 +976,10 @@ msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Система управления рулем" msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 с адаптером" msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 без адаптера" msgid "None" msgstr "Нет" From 5a9fd8585f36fc64cfc4c0e206d714a5d7a402d6 Mon Sep 17 00:00:00 2001 From: richardg867 Date: Thu, 23 Oct 2025 11:08:44 -0300 Subject: [PATCH 070/113] Revert the PC Partner name change [skip ci] Sources: http://web.archive.org/web/20000831053737/http://www.pcpartner.com/company.htm http://web.archive.org/web/20040214090712/http://www.pcpartner.com/profile/main.htm http://web.archive.org/web/20070928143528/http://www.pcpartner.com/ https://www.pcpartner.com (still around!) --- src/machine/machine_table.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 1c7b78deb..78a1709e8 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -13739,7 +13739,7 @@ const machine_t machines[] = { }, /* Has a VIA VT82C42N KBC. */ { - .name = "[i430FX] PCPartner MB500N", + .name = "[i430FX] PC Partner MB500N", .internal_name = "mb500n", .type = MACHINE_TYPE_SOCKET7_3V, .chipset = MACHINE_CHIPSET_INTEL_430FX, @@ -15501,7 +15501,7 @@ const machine_t machines[] = { /* This has the AMIKey 'H' firmware, possibly AMIKey-2. Photos show it with a BestKey, so it likely clones the behavior of AMIKey 'H'. */ { - .name = "[i430VX] PCPartner MB520N", + .name = "[i430VX] PC Partner MB520N", .internal_name = "mb520n", .type = MACHINE_TYPE_SOCKET7, .chipset = MACHINE_CHIPSET_INTEL_430VX, @@ -15965,7 +15965,7 @@ const machine_t machines[] = { /* The BIOS sends KBC command BB and expects it to output a byte, which is AMI KBC behavior. A picture shows a VIA VT82C42N KBC though, so it could be a case of that KBC with AMI firmware. */ { - .name = "[i430TX] PCPartner MB540N", + .name = "[i430TX] PC Partner MB540N", .internal_name = "mb540n", .type = MACHINE_TYPE_SOCKET7, .chipset = MACHINE_CHIPSET_INTEL_430TX, @@ -16506,7 +16506,7 @@ const machine_t machines[] = { /* Has the VIA VT82C586B southbridge with on-chip KBC identical to the VIA VT82C42N. */ { - .name = "[VIA VP3] PCPartner VIA809DS", + .name = "[VIA VP3] PC Partner VIA809DS", .internal_name = "via809ds", .type = MACHINE_TYPE_SOCKET7, .chipset = MACHINE_CHIPSET_VIA_APOLLO_VP3, @@ -17586,7 +17586,7 @@ const machine_t machines[] = { }, /* Has a VIA VT82C42N KBC. */ { - .name = "[i440FX] PCPartner MB600N", + .name = "[i440FX] PC Partner MB600N", .internal_name = "mb600n", .type = MACHINE_TYPE_SOCKET8, .chipset = MACHINE_CHIPSET_INTEL_440FX, @@ -19601,7 +19601,7 @@ const machine_t machines[] = { /* Has the VIA VT82C586B southbridge with on-chip KBC identical to the VIA VT82C42N. */ { - .name = "[VIA Apollo Pro] PCPartner APAS3", + .name = "[VIA Apollo Pro] PC Partner APAS3", .internal_name = "apas3", .type = MACHINE_TYPE_SOCKET370, .chipset = MACHINE_CHIPSET_VIA_APOLLO_PRO, From f756dcea80c9681a810ce7a271494361399614cc Mon Sep 17 00:00:00 2001 From: richardg867 Date: Thu, 23 Oct 2025 11:32:57 -0300 Subject: [PATCH 071/113] Revert the PC Chips name change [skip ci] Sources: (note inconsistencies in website) http://web.archive.org/web/19970128184226/http://www.pcchips.com/pcgroup.html http://web.archive.org/web/20010118220900/http://www.pcchips.com/ --- src/machine/machine_table.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 78a1709e8..950705def 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -10728,7 +10728,7 @@ const machine_t machines[] = { /* This has the UMC 88xx on-chip KBC. All the copies of the BIOS string I can find, end in in -H, so the UMC on-chip KBC likely emulates the AMI 'H' KBC firmware. */ { - .name = "[UMC 8881] PCChips M919", + .name = "[UMC 8881] PC Chips M919", .internal_name = "m919", .type = MACHINE_TYPE_486_S3_PCI, .chipset = MACHINE_CHIPSET_UMC_UM8881, @@ -14416,7 +14416,7 @@ const machine_t machines[] = { }, /* Has the ALi M1543 southbridge with on-chip KBC. */ { - .name = "[ALi ALADDiN IV+] PCChips M560", + .name = "[ALi ALADDiN IV+] PC Chips M560", .internal_name = "m560", .type = MACHINE_TYPE_SOCKET7, .chipset = MACHINE_CHIPSET_ALI_ALADDIN_IV_PLUS, @@ -16730,7 +16730,7 @@ const machine_t machines[] = { /* Is the exact same as the Matsonic MS6260S. Has the ALi M1543C southbridge with on-chip KBC. */ { - .name = "[ALi ALADDiN V] PCChips M579", + .name = "[ALi ALADDiN V] PC Chips M579", .internal_name = "m579", .type = MACHINE_TYPE_SOCKETS7, .chipset = MACHINE_CHIPSET_ALI_ALADDIN_V, @@ -17633,7 +17633,7 @@ const machine_t machines[] = { /* ALi ALADDiN-PRO II */ /* Has the ALi M1543C southbridge with on-chip KBC. */ { - .name = "[ALi ALADDiN-PRO II] PCChips M729", + .name = "[ALi ALADDiN-PRO II] PC Chips M729", .internal_name = "m729", .type = MACHINE_TYPE_SLOT1, .chipset = MACHINE_CHIPSET_ALI_ALADDIN_PRO_II, @@ -18674,7 +18674,7 @@ const machine_t machines[] = { }, /* Has the SiS (5)600 chipset with on-chip KBC. */ { - .name = "[SiS 5600] PCChips M747", + .name = "[SiS 5600] PC Chips M747", .internal_name = "m747", .type = MACHINE_TYPE_SLOT1, .chipset = MACHINE_CHIPSET_SIS_5600, @@ -19554,7 +19554,7 @@ const machine_t machines[] = { /* Has an ITE IT8671F Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ { - .name = "[SMSC VictoryBX-66] PCChips M773", + .name = "[SMSC VictoryBX-66] PC Chips M773", .internal_name = "m773", .type = MACHINE_TYPE_SOCKET370, .chipset = MACHINE_CHIPSET_SMSC_VICTORYBX_66, From 265cd2251097dd950110b7a3359c4e8ea521f406 Mon Sep 17 00:00:00 2001 From: richardg867 Date: Thu, 23 Oct 2025 11:43:35 -0300 Subject: [PATCH 072/113] Remove dash from Yamaha YMF71x [skip ci] Sources: https://www.alsa-project.org/files/pub/datasheets/yamaha/YMF711.PDF https://www.alsa-project.org/files/pub/datasheets/yamaha/YMF715.PDF https://www.alsa-project.org/files/pub/datasheets/yamaha/3sa3ee.pdf --- src/sound/snd_ymf71x.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sound/snd_ymf71x.c b/src/sound/snd_ymf71x.c index 116a0966d..c79263ce0 100644 --- a/src/sound/snd_ymf71x.c +++ b/src/sound/snd_ymf71x.c @@ -6,7 +6,7 @@ * * This file is part of the 86Box distribution. * - * Yamaha YMF-71x (OPL3-SA2/3) audio controller emulation. + * Yamaha YMF71x (OPL3-SA2/3) audio controller emulation. * * Authors: Cacodemon345 * Eluan Costa Miranda @@ -74,7 +74,7 @@ static const uint8_t ymf71x_init_key[32] = { 0xB1, 0xD8, 0x6C, 0x36, 0x9B, 0x4D, 0x33, 0x19, 0x8C, 0x46, 0xA3, 0x51, 0xA8, 0x54 }; /* Reversed attenuation values borrowed from snd_sb.c */ -/* YMF-71x master volume attenuation is -30dB when all bits are 1, 0dB when all bits are 0 */ +/* YMF71x master volume attenuation is -30dB when all bits are 1, 0dB when all bits are 0 */ static const double ymf71x_att_2dbstep_4bits[] = { 32767.0, 26027.0, 20674.0, 16422.0, 13044.0, 10362.0, 8230.0, 6537.0, 5192.0, 4125.0, 3276.0, 2602.0, 2067.0, 1641.0, 1304.0, 164.0 @@ -836,7 +836,7 @@ static const device_config_t ymf71x_config[] = { }; const device_t ymf715_onboard_device = { - .name = "Yamaha YMF-715 Onboard (OPL3-SA3)", + .name = "Yamaha YMF715 (OPL3-SA3) (On-Board)", .internal_name = "ymf715_onboard", .flags = DEVICE_ISA16, .local = 0x102, @@ -850,7 +850,7 @@ const device_t ymf715_onboard_device = { }; const device_t ymf718_device = { - .name = "Yamaha YMF-718 (OPL3-SA2)", + .name = "Yamaha YMF718 (OPL3-SA2)", .internal_name = "ymf718", .flags = DEVICE_ISA16, .local = 0x01, @@ -864,7 +864,7 @@ const device_t ymf718_device = { }; const device_t ymf719_device = { - .name = "Yamaha YMF-719 (OPL3-SA3)", + .name = "Yamaha YMF719 (OPL3-SA3)", .internal_name = "ymf719", .flags = DEVICE_ISA16, .local = 0x02, From 0e38241cfeaa9dcb27d95bafd276dd3710dfac42 Mon Sep 17 00:00:00 2001 From: richardg867 Date: Thu, 23 Oct 2025 12:31:27 -0300 Subject: [PATCH 073/113] Fix LX6 BIOS internal name [skip ci] --- src/machine/m_at_slot1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index 0b57b135c..02631169e 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -177,7 +177,7 @@ static const device_config_t lx6_config[] = { }, { .name = "Award Modular BIOS v4.51PG - Revision PZ (Beta)", - .internal_name = "lx6_beta", + .internal_name = "lx6_pz", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, From 44be8c2940fc99ad223e4d08c1a82ba872564498 Mon Sep 17 00:00:00 2001 From: mw308 <34479591+mw308@users.noreply.github.com> Date: Thu, 23 Oct 2025 23:35:52 +0100 Subject: [PATCH 074/113] Allow finer control of shader parameters --- src/qt/qt_openglshaderconfig.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qt/qt_openglshaderconfig.cpp b/src/qt/qt_openglshaderconfig.cpp index 1e8c2d54f..66bd9eb52 100644 --- a/src/qt/qt_openglshaderconfig.cpp +++ b/src/qt/qt_openglshaderconfig.cpp @@ -27,6 +27,7 @@ OpenGLShaderConfig::OpenGLShaderConfig(QWidget *parent, glslp_t* shader) for (int i = 0; i < currentShader->num_parameters; i++) { auto spinBox = new QDoubleSpinBox; + spinBox->setDecimals(3); spinBox->setObjectName(currentShader->parameters[i].id); spinBox->setRange(currentShader->parameters[i].min, currentShader->parameters[i].max); spinBox->setValue(currentShader->parameters[i].value); From c29c08bc20e61036b77fedf541b76b7b67dde816 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 24 Oct 2025 06:20:42 +0200 Subject: [PATCH 075/113] ABit AB-LX6: Fix BIOS casing for the default BIOS, fixes it on Linux. [skip ci] --- src/machine/m_at_slot1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index 02631169e..d42dee6a9 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -173,7 +173,7 @@ static const device_config_t lx6_config[] = { .files_no = 1, .local = 0, .size = 131072, - .files = { "roms/machines/lx6/LX6C_LY.BIN", "" } + .files = { "roms/machines/lx6/LX6C_LY.bin", "" } }, { .name = "Award Modular BIOS v4.51PG - Revision PZ (Beta)", From 3ea6706149b715a1a51fcadc3afb86a3fd66fa0b Mon Sep 17 00:00:00 2001 From: GetDizzy Date: Fri, 24 Oct 2025 08:08:13 -0400 Subject: [PATCH 076/113] Remove MACHINE_ACPI from machines tested to not have ACPI [skip ci] The following machines had MACHINE_ACPI removed: Socket 7: * HP Vectra VL 5/xxx Series 4 (Chimay) * PCChips M560 * Compaq Presario 224x * Compaq Presario 45xx * ASUS TX97 * Intel YM430TX (Yamamoto) * Micronics Thunderbolt * Soltek SL-56A5 * ASUS SP97-XV * BCM SQ-578 * MSI MS-5172 * FIC VA-502 * FIC PA-2012 * PCPartner VIA809DS Super Socket 7: * DFI K6BV3+ (rev A+) * PCChips M579 Slot 1: * ABIT AB-LX6 * Dell OptiPlex GXa * Micronics Spitfire * Supermicro P6SBA Machines where the ACPI status is unknown have been left alone. --- src/machine/machine_table.c | 42 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 950705def..8d95087f5 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -13442,7 +13442,7 @@ const machine_t machines[] = { .max_multi = 2.0 }, .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, .max = 131072, @@ -14436,7 +14436,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, .max = 786432, @@ -15069,7 +15069,7 @@ const machine_t machines[] = { .max_multi = 3.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 16384, .max = 49152, @@ -15114,7 +15114,7 @@ const machine_t machines[] = { .max_multi = 3.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_ACPI, + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, .ram = { .min = 16384, .max = 49152, @@ -15656,7 +15656,7 @@ const machine_t machines[] = { .max_multi = 3.5 }, .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, .max = 262144, @@ -15799,7 +15799,7 @@ const machine_t machines[] = { .max_multi = 3.5 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_SOUND | MACHINE_GAMEPORT, /* Machine has internal video: ATI Mach64GT-B 3D Rage II */ + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_SOUND | MACHINE_GAMEPORT, /* Machine has internal video: ATI Mach64GT-B 3D Rage II */ .ram = { .min = 8192, .max = 262144, @@ -15844,7 +15844,7 @@ const machine_t machines[] = { .max_multi = 3.5 }, .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 4096, .max = 262144, @@ -15895,7 +15895,7 @@ const machine_t machines[] = { }, .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, /* Machine has internal sound: Yamaha YMF701-S */ - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_GAMEPORT | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_GAMEPORT | MACHINE_USB, .ram = { .min = 8192, .max = 262144, @@ -16029,7 +16029,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 4096, .max = 262144, @@ -16297,7 +16297,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, .max = 1572864, @@ -16341,7 +16341,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, .max = 1572864, @@ -16387,7 +16387,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_AGP | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, .max = 786432, @@ -16434,7 +16434,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, .max = 524288, @@ -16481,7 +16481,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, .max = 1048576, @@ -16526,7 +16526,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, .max = 1048576, @@ -16750,7 +16750,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, /* Machine has internal sound: C-Media CMI8330 */ + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, /* Machine has internal sound: C-Media CMI8330 */ .ram = { .min = 8192, .max = 1572864, @@ -16888,7 +16888,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 16384, .max = 786432, @@ -17835,7 +17835,7 @@ const machine_t machines[] = { .max_multi = 5.5 }, .bus_flags = MACHINE_PS2_AGP | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, .max = 1048576, @@ -17880,7 +17880,7 @@ const machine_t machines[] = { .max_multi = 5.0 }, .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, /* Video: ATi 3D Rage Pro, Network: 3Com 3C905, Sound: Crystal CS4236B */ + .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_USB, /* Video: ATi 3D Rage Pro, Network: 3Com 3C905, Sound: Crystal CS4236B */ .ram = { .min = 8192, .max = 786432, @@ -17925,7 +17925,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, /* Machine has internal sound: Yamaha YMF701 */ + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, /* Machine has internal sound: Yamaha YMF701 */ .ram = { .min = 8192, .max = 1048576, @@ -18422,7 +18422,7 @@ const machine_t machines[] = { .max_multi = 8.0 }, .bus_flags = MACHINE_PS2_AGP | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, .max = 786432, From f45cf3914d1445be207a9b32c7c05d48e7bf9573 Mon Sep 17 00:00:00 2001 From: richardg867 Date: Fri, 24 Oct 2025 12:24:47 -0300 Subject: [PATCH 077/113] Fix AN430TX BIOS internal names [skip ci] --- src/machine/m_at_socket7.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 15e0316f2..1bd491c6f 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -1480,7 +1480,7 @@ static const device_config_t an430tx_config[] = { .name = "bios", .description = "BIOS Version", .type = CONFIG_BIOS, - .default_string = "pb79x", + .default_string = "an430tx", .default_int = 0, .file_filter = NULL, .spinner = { 0 }, @@ -1488,7 +1488,7 @@ static const device_config_t an430tx_config[] = { .bios = { { .name = "PhoenixBIOS 4.0 Release 6.0 - Revision P02-0011 (Sony Vaio PCV-130/150)", - .internal_name = "vaio150", + .internal_name = "pcv150", .bios_type = BIOS_NORMAL, .files_no = 5, .local = 0, @@ -1499,7 +1499,7 @@ static const device_config_t an430tx_config[] = { }, { .name = "PhoenixBIOS 4.0 Release 6.0 - Revision P09-0006 (Packard Bell PB79x)", - .internal_name = "pb79x", + .internal_name = "an430tx", .bios_type = BIOS_NORMAL, .files_no = 5, .local = 0, From 968c6edac0b17b46770ae419a9afcdfa8c246e8f Mon Sep 17 00:00:00 2001 From: richardg867 Date: Fri, 24 Oct 2025 12:40:25 -0300 Subject: [PATCH 078/113] Fix Multitech BIOS internal names [skip ci] --- src/machine/m_xt.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index 56ba5f843..baff87d4c 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -1214,7 +1214,7 @@ static const device_config_t pc500_config[] = { .name = "bios", .description = "BIOS Version", .type = CONFIG_BIOS, - .default_string = "pc500_330", + .default_string = "pc500", .default_int = 0, .file_filter = NULL, .spinner = { 0 }, @@ -1222,7 +1222,7 @@ static const device_config_t pc500_config[] = { .bios = { { .name = "3.30", - .internal_name = "pc500_330", + .internal_name = "pc500", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, @@ -1326,7 +1326,7 @@ static const device_config_t pc500plus_config[] = { .name = "bios", .description = "BIOS Version", .type = CONFIG_BIOS, - .default_string = "pc500plus_404", + .default_string = "pc500plus", .default_int = 0, .file_filter = NULL, .spinner = { 0 }, @@ -1342,7 +1342,7 @@ static const device_config_t pc500plus_config[] = { }, { .name = "4.04", - .internal_name = "pc500plus_404", + .internal_name = "pc500plus", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, @@ -1445,14 +1445,14 @@ static const device_config_t pc700_config[] = { .name = "bios", .description = "BIOS Version", .type = CONFIG_BIOS, - .default_string = "pc700_330", + .default_string = "pc700", .default_int = 0, .file_filter = NULL, .spinner = { 0 }, .bios = { { .name = "3.30", - .internal_name = "pc700_330", + .internal_name = "pc700", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, From 385f501e17384ad61f3cbd4ba49dce7023e7ee72 Mon Sep 17 00:00:00 2001 From: richardg867 Date: Fri, 24 Oct 2025 12:44:05 -0300 Subject: [PATCH 079/113] Revert Multitech PC-500 internal name change [skip ci] The machine was already added as such, so avoid NVR resets. --- src/machine/m_xt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index baff87d4c..cab2ccae3 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -1214,7 +1214,7 @@ static const device_config_t pc500_config[] = { .name = "bios", .description = "BIOS Version", .type = CONFIG_BIOS, - .default_string = "pc500", + .default_string = "pc500_330", .default_int = 0, .file_filter = NULL, .spinner = { 0 }, @@ -1222,7 +1222,7 @@ static const device_config_t pc500_config[] = { .bios = { { .name = "3.30", - .internal_name = "pc500", + .internal_name = "pc500_330", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, From 5f4f18ca8f14c81f3e3f6226e841aaac56e80ce2 Mon Sep 17 00:00:00 2001 From: richardg867 Date: Fri, 24 Oct 2025 12:45:42 -0300 Subject: [PATCH 080/113] Fix Packard Bell Tacoma BIOS internal name [skip ci] --- src/machine/m_at_slot1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index d42dee6a9..bf9a5af22 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -766,7 +766,7 @@ static const device_config_t ms6119_config[] = { .bios = { { .name = "AMIBIOS 6 (071595) - Revision 1.72 (Packard Bell Tacoma with logo)", - .internal_name = "tacoma_logo", + .internal_name = "tacoma_172", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, From d26ec73d0dd68755b0bf348f620ade9af24deaf0 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Fri, 24 Oct 2025 21:32:14 +0200 Subject: [PATCH 081/113] Add proper clock generators to the V7 cards. 1. Add a variant of the ICS1494 clock generator specifically for the Radius HT209 card. 2. Add the ICD2047 clock generator to the HT216-32 card. 3. Add the previously missing 7.00 BIOS revision of the VGA 1024i HT208 card. --- src/include/86box/vid_svga.h | 11 ++ src/video/CMakeLists.txt | 3 + src/video/clockgen/vid_clockgen_icd2047.c | 131 ++++++++++++++++ src/video/clockgen/vid_clockgen_ics1494.c | 157 ++++++++++++++++++++ src/video/clockgen/vid_clockgen_ics90c64a.c | 135 +++++++++++++++++ src/video/vid_ht216.c | 122 ++++++++++----- 6 files changed, 520 insertions(+), 39 deletions(-) create mode 100644 src/video/clockgen/vid_clockgen_icd2047.c create mode 100644 src/video/clockgen/vid_clockgen_ics1494.c create mode 100644 src/video/clockgen/vid_clockgen_ics90c64a.c diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index e0ae5ed6f..814a986c3 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -449,6 +449,8 @@ extern void ibm_rgb528_hwcursor_draw(svga_t *svga, int displine); extern float ibm_rgb528_getclock(int clock, void *priv); extern void ibm_rgb528_ramdac_set_ref_clock(void *priv, svga_t *svga, float ref_clock); +extern float icd2047_getclock(int clock, void *priv); + extern void icd2061_write(void *priv, int val); extern float icd2061_getclock(int clock, void *priv); extern void icd2061_set_ref_clock(void *priv, float ref_clock); @@ -457,8 +459,13 @@ extern void icd2061_set_ref_clock(void *priv, float ref_clock); # define ics9161_write icd2061_write # define ics9161_getclock icd2061_getclock +extern float ics1494_getclock(int clock, void *priv); + extern float ics2494_getclock(int clock, void *priv); +extern float ics90c64a_vclk_getclock(int clock, void *priv); +extern float ics90c64a_mclk_getclock(int clock, void *priv); + extern void ics2595_write(void *priv, int strobe, int dat); extern double ics2595_getclock(void *priv); extern void ics2595_setclock(void *priv, double clock); @@ -507,6 +514,8 @@ extern const device_t att20c505_ramdac_device; extern const device_t bt485a_ramdac_device; extern const device_t gendac_ramdac_device; extern const device_t ibm_rgb528_ramdac_device; +extern const device_t ics1494m_540_device; +extern const device_t ics1494m_540_radius_ht209_device; extern const device_t ics2494an_305_device; extern const device_t ics2494an_324_device; extern const device_t ati18810_28800_device; @@ -516,7 +525,9 @@ extern const device_t ati18810_mach32_device; extern const device_t ati18811_0_mach32_device; extern const device_t ati18811_1_mach32_device; extern const device_t ics2595_device; +extern const device_t icd2047_20_device; extern const device_t icd2061_device; +extern const device_t ics90c64a_903_device; extern const device_t ics9161_device; extern const device_t sc11483_ramdac_device; extern const device_t sc11487_ramdac_device; diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index 98a9cb385..201ef4a40 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -38,9 +38,12 @@ add_library(vid OBJECT # Clock generator chips clockgen/vid_clockgen_av9194.c + clockgen/vid_clockgen_icd2047.c clockgen/vid_clockgen_icd2061.c + clockgen/vid_clockgen_ics1494.c clockgen/vid_clockgen_ics2494.c clockgen/vid_clockgen_ics2595.c + clockgen/vid_clockgen_ics90c64a.c # DDC / monitor identification stuff vid_ddc.c diff --git a/src/video/clockgen/vid_clockgen_icd2047.c b/src/video/clockgen/vid_clockgen_icd2047.c new file mode 100644 index 000000000..cc2e003bf --- /dev/null +++ b/src/video/clockgen/vid_clockgen_icd2047.c @@ -0,0 +1,131 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * ICD2047 clock generator emulation. + * + * Used by the V7 chips. + * + * Authors: TheCollector1995. + * + * Copyright 2025 TheCollector1995. + */ +#include +#include +#include +#include +#include +#include +#define HAVE_STDARG_H +#include <86box/86box.h> +#include <86box/device.h> + +typedef struct icd2047_t { + float freq[32]; +} icd2047_t; + +#ifdef ENABLE_ICD2047_LOG +int icd2047_do_log = ENABLE_ICD2047_LOG; + +static void +icd2047_log(const char *fmt, ...) +{ + va_list ap; + + if (icd2047_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +} +#else +# define icd2047_log(fmt, ...) +#endif + +float +icd2047_getclock(int clock, void *priv) +{ + const icd2047_t *icd2047 = (icd2047_t *) priv; + + if (clock > 31) + clock = 31; + + return icd2047->freq[clock]; +} + +static void * +icd2047_init(const device_t *info) +{ + icd2047_t *icd2047 = (icd2047_t *) malloc(sizeof(icd2047_t)); + memset(icd2047, 0, sizeof(icd2047_t)); + + switch (info->local) { + case 20: + /* ICD2047-20 for Headland series */ + icd2047->freq[0x00] = 25175000.0; + icd2047->freq[0x01] = 28322000.0; + icd2047->freq[0x02] = 40000000.0; + icd2047->freq[0x03] = 32500000.0; + icd2047->freq[0x04] = 50350000.0; + icd2047->freq[0x05] = 65000000.0; + icd2047->freq[0x06] = 38000000.0; + icd2047->freq[0x07] = 44900000.0; + icd2047->freq[0x08] = 25175000.0; + icd2047->freq[0x09] = 28322000.0; + icd2047->freq[0x0a] = 80000000.0; + icd2047->freq[0x0b] = 32500000.0; + icd2047->freq[0x0c] = 50350000.0; + icd2047->freq[0x0d] = 65000000.0; + icd2047->freq[0x0e] = 76000000.0; + icd2047->freq[0x0f] = 44900000.0; + icd2047->freq[0x10] = 25175000.0; + icd2047->freq[0x11] = 44900000.0; + icd2047->freq[0x12] = 28322000.0; + icd2047->freq[0x13] = 38000000.0; + icd2047->freq[0x14] = 40000000.0; + icd2047->freq[0x15] = 46000000.0; + icd2047->freq[0x16] = 48000000.0; + icd2047->freq[0x17] = 60000000.0; + icd2047->freq[0x18] = 65000000.0; + icd2047->freq[0x19] = 72000000.0; + icd2047->freq[0x1a] = 74000000.0; + icd2047->freq[0x1b] = 76000000.0; + icd2047->freq[0x1c] = 78000000.0; + icd2047->freq[0x1d] = 80000000.0; + icd2047->freq[0x1e] = 100000000.0; + icd2047->freq[0x1f] = 110000000.0; + break; + + default: + break; + } + + return icd2047; +} + +static void +icd2047_close(void *priv) +{ + icd2047_t *icd2047 = (icd2047_t *) priv; + + if (icd2047) + free(icd2047); +} + +const device_t icd2047_20_device = { + .name = "ICD2047-20 Clock Generator", + .internal_name = "icd2047_20", + .flags = 0, + .local = 20, + .init = icd2047_init, + .close = icd2047_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; diff --git a/src/video/clockgen/vid_clockgen_ics1494.c b/src/video/clockgen/vid_clockgen_ics1494.c new file mode 100644 index 000000000..62af66bcd --- /dev/null +++ b/src/video/clockgen/vid_clockgen_ics1494.c @@ -0,0 +1,157 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * ICS1494 clock generator emulation. + * + * Used by the V7 and PVGA chips. + * + * Authors: TheCollector1995. + * + * Copyright 2025 TheCollector1995. + */ +#include +#include +#include +#include +#include +#include +#define HAVE_STDARG_H +#include <86box/86box.h> +#include <86box/device.h> + +typedef struct ics1494_t { + float freq[32]; +} ics1494_t; + +#ifdef ENABLE_ICS1494_LOG +int ics1494_do_log = ENABLE_ICS1494_LOG; + +static void +ics1494_log(const char *fmt, ...) +{ + va_list ap; + + if (ics1494_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +} +#else +# define ics1494_log(fmt, ...) +#endif + +float +ics1494_getclock(int clock, void *priv) +{ + const ics1494_t *ics1494 = (ics1494_t *) priv; + + if (clock > 31) + clock = 31; + + return ics1494->freq[clock]; +} + +static void * +ics1494_init(const device_t *info) +{ + ics1494_t *ics1494 = (ics1494_t *) malloc(sizeof(ics1494_t)); + memset(ics1494, 0, sizeof(ics1494_t)); + + switch (info->local) { + case 540: + /* ICS1494(M)-540 for Radius series */ + ics1494->freq[0x00] = 57283000.0; + ics1494->freq[0x01] = 12273000.0; + ics1494->freq[0x02] = 14500000.0; + ics1494->freq[0x03] = 15667000.0; + ics1494->freq[0x04] = 112000000.0; + ics1494->freq[0x05] = 126000000.0; + ics1494->freq[0x06] = 30240000.0; + ics1494->freq[0x07] = 91200000.0; + ics1494->freq[0x08] = 120000000.0; + ics1494->freq[0x09] = 48000000.0; + ics1494->freq[0x0a] = 50675000.0; + ics1494->freq[0x0b] = 55300000.0; + ics1494->freq[0x0c] = 64000000.0; + ics1494->freq[0x0d] = 68750000.0; + ics1494->freq[0x0e] = 88500000.0; + ics1494->freq[0x0f] = 51270000.0; + ics1494->freq[0x10] = 100000000.0; + ics1494->freq[0x11] = 95200000.0; + ics1494->freq[0x12] = 55000000.0; + ics1494->freq[0x13] = 60000000.0; + ics1494->freq[0x14] = 63000000.0; + ics1494->freq[0x15] = 99522000.0; + ics1494->freq[0x16] = 130000000.0; + ics1494->freq[0x17] = 80000000.0; + ics1494->freq[0x18] = 25175000.0; + ics1494->freq[0x19] = 28322000.0; + ics1494->freq[0x1a] = 48000000.0; + ics1494->freq[0x1b] = 76800000.0; + ics1494->freq[0x1c] = 38400000.0; + ics1494->freq[0x1d] = 43200000.0; + ics1494->freq[0x1e] = 61440000.0; + ics1494->freq[0x1f] = 0.0; + break; + + case 541: + /* ICS1494(M)-540 for Radius HT209 */ + ics1494->freq[0x00] = 25175000.0; + ics1494->freq[0x01] = 28322000.0; + ics1494->freq[0x02] = 61440000.0; /*FCLK*/ + ics1494->freq[0x03] = 74000000.0; /*XRESM*/ + ics1494->freq[0x04] = 50350000.0; + ics1494->freq[0x05] = 65000000.0; + ics1494->freq[0x06] = 37575000.0; /*FCLK*/ + ics1494->freq[0x07] = 40000000.0; + break; + + default: + break; + } + + return ics1494; +} + +static void +ics1494_close(void *priv) +{ + ics1494_t *ics1494 = (ics1494_t *) priv; + + if (ics1494) + free(ics1494); +} + +const device_t ics1494m_540_device = { + .name = "ICS2494M-540 Clock Generator", + .internal_name = "ics1494m_540", + .flags = 0, + .local = 540, + .init = ics1494_init, + .close = ics1494_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t ics1494m_540_radius_ht209_device = { + .name = "ICS2494M-540 (Radius HT209) Clock Generator", + .internal_name = "ics1494m_540_radius_ht209", + .flags = 0, + .local = 541, + .init = ics1494_init, + .close = ics1494_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; diff --git a/src/video/clockgen/vid_clockgen_ics90c64a.c b/src/video/clockgen/vid_clockgen_ics90c64a.c new file mode 100644 index 000000000..fd97201ce --- /dev/null +++ b/src/video/clockgen/vid_clockgen_ics90c64a.c @@ -0,0 +1,135 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * ICS90C64A clock generator emulation. + * + * Used by the PVGA chips. + * + * Authors: TheCollector1995. + * + * Copyright 2025 TheCollector1995. + */ +#include +#include +#include +#include +#include +#include +#define HAVE_STDARG_H +#include <86box/86box.h> +#include <86box/device.h> + +typedef struct ics90c64a_t { + float freq[32]; +} ics90c64a_t; + +#ifdef ENABLE_ICS90C64A_LOG +int ics90c64a_do_log = ENABLE_ICS90C64A_LOG; + +static void +ics90c64a_log(const char *fmt, ...) +{ + va_list ap; + + if (ics90c64a_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +} +#else +# define ics90c64a_log(fmt, ...) +#endif + +float +ics90c64a_vclk_getclock(int clock, void *priv) +{ + const ics90c64a_t *ics90c64a = (ics90c64a_t *) priv; + + if (clock > 15) + clock = 15; + + return ics90c64a->freq[clock]; +} + +float +ics90c64a_mclk_getclock(int clock, void *priv) +{ + const ics90c64a_t *ics90c64a = (ics90c64a_t *) priv; + + if (clock > 7) + clock = 7; + + return ics90c64a->freq[clock + 0x10]; +} + +static void * +ics90c64a_init(const device_t *info) +{ + ics90c64a_t *ics90c64a = (ics90c64a_t *) malloc(sizeof(ics90c64a_t)); + memset(ics90c64a, 0, sizeof(ics90c64a_t)); + + switch (info->local) { + case 903: + /* ICS90C64A-903 for PVGA chip series */ + ics90c64a->freq[0x0] = 30000000.0; + ics90c64a->freq[0x1] = 77250000.0; + ics90c64a->freq[0x2] = 0.0; + ics90c64a->freq[0x3] = 80000000.0; + ics90c64a->freq[0x4] = 31500000.0; + ics90c64a->freq[0x5] = 36000000.0; + ics90c64a->freq[0x6] = 75000000.0; + ics90c64a->freq[0x7] = 50000000.0; + ics90c64a->freq[0x8] = 40000000.0; + ics90c64a->freq[0x9] = 50000000.0; + ics90c64a->freq[0xa] = 32000000.0; + ics90c64a->freq[0xb] = 44900000.0; + ics90c64a->freq[0xc] = 25175000.0; + ics90c64a->freq[0xd] = 28322000.0; + ics90c64a->freq[0xe] = 65000000.0; + ics90c64a->freq[0xf] = 36000000.0; + + ics90c64a->freq[0x10] = 33000000.0; + ics90c64a->freq[0x11] = 49218000.0; + ics90c64a->freq[0x12] = 60000000.0; + ics90c64a->freq[0x13] = 30500000.0; + ics90c64a->freq[0x14] = 41612000.0; + ics90c64a->freq[0x15] = 37500000.0; + ics90c64a->freq[0x16] = 36000000.0; + ics90c64a->freq[0x17] = 44296000.0; + break; + + default: + break; + } + + return ics90c64a; +} + +static void +ics90c64a_close(void *priv) +{ + ics90c64a_t *ics90c64a = (ics90c64a_t *) priv; + + if (ics90c64a) + free(ics90c64a); +} + +const device_t ics90c64a_903_device = { + .name = "ICS90C64A-903 Clock Generator", + .internal_name = "ics90c64a_903", + .flags = 0, + .local = 903, + .init = ics90c64a_init, + .close = ics90c64a_close, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; diff --git a/src/video/vid_ht216.c b/src/video/vid_ht216.c index 005cc6dfa..128f85b36 100644 --- a/src/video/vid_ht216.c +++ b/src/video/vid_ht216.c @@ -49,6 +49,7 @@ typedef struct ht216_t { uint32_t vram_mask, linear_base; uint8_t adjust_cursor, monitor_type; + uint8_t clk_sel; int ext_reg_enable; int isabus; @@ -100,7 +101,8 @@ void ht216_out(uint16_t addr, uint8_t val, void *priv); uint8_t ht216_in(uint16_t addr, void *priv); #define BIOS_G2_GC205_PATH "roms/video/video7/BIOS.BIN" -#define BIOS_VIDEO7_VGA_1024I_PATH "roms/video/video7/Video Seven VGA 1024i - BIOS - v2.19 - 435-0062-05 - U17 - 27C256.BIN" +#define BIOS_VIDEO7_VGA_1024I_219_PATH "roms/video/video7/Video Seven VGA 1024i - BIOS - v2.19 - 435-0062-05 - U17 - 27C256.BIN" +#define BIOS_VIDEO7_VGA_1024I_700_PATH "roms/video/video7/Headland Video7 VGA 1024i v7.0 32x8 (IP) NMC27C256B@DIP28.BIN" #define BIOS_RADIUS_SVGA_MULTIVIEW_PATH "roms/video/video7/U18.BIN" #define BIOS_HT216_32_PATH "roms/video/video7/HT21632.BIN" @@ -132,6 +134,7 @@ dword_remap(svga_t *svga, uint32_t in_addr) { if (svga->packed_chain4) return in_addr; + return ((in_addr & 0xfffc) << 2) | ((in_addr & 0x30000) >> 14) | (in_addr & ~0x3ffff); } @@ -182,8 +185,8 @@ ht216_out(uint16_t addr, uint8_t val, void *priv) switch (addr) { case 0x3c2: /*Bit 17 of the display memory address, only active on odd/even modes, has no effect on graphics modes.*/ + ht216->clk_sel = (ht216->clk_sel & ~0x03) | ((val & 0x0c) >> 2); ht216->misc = val; - svga->miscout = val; ht216_log("HT216 misc val = %02x, mode = 0, chain4 = %x\n", val, svga->chain4); ht216_recalc_bank_regs(ht216, 0); ht216_remap(ht216); @@ -251,10 +254,11 @@ ht216_out(uint16_t addr, uint8_t val, void *priv) ht216->ht_regs[0xfc], ht216->ht_regs[0xfd], ht216->ht_regs[0xfe], ht216->ht_regs[0xff]); return; #endif - } else if (svga->seqaddr >= 0x80 && ht216->ext_reg_enable) { + } else if ((svga->seqaddr >= 0x80) && ht216->ext_reg_enable) { old = ht216->ht_regs[svga->seqaddr & 0xff]; ht216->ht_regs[svga->seqaddr & 0xff] = val; + ht216_log("SeqAddr=%02x, val=%02x.\n", svga->seqaddr & 0xff, val); switch (svga->seqaddr & 0xff) { case 0x83: svga->attraddr = val & 0x1f; @@ -291,7 +295,29 @@ ht216_out(uint16_t addr, uint8_t val, void *priv) break; case 0xa4: + if (ht216->id == 0x7861) + ht216->clk_sel = (val >> 2) & 0x0f; + else { + if (svga->getclock == ics1494_getclock) { + if (val & 0x10) + val &= ~0x10; + else if (!(val & 0x10)) + val |= 0x10; + } + ht216->clk_sel = (val >> 2) & 0x07; + } + svga->miscout = (svga->miscout & ~0x0c) | ((ht216->clk_sel & 0x03) << 2); + svga->fullchange = changeframecount; + svga_recalctimings(svga); + break; case 0xf8: + if (ht216->id != 0x7861) { + if ((val & 0x06) == 0x06) + ht216->clk_sel = (val >> 5) & 0x07; + } else { + if ((val & 0x05) == 0x05) + ht216->clk_sel = (val >> 4) & 0x0f; + } svga->fullchange = changeframecount; svga_recalctimings(svga); break; @@ -555,6 +581,7 @@ ht216_in(uint16_t addr, void *priv) case 0x3c9: if (ht216->id == 0x7152) return sc1148x_ramdac_in(addr, 0, svga->ramdac, svga); + return svga_in(addr, svga); case 0x3cb: @@ -562,9 +589,6 @@ ht216_in(uint16_t addr, void *priv) return ht216->reg_3cb; break; - case 0x3cc: - return svga->miscout; - case 0x3D4: return svga->crtcreg; case 0x3D5: @@ -628,8 +652,7 @@ ht216_recalctimings(svga_t *svga) ht216_t *ht216 = (ht216_t *) svga->priv; ibm8514_t *dev = (ibm8514_t *) svga->dev8514; mach_t *mach = (mach_t *) svga->ext8514; - int high_res_256 = 0; - + int high_res_256 = 0; if (ht216->id == 0x7861) { if (ht216->ht_regs[0xe0] & 0x20) { @@ -640,23 +663,8 @@ ht216_recalctimings(svga_t *svga) } } - switch ((((((svga->miscout >> 2) & 3) || ((ht216->ht_regs[0xa4] >> 2) & 3)) | ((ht216->ht_regs[0xa4] >> 2) & 4)) || ((ht216->ht_regs[0xf8] >> 5) & 0x0f)) | ((ht216->ht_regs[0xf8] << 1) & 8)) { - case 0: - case 1: - break; - case 4: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 50350000.0; - break; - case 5: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 65000000.0; - break; - case 7: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 40000000.0; - break; - default: - svga->clock = (cpuclock * (double) (1ULL << 32)) / 36000000.0; - break; - } + svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(ht216->clk_sel, svga->clock_gen); + ht216_log("ClkSel V7=%02x, regf8=%02x, rega4=%02x, miscout=%x, vidclock=%02x.\n", ht216->clk_sel, ht216->ht_regs[0xf8], ht216->ht_regs[0xa4], (svga->miscout >> 2) & 0x03, svga->vidclock); svga->memaddr_latch |= ((ht216->ht_regs[0xf6] & 0x30) << 12); @@ -697,7 +705,6 @@ ht216_recalctimings(svga_t *svga) if (high_res_256) { svga->hdisp >>= 1; svga->dots_per_clock >>= 1; - svga->clock /= 2; ht216->adjust_cursor = 1; } svga->render = svga_render_8bpp_highres; @@ -705,7 +712,6 @@ ht216_recalctimings(svga_t *svga) if (high_res_256) { svga->hdisp >>= 1; svga->dots_per_clock >>= 1; - svga->clock /= 2; ht216->adjust_cursor = 1; svga->render = svga_render_8bpp_highres; } else { @@ -729,7 +735,6 @@ ht216_recalctimings(svga_t *svga) svga->rowoffset <<= 1; svga->hdisp >>= 1; svga->dots_per_clock >>= 1; - svga->clock /= 2; if ((svga->crtc[0x17] & 0x60) == 0x20) /*Would result in a garbled screen with trailing cursor glitches*/ svga->crtc[0x17] |= 0x40; svga->render = svga_render_15bpp_highres; @@ -1513,10 +1518,16 @@ ht216_init(const device_t *info, uint32_t mem_size, int has_rom) { ht216_t *ht216 = malloc(sizeof(ht216_t)); svga_t *svga; + const char *bios_ver = NULL; + const char *fn = NULL; memset(ht216, 0, sizeof(ht216_t)); svga = &ht216->svga; + ht216->id = info->local; + ht216->isabus = (info->flags & DEVICE_ISA) || (info->flags & DEVICE_ISA16); + ht216->mca = (info->flags & DEVICE_MCA); + if (info->flags & DEVICE_VLB) video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_v7vga_vlb); else if (info->flags & DEVICE_MCA) @@ -1535,7 +1546,9 @@ ht216_init(const device_t *info, uint32_t mem_size, int has_rom) rom_init(&ht216->bios_rom, BIOS_G2_GC205_PATH, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); break; case 2: - rom_init(&ht216->bios_rom, BIOS_VIDEO7_VGA_1024I_PATH, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + bios_ver = (char *) device_get_config_bios("bios_ver"); + fn = (char *) device_get_bios_file(info, bios_ver, 0); + rom_init(&ht216->bios_rom, fn, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); break; case 3: ht216->monitor_type = device_get_config_int("monitor_type"); @@ -1583,13 +1596,20 @@ ht216_init(const device_t *info, uint32_t mem_size, int has_rom) break; } + svga->bpp = 8; + svga->miscout = 1; svga->hwcursor.cur_ysize = 32; ht216->vram_mask = mem_size - 1; svga->decode_mask = mem_size - 1; - if (has_rom == 4) + if (ht216->id == 0x7152) { svga->ramdac = device_add(&sc11484_nors2_ramdac_device); - + svga->clock_gen = device_add(&ics1494m_540_radius_ht209_device); + svga->getclock = ics1494_getclock; + } else { + svga->clock_gen = device_add(&icd2047_20_device); + svga->getclock = icd2047_getclock; + } svga->read = ht216_read; svga->readw = NULL; svga->readl = NULL; @@ -1607,16 +1627,9 @@ ht216_init(const device_t *info, uint32_t mem_size, int has_rom) mem_mapping_set_p(&svga->mapping, ht216); mem_mapping_disable(&ht216->linear_mapping); - ht216->id = info->local; - ht216->isabus = (info->flags & DEVICE_ISA) || (info->flags & DEVICE_ISA16); - ht216->mca = (info->flags & DEVICE_MCA); - io_sethandler(0x03c0, 0x0020, ht216_in, NULL, NULL, ht216_out, NULL, NULL, ht216); io_sethandler(0x46e8, 0x0001, ht216_in, NULL, NULL, ht216_out, NULL, NULL, ht216); - svga->bpp = 8; - svga->miscout = 1; - if (ht216->id == 0x7861) ht216->ht_regs[0xb4] = 0x08; /*32-bit DRAM bus*/ @@ -1681,7 +1694,7 @@ g2_gc205_available(void) static int v7_vga_1024i_available(void) { - return rom_present(BIOS_VIDEO7_VGA_1024I_PATH); + return rom_present(BIOS_VIDEO7_VGA_1024I_219_PATH); } static int @@ -1724,6 +1737,37 @@ ht216_force_redraw(void *priv) // clang-format off static const device_config_t v7_vga_1024i_config[] = { + { + .name = "bios_ver", + .description = "BIOS Revision", + .type = CONFIG_BIOS, + .default_string = "v2_19", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "Version 2.19", + .internal_name = "v2_19", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 32768, + .files = { BIOS_VIDEO7_VGA_1024I_219_PATH, "" } + }, + { + .name = "Version 7.00", + .internal_name = "v7_00", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 32768, + .files = { BIOS_VIDEO7_VGA_1024I_700_PATH, "" } + }, + { .files_no = 0 } + } + }, { .name = "memory", .description = "Memory size", From 6a55ed037231744308ccd2df0924b90089d2071f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 24 Oct 2025 00:12:50 -0400 Subject: [PATCH 082/113] Correct Thrustmaster Formula T1/T2 options [skip-ci] --- src/game/joystick_standard.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/game/joystick_standard.c b/src/game/joystick_standard.c index fc0006b45..a1ed501b6 100644 --- a/src/game/joystick_standard.c +++ b/src/game/joystick_standard.c @@ -235,6 +235,26 @@ joystick_standard_read_axis_2axis(UNUSED(void *priv), int axis) } } +static int +joystick_standard_read_axis_2axis_t1t2wa(UNUSED(void *priv), int axis) +{ + uint8_t gp = 0; + + if (!JOYSTICK_PRESENT(gp, 0)) + return AXIS_NOT_PRESENT; + + switch (axis) { + case 0: + return joystick_state[gp][0].axis[0]; + case 2: + return joystick_state[gp][0].axis[1]; + case 1: + case 3: + default: + return 0; + } +} + #if 0 // For later use static int @@ -904,13 +924,13 @@ const joystick_t joystick_tm_formula_t1t2wa = { .close = joystick_standard_close, .read = joystick_standard_read_4button, .write = joystick_standard_write, - .read_axis = joystick_standard_read_axis_3axis, + .read_axis = joystick_standard_read_axis_2axis_t1t2wa, .a0_over = joystick_standard_a0_over, - .axis_count = 3, + .axis_count = 2, .button_count = 4, .pov_count = 0, .max_joysticks = 1, - .axis_names = { "Steering axis", "Accelerator axis", "Brake axis" }, + .axis_names = { "Steering axis", "Accelerator/Brake axis" }, .button_names = { "Shifter Up", "Shifter Down", "Top Console Switch", "Bottom Console Switch" }, .pov_names = { NULL } }; From 13ccf190171723c12cb1100ba5a0b9f51b5c8342 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 24 Oct 2025 21:42:52 -0400 Subject: [PATCH 083/113] Use Realtek OID for RTL8139C+ [skip-ci] --- src/network/net_rtl8139.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/network/net_rtl8139.c b/src/network/net_rtl8139.c index 5f2c85b03..9cc52417f 100644 --- a/src/network/net_rtl8139.c +++ b/src/network/net_rtl8139.c @@ -3257,14 +3257,9 @@ nic_init(const device_t *info) eep_data[1] = 0x10EC; eep_data[2] = 0x8139; - /* XXX: Get proper MAC addresses from real EEPROM dumps. OID taken from net_ne2000.c */ -#ifdef USE_REALTEK_OID + /* XXX: Get proper MAC addresses from real EEPROM dumps. OID is generic Realtek */ eep_data[7] = 0xe000; eep_data[8] = 0x124c; -#else - eep_data[7] = 0x1400; - eep_data[8] = 0x122a; -#endif eep_data[9] = 0x1413; mac_bytes = (uint8_t *) &(eep_data[7]); From 5b2951187b54e3cc648a8c3be23da06150d7cb4e Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 25 Oct 2025 12:42:45 -0300 Subject: [PATCH 084/113] Add config migration for goldstar CD-ROM drive [skip ci] --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 590ba8119..4a0556de9 100644 --- a/src/config.c +++ b/src/config.c @@ -1501,7 +1501,7 @@ load_floppy_and_cdrom_drives(void) sprintf(temp, "cdrom_%02i_type", c + 1); p = ini_section_get_string(cat, temp, cdrom[c].bus_type == CDROM_BUS_MKE ? "cr563" : "86cd"); /* TODO: Configuration migration, remove when no longer needed. */ - int cdrom_type = cdrom_get_from_internal_name(p); + int cdrom_type = cdrom_get_from_internal_name(!strcmp(p, "goldstar") ? "goldstar_r560b" : p); if (cdrom_type == -1) { cdrom_type = cdrom_get_from_name(p); if (cdrom_type == -1) From 526d4db0767a189fbcddc87d0ae13aef1b9f120b Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 25 Oct 2025 12:44:40 -0300 Subject: [PATCH 085/113] Fix DTK BIOS internal name [skip ci] --- src/machine/m_xt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index cab2ccae3..5969f25c9 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -902,7 +902,7 @@ static const device_config_t dtk_config[] = { .name = "bios", .description = "BIOS Version", .type = CONFIG_BIOS, - .default_string = "dtk_242", + .default_string = "dtk", .default_int = 0, .file_filter = NULL, .spinner = { 0 }, @@ -919,7 +919,7 @@ static const device_config_t dtk_config[] = { }, { .name = "2.42", - .internal_name = "dtk_242", + .internal_name = "dtk", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, From 8f94c6452c624f32fe991356af5ca67c9c2c8993 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 25 Oct 2025 13:31:15 -0300 Subject: [PATCH 086/113] Fix Dataexpert 386WB AMI BIOS internal name [skip ci] --- src/machine/m_at_386dx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/m_at_386dx.c b/src/machine/m_at_386dx.c index 3070c19c1..cd24b9161 100644 --- a/src/machine/m_at_386dx.c +++ b/src/machine/m_at_386dx.c @@ -346,7 +346,7 @@ static const device_config_t dataexpert386wb_config[] = { .bios = { { .name = "AMIBIOS 050591", - .internal_name = "ami386wb", + .internal_name = "dataexpert386wb_ami", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, @@ -370,7 +370,7 @@ static const device_config_t dataexpert386wb_config[] = { }; const device_t dataexpert386wb_device = { - .name = "DataExpert 386WB", + .name = "DataExpert 386C", .internal_name = "dataexpert386wb_device", .flags = 0, .local = 0, From 204888c854029bac5a886b2d05919c8851582bef Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 25 Oct 2025 13:36:20 -0300 Subject: [PATCH 087/113] Fix P5MP3 beta BIOS internal name [skip ci] --- src/machine/m_at_socket4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index 1d77d99a4..991ff9cab 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -181,7 +181,7 @@ static const device_config_t p5mp3_config[] = { }, { .name = "Award Modular BIOS v4.51G - Revision 0402 (Beta)", - .internal_name = "p5mp3_beta", + .internal_name = "p5mp3_0402", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, From e637e83d22044dc8fe5d8b7de866cd1a9c29b431 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 25 Oct 2025 14:01:13 -0300 Subject: [PATCH 088/113] Fix Multitech PC-900 BIOS internal name [skip ci] --- src/machine/m_at_286.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/m_at_286.c b/src/machine/m_at_286.c index 357a0f872..499f0653a 100644 --- a/src/machine/m_at_286.c +++ b/src/machine/m_at_286.c @@ -345,14 +345,14 @@ static const device_config_t pc900_config[] = { .name = "bios", .description = "BIOS Version", .type = CONFIG_BIOS, - .default_string = "pc900_v207a", + .default_string = "pc900", .default_int = 0, .file_filter = "", .spinner = { 0 }, .bios = { { .name = "BIOS V2.07A", - .internal_name = "pc900_v207a", + .internal_name = "pc900", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, From aa9101418a8ac11f5e75e91c35ac2ab7a745f1f4 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 25 Oct 2025 14:28:27 -0300 Subject: [PATCH 089/113] Naming fixes to the HP Vectra Series 2 [skip ci] --- src/include/86box/machine.h | 4 +-- src/machine/m_at_socket7_3v.c | 46 +++++++++++++++++------------------ src/machine/machine_table.c | 6 ++--- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 8cc928f91..bfbfe0018 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -971,9 +971,9 @@ extern const device_t p54tp4xe_device; extern int machine_at_p54tp4xe_init(const machine_t *); extern int machine_at_exp8551_init(const machine_t *); #ifdef EMU_DEVICE_H -extern const device_t hpvectravexxx_device; +extern const device_t vectra52_device; #endif -extern int machine_at_hpvectravexxx_init(const machine_t *); +extern int machine_at_vectra52_init(const machine_t *); extern int machine_at_vectra500mt_init(const machine_t *); extern int machine_at_vectra54_init(const machine_t *); #ifdef EMU_DEVICE_H diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 264a220fc..07faa9f9f 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -158,38 +158,38 @@ machine_at_exp8551_init(const machine_t *model) } static void -machine_at_hpvectravexxx_gpio_init(void) +machine_at_vectra52_gpio_init(void) { uint32_t gpio = 0x40; - if (cpu_busspeed <= 40000000) - gpio |= 0x30; - else if ((cpu_busspeed > 40000000) && (cpu_busspeed <= 50000000)) + if (cpu_busspeed <= 40000000) + gpio |= 0x30; + else if ((cpu_busspeed > 40000000) && (cpu_busspeed <= 50000000)) gpio |= 0x00; - else if ((cpu_busspeed > 50000000) && (cpu_busspeed <= 60000000)) - gpio |= 0x20; - else if (cpu_busspeed > 60000000) + else if ((cpu_busspeed > 50000000) && (cpu_busspeed <= 60000000)) + gpio |= 0x20; + else if (cpu_busspeed > 60000000) gpio |= 0x10; - if (cpu_dmulti <= 1.5) + if (cpu_dmulti <= 1.5) gpio |= 0x82; - else if ((cpu_dmulti > 1.5) && (cpu_dmulti <= 2.0)) + else if ((cpu_dmulti > 1.5) && (cpu_dmulti <= 2.0)) gpio |= 0x02; - else if ((cpu_dmulti > 2.0) && (cpu_dmulti <= 2.5)) + else if ((cpu_dmulti > 2.0) && (cpu_dmulti <= 2.5)) gpio |= 0x00; - else if (cpu_dmulti > 2.5) + else if (cpu_dmulti > 2.5) gpio |= 0x80; machine_set_gpio_default(gpio); } -static const device_config_t hpvectravexxx_config[] = { +static const device_config_t vectra52_config[] = { // clang-format off { .name = "bios", .description = "BIOS Version", .type = CONFIG_BIOS, - .default_string = "gu_07_05", + .default_string = "vectra52_0705", .default_int = 0, .file_filter = NULL, .spinner = { 0 }, @@ -197,21 +197,21 @@ static const device_config_t hpvectravexxx_config[] = { .bios = { { .name = "GU.07.02 (01/25/96)", - .internal_name = "gu_07_02", + .internal_name = "vectra52_0702", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 131072, - .files = { "roms/machines/hpvectravexxx/d3653.bin", "" } + .files = { "roms/machines/vectra52/d3653.bin", "" } }, { .name = "GU.07.05 (08/06/96)", - .internal_name = "gu_07_05", + .internal_name = "vectra52_0705", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, .size = 131072, - .files = { "roms/machines/hpvectravexxx/GU0705US.FUL", "" } + .files = { "roms/machines/vectra52/GU0705US.FUL", "" } }, { .files_no = 0 } } @@ -220,9 +220,9 @@ static const device_config_t hpvectravexxx_config[] = { // clang-format on }; -const device_t hpvectravexxx_device = { - .name = "HP Vectra VE 5/XXX Series 2", - .internal_name = "hpvectravexxx_device", +const device_t vectra52_device = { + .name = "HP Vectra VE 5/xxx Series 2", + .internal_name = "vectra52", .flags = 0, .local = 0, .init = NULL, @@ -231,11 +231,11 @@ const device_t hpvectravexxx_device = { .available = NULL, .speed_changed = NULL, .force_redraw = NULL, - .config = hpvectravexxx_config + .config = vectra52_config }; int -machine_at_hpvectravexxx_init(const machine_t *model) +machine_at_vectra52_init(const machine_t *model) { int ret = 0; const char *fn; @@ -250,7 +250,7 @@ machine_at_hpvectravexxx_init(const machine_t *model) device_context_restore(); machine_at_common_init_ex(model, 2); - machine_at_hpvectravexxx_gpio_init(); + machine_at_vectra52_gpio_init(); pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 8d95087f5..b8ced65cd 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -13378,10 +13378,10 @@ const machine_t machines[] = { }, { .name = "[i430FX] HP Vectra VE 5/xxx Series 2", - .internal_name = "hpvectravexxx", + .internal_name = "vectra52", .type = MACHINE_TYPE_SOCKET7_3V, .chipset = MACHINE_CHIPSET_INTEL_430FX, - .init = machine_at_hpvectravexxx_init, + .init = machine_at_vectra52_init, .p1_handler = machine_generic_p1_handler, .gpio_handler = NULL, .available_flag = MACHINE_AVAILABLE, @@ -13411,7 +13411,7 @@ const machine_t machines[] = { .kbc_p1 = 0x00000cf0, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, - .device = &hpvectravexxx_device, + .device = &vectra52_device, .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, From 9682b88cf2b2d19b0852485c0634f34d7ca95404 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 25 Oct 2025 15:06:13 -0300 Subject: [PATCH 090/113] Fix typos in commented out PCjr code [skip ci] --- src/machine/m_pcjr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 77a0ee392..78f7ba710 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -832,8 +832,8 @@ static const device_config_t pcjr_config[] = { .bios = { { 0 } } }, { - .name = "ir_reciever", - .description = "Enable IR Reciever", + .name = "ir_receiver", + .description = "Enable IR Receiver", .type = CONFIG_BINARY, .default_string = NULL, .default_int = 0, @@ -883,7 +883,7 @@ machine_pcjr_init(UNUSED(const machine_t *model)) #endif pcjr->option_fdc = 0; #if 0 - pcjr->option_ir = device_get_config_int("ir_reciever"); + pcjr->option_ir = device_get_config_int("ir_receiver"); #else pcjr->option_ir = 0; #endif From 3fdf56513f32c543c01d6b6f1c73fc9ffe5e204a Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 25 Oct 2025 16:15:38 -0300 Subject: [PATCH 091/113] Revert Rise R534F BIOS selector to the 5.1 internal names --- src/machine/m_at_386dx.c | 2 +- src/machine/m_at_socket7.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/machine/m_at_386dx.c b/src/machine/m_at_386dx.c index cd24b9161..3a90f801d 100644 --- a/src/machine/m_at_386dx.c +++ b/src/machine/m_at_386dx.c @@ -346,7 +346,7 @@ static const device_config_t dataexpert386wb_config[] = { .bios = { { .name = "AMIBIOS 050591", - .internal_name = "dataexpert386wb_ami", + .internal_name = "dataexpert386wb_050591", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 1bd491c6f..f37ea4fc2 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -1859,7 +1859,7 @@ static const device_config_t r534f_config[] = { .name = "bios", .description = "BIOS Version", .type = CONFIG_BIOS, - .default_string = "r534f", + .default_string = "r534f_1998", .default_int = 0, .file_filter = NULL, .spinner = { 0 }, @@ -1867,7 +1867,7 @@ static const device_config_t r534f_config[] = { .bios = { { .name = "Award Modular BIOS v4.51PG - Revision 06/12/1998", - .internal_name = "r534f", + .internal_name = "r534f_1998", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, @@ -1876,7 +1876,7 @@ static const device_config_t r534f_config[] = { }, { .name = "Award Modular BIOS v4.51PG - Revision 03/13/2000 (by Unicore Software)", - .internal_name = "r534f_unicore", + .internal_name = "r534f", .bios_type = BIOS_NORMAL, .files_no = 1, .local = 0, From d1f101f9ee03ac3ed7dfff13c4fd11abd2a2d153 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 25 Oct 2025 16:56:15 -0300 Subject: [PATCH 092/113] Add fallback for unknown CONFIG_BIOS names --- src/device.c | 146 +++++++++--------------------------- src/include/86box/device.h | 2 +- src/machine/machine_table.c | 2 +- 3 files changed, 38 insertions(+), 112 deletions(-) diff --git a/src/device.c b/src/device.c index cd5adfee0..98d4794cf 100644 --- a/src/device.c +++ b/src/device.c @@ -396,143 +396,69 @@ device_available(const device_t *dev) return ret; } -uint8_t -device_get_bios_type(const device_t *dev, const char *internal_name) +static const device_config_bios_t * +device_get_bios(const device_t *dev, const char *internal_name) { if (dev != NULL) { const device_config_t *config = dev->config; - if (config != NULL) { - while (config->type != CONFIG_END) { - if (config->type == CONFIG_BIOS) { - const device_config_bios_t *bios = (const device_config_bios_t *) config->bios; - while ((bios != NULL) && - (bios->name != NULL) && - (bios->internal_name != NULL) && - (bios->files_no != 0)) { - if (!strcmp(internal_name, bios->internal_name)) - return bios->bios_type; - bios++; - } + while (config && (config->type != CONFIG_END)) { + if (config->type == CONFIG_BIOS) { + const device_config_bios_t *bios = (const device_config_bios_t *) config->bios; + + /* Go through the ROMs in the device configuration. */ + while ((bios != NULL) && + (bios->name != NULL) && + (bios->internal_name != NULL) && + (bios->files_no != 0)) { + if (!strcmp(internal_name, bios->internal_name)) + return bios; + bios++; } - config++; + + /* Unknown value, fall back to the default ROMs. */ + if (strcmp(internal_name, config->default_string)) + return device_get_bios(dev, config->default_string); } + config++; } } - return 0; + return NULL; +} + +uint8_t +device_get_bios_type(const device_t *dev, const char *internal_name) +{ + const device_config_bios_t *bios = device_get_bios(dev, internal_name); + return bios ? bios->bios_type : 0; } uint8_t device_get_bios_num_files(const device_t *dev, const char *internal_name) { - if (dev != NULL) { - const device_config_t *config = dev->config; - if (config != NULL) { - while (config->type != CONFIG_END) { - if (config->type == CONFIG_BIOS) { - const device_config_bios_t *bios = (const device_config_bios_t *) config->bios; - while ((bios != NULL) && - (bios->name != NULL) && - (bios->internal_name != NULL) && - (bios->files_no != 0)) { - if (!strcmp(internal_name, bios->internal_name)) - return bios->files_no; - bios++; - } - } - config++; - } - } - } - - return 0; + const device_config_bios_t *bios = device_get_bios(dev, internal_name); + return bios ? bios->files_no : 0; } uint32_t device_get_bios_local(const device_t *dev, const char *internal_name) { - if (dev != NULL) { - const device_config_t *config = dev->config; - if (config != NULL) { - while (config->type != CONFIG_END) { - if (config->type == CONFIG_BIOS) { - const device_config_bios_t *bios = (const device_config_bios_t *) config->bios; - while ((bios != NULL) && - (bios->name != NULL) && - (bios->internal_name != NULL) && - (bios->files_no != 0)) { - if (!strcmp(internal_name, bios->internal_name)) - return bios->local; - bios++; - } - } - config++; - } - } - } - - return 0; + const device_config_bios_t *bios = device_get_bios(dev, internal_name); + return bios ? bios->local : 0; } uint32_t device_get_bios_file_size(const device_t *dev, const char *internal_name) { - if (dev != NULL) { - const device_config_t *config = dev->config; - if (config != NULL) { - while (config->type != CONFIG_END) { - if (config->type == CONFIG_BIOS) { - const device_config_bios_t *bios = (const device_config_bios_t *) config->bios; - - /* Go through the ROM's in the device configuration. */ - while ((bios != NULL) && - (bios->name != NULL) && - (bios->internal_name != NULL) && - (bios->files_no != 0)) { - if (!strcmp(internal_name, bios->internal_name)) - return bios->size; - bios++; - } - } - config++; - } - } - } - - return 0; + const device_config_bios_t *bios = device_get_bios(dev, internal_name); + return bios ? bios->size : 0; } const char * -device_get_bios_file(const device_t *dev, const char *internal_name, int file_no) +device_get_bios_file(const device_t *dev, const char *internal_name, unsigned int file_no) { - if (dev != NULL) { - const device_config_t *config = dev->config; - if (config != NULL) { - while (config->type != CONFIG_END) { - if (config->type == CONFIG_BIOS) { - const device_config_bios_t *bios = (const device_config_bios_t *) config->bios; - - /* Go through the ROM's in the device configuration. */ - while ((bios != NULL) && - (bios->name != NULL) && - (bios->internal_name != NULL) && - (bios->files_no != 0)) { - if (!strcmp(internal_name, bios->internal_name)) { - if (file_no < bios->files_no) - return bios->files[file_no]; - else - return NULL; - } - bios++; - } - } - config++; - } - } - } - - /* A NULL device is never available. */ - return (NULL); + const device_config_bios_t *bios = device_get_bios(dev, internal_name); + return (bios && (file_no < bios->files_no)) ? bios->files[file_no] : NULL; } int diff --git a/src/include/86box/device.h b/src/include/86box/device.h index c3892d27c..b6e78f41c 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -213,7 +213,7 @@ extern uint8_t device_get_bios_type(const device_t *dev, const char *interna extern uint8_t device_get_bios_num_files(const device_t *dev, const char *internal_name); extern uint32_t device_get_bios_local(const device_t *dev, const char *internal_name); extern uint32_t device_get_bios_file_size(const device_t *dev, const char *internal_name); -extern const char *device_get_bios_file(const device_t *dev, const char *internal_name, int file_no); +extern const char *device_get_bios_file(const device_t *dev, const char *internal_name, unsigned int file_no); extern int device_is_valid(const device_t *, int mch); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index b8ced65cd..7628d29fa 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -20319,7 +20319,7 @@ machine_get_nvr_name_ex(int m) if (dev != NULL) { device_context(dev); - const char *bios = device_get_config_string("bios"); + const char *bios = device_get_config_bios("bios"); if ((bios != NULL) && (strcmp(bios, "") != 0)) ret = bios; device_context_restore(); From 4e124968de7f985d48850cac059e4e9a3e4c1c8e Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sat, 25 Oct 2025 23:16:57 +0200 Subject: [PATCH 093/113] Unbreak 800x600x32bpp Elsa Winner 1000 928VL mode. Fix its clock and as well as 640x480x32bpp OEM mode clock. --- src/video/vid_s3.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 74b57370e..e03ef71ba 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -4536,16 +4536,21 @@ s3_recalctimings(svga_t *svga) break; case SC1502X: /*SC15025 RAMDAC*/ if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + s3_log("32bpp 928 ISA VL SC1502X double=%02x, highres=%02x, dotperclock=%d, clksel=%d, pitch=%d, hdisp=%d, clock=%02x.\n", + svga->crtc[0x31] & 0x02, s3->accel.advfunc_cntl & 0x04, svga->dots_per_clock, clk_sel, s3->width, svga->hdisp, svga->crtc[0x67] >> 4); if (svga->crtc[0x31] & 0x02) { - svga->hdisp >>= 1; - svga->dots_per_clock >>= 1; - if (svga->hdisp == 640) - s3->width = 1024; + if (svga->dots_per_clock == 16) { + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + svga->clock *= 2.0; + if (svga->hdisp == 640) + s3->width = 1024; + } } else { svga->hdisp >>= 2; svga->dots_per_clock >>= 2; if (svga->hdisp == 800) - s3->width = 1024; + svga->clock *= 2.0; } } break; From f5aea8d540bb98c3cab33998fdd2e74dd1c5fdac Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sat, 25 Oct 2025 23:26:47 +0200 Subject: [PATCH 094/113] Unbreak 800x600x32bpp Elsa Winner 1000 928VL mode. (#6403) Fix its clock and as well as 640x480x32bpp OEM mode clock. --- src/video/vid_s3.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 74b57370e..e03ef71ba 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -4536,16 +4536,21 @@ s3_recalctimings(svga_t *svga) break; case SC1502X: /*SC15025 RAMDAC*/ if (svga->getclock == icd2061_getclock) { /*ICD2061 clock chip*/ + s3_log("32bpp 928 ISA VL SC1502X double=%02x, highres=%02x, dotperclock=%d, clksel=%d, pitch=%d, hdisp=%d, clock=%02x.\n", + svga->crtc[0x31] & 0x02, s3->accel.advfunc_cntl & 0x04, svga->dots_per_clock, clk_sel, s3->width, svga->hdisp, svga->crtc[0x67] >> 4); if (svga->crtc[0x31] & 0x02) { - svga->hdisp >>= 1; - svga->dots_per_clock >>= 1; - if (svga->hdisp == 640) - s3->width = 1024; + if (svga->dots_per_clock == 16) { + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + svga->clock *= 2.0; + if (svga->hdisp == 640) + s3->width = 1024; + } } else { svga->hdisp >>= 2; svga->dots_per_clock >>= 2; if (svga->hdisp == 800) - s3->width = 1024; + svga->clock *= 2.0; } } break; From 0a80ae2debdb61f381194ed5f17b5579d5510cc4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 26 Oct 2025 01:56:53 +0200 Subject: [PATCH 095/113] T1/T2 with/without adpator name fixes and translations (also for the paddle controller). --- src/game/joystick_standard.c | 4 ++-- src/qt/languages/cs-CZ.po | 10 +++++----- src/qt/languages/de-DE.po | 10 +++++----- src/qt/languages/es-ES.po | 10 +++++----- src/qt/languages/fi-FI.po | 10 +++++----- src/qt/languages/fr-FR.po | 10 +++++----- src/qt/languages/hr-HR.po | 10 +++++----- src/qt/languages/it-IT.po | 10 +++++----- src/qt/languages/ja-JP.po | 10 +++++----- src/qt/languages/ko-KR.po | 10 +++++----- src/qt/languages/nb-NO.po | 10 +++++----- src/qt/languages/nl-NL.po | 10 +++++----- src/qt/languages/pl-PL.po | 8 ++++---- src/qt/languages/pt-BR.po | 10 +++++----- src/qt/languages/pt-PT.po | 10 +++++----- src/qt/languages/ru-RU.po | 4 ++-- src/qt/languages/sk-SK.po | 10 +++++----- src/qt/languages/sl-SI.po | 10 +++++----- src/qt/languages/sv-SE.po | 10 +++++----- src/qt/languages/tr-TR.po | 10 +++++----- src/qt/languages/uk-UA.po | 10 +++++----- src/qt/languages/vi-VN.po | 10 +++++----- src/qt/languages/zh-CN.po | 10 +++++----- src/qt/languages/zh-TW.po | 10 +++++----- 24 files changed, 113 insertions(+), 113 deletions(-) diff --git a/src/game/joystick_standard.c b/src/game/joystick_standard.c index a1ed501b6..c62611663 100644 --- a/src/game/joystick_standard.c +++ b/src/game/joystick_standard.c @@ -899,7 +899,7 @@ const joystick_t joystick_steering_wheel_4_button = { }; const joystick_t joystick_tm_formula_t1t2 = { - .name = "Thrustmaster Formula T1/T2 with Adaptor", + .name = "Thrustmaster Formula T1/T2 with adapter", .internal_name = "thrustmaster_formula_t1t2", .init = joystick_standard_init, .close = joystick_standard_close, @@ -918,7 +918,7 @@ const joystick_t joystick_tm_formula_t1t2 = { // TODO Validate this const joystick_t joystick_tm_formula_t1t2wa = { - .name = "Thrustmaster Formula T1/T2 without Adaptor", + .name = "Thrustmaster Formula T1/T2 without adapter", .internal_name = "thrustmaster_formula_t1t2wa", .init = joystick_standard_init, .close = joystick_standard_close, diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 38cd36487..339fdc112 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Neplatné PCap zařízení" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Obecný ovladač pádla" msgid "2-axis, 1-button joystick(s)" msgstr "Joystick s 2 osami a 1 tlačítky" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 s adaptérem" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 bez adaptéru" msgid "None" msgstr "Žadné" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 7463747a7..fef11a6f5 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Ungültiges PCap-Gerät" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Generischer Paddel-Controller(s)" msgid "2-axis, 1-button joystick(s)" msgstr "2-Achsen-, 1-Tasten-Joystick(s)" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 mit Adapter" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 ohne Adapter" msgid "None" msgstr "Ohne" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 3210dc713..6fc268772 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Controlador(es) de paleta genérico(s)" msgid "2-axis, 1-button joystick(s)" msgstr "Mando(s) de 2 ejes, 1 botones" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 con adaptador" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 sin adaptador" msgid "None" msgstr "Ninguno" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index ba494bb6e..db85cedb5 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Virheellinen PCap-laite" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Yleinen melainohjain" msgid "2-axis, 1-button joystick(s)" msgstr "2-akseliset 1-painikkeiset peliohjaimet" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 adapterilla" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 ilman adapteria" msgid "None" msgstr "Ei mikään" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index f62e55978..90cfcffda 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Dispositif PCap invalide" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Contrôleur(s) à palette générique(s)" msgid "2-axis, 1-button joystick(s)" msgstr "Manette(s) avec 2 axes, 1 boutons" @@ -975,11 +975,11 @@ msgstr "Système de contrôle de vol Thrustmaster" msgid "Thrustmaster FCS + Rudder Control System" msgstr "SCV Thrustmaster + Système de commande de gouvernail" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 avec adaptateur" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 sans adaptateur" msgid "None" msgstr "Aucun" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 7f460914a..4b100612f 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Nevažeći PCap uređaj" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Generički kontroleri s lopaticama" msgid "2-axis, 1-button joystick(s)" msgstr "Palica za igru s 2 osi, 1 tipke" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 s adapterom" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 bez adaptera" msgid "None" msgstr "Bez" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index c8eb2e6e7..fcefaad62 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Dispositivo PCap non valido" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Controller generico/i a paletta" msgid "2-axis, 1-button joystick(s)" msgstr "Joystick a 2 assi, 1 pulsanti" @@ -975,11 +975,11 @@ msgstr "Sistema di controllo Thrustmaster Flight" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Sistema di controllo timone" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 con adattatore" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 senza adattatore" msgid "None" msgstr "Nessuno" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 8cc00a146..169e4e220 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "不正なPCapデバイス" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "汎用パドルコントローラー" msgid "2-axis, 1-button joystick(s)" msgstr "ジョイスティック(2軸、1ボタン)" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "アダプター付き Thrustmaster Formula T1/T2" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "アダプターなし Thrustmaster Formula T1/T2" msgid "None" msgstr "なし" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 4c15c0cb0..9747390c6 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "PCap 장치가 올바르지 않습니다" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "일반 패들 컨트롤러" msgid "2-axis, 1-button joystick(s)" msgstr "2축, 1버튼 조이스틱" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "어댑터 포함 Thrustmaster Formula T1/T2" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "어댑터 미포함 Thrustmaster Formula T1/T2" msgid "None" msgstr "없음" diff --git a/src/qt/languages/nb-NO.po b/src/qt/languages/nb-NO.po index b4c7cd57c..4cb843dd3 100644 --- a/src/qt/languages/nb-NO.po +++ b/src/qt/languages/nb-NO.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Ugyldig PCap-enhet" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Generisk padle-kontroller(e)" msgid "2-axis, 1-button joystick(s)" msgstr "2-akset, 1-knapps styrespak(er)" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Ror-kontrollsystem" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 med adapter" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 uten adapter" msgid "None" msgstr "Ingen" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 6710687a1..583331a64 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Ongeldig PCap-apparaat" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Generieke peddelcontroller(s)" msgid "2-axis, 1-button joystick(s)" msgstr "Joystick(s) met 2 assen en 1 knoppen" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control systeem" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Roer Control Systeem" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 met adapter" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 zonder adapter" msgid "None" msgstr "Geen" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 1efe0ec97..2383a1c1b 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 z Adaptorem" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 z adapterem" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 bez Adaptora" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 bez adaptera" msgid "None" msgstr "Żaden" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 88fe48d00..f7f9dee2e 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Controlador(es) genérico(s) de pá" msgid "2-axis, 1-button joystick(s)" msgstr "Joystick(s) de 2 eixos, 1 botões" @@ -975,11 +975,11 @@ msgstr "Sistema de Controle de Voo Thrustmaster" msgid "Thrustmaster FCS + Rudder Control System" msgstr "SCV Thrustmaster + Sistema de Controle de Leme" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 com adaptador" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 sem adaptador" msgid "None" msgstr "Nenhum" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index bfd52adfa..7f2e56d64 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "COntrolador(es) genérico(s) tipo pá" msgid "2-axis, 1-button joystick(s)" msgstr "Joystick(s) de 2 eixos, 1 botões" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 com adaptador" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 sem adaptador" msgid "None" msgstr "Nenhum" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index b40d4073e..9ea4a6a0e 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -975,10 +975,10 @@ msgstr "Система управления полётом Thrustmaster" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Система управления рулем" -msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" msgstr "Thrustmaster Formula T1/T2 с адаптером" -msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" msgstr "Thrustmaster Formula T1/T2 без адаптера" msgid "None" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index f43059d58..f8d53d19c 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Neplatné PCap zariadenie" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Generický ovládač pádla" msgid "2-axis, 1-button joystick(s)" msgstr "2-osový, 1-tlačidlový joystick" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 s adaptérom" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 bez adaptéru" msgid "None" msgstr "Žiadne" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 2438c1aa3..fcd12d638 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Neveljavna naprava PCap" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Generični krmilnik z lopatico" msgid "2-axis, 1-button joystick(s)" msgstr "Igralna palica z 2 osema, 1 gumboma" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 s pretvornikom" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 brez pretvornika" msgid "None" msgstr "Brez" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index 324fed452..ce701efbb 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Ogiltig PCap-enhet" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Generisk paddelkontroll(er)" msgid "2-axis, 1-button joystick(s)" msgstr "Styrspak med 2 axlar och 1 knappar" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 med adapter" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 utan adapter" msgid "None" msgstr "Ingen" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index cf15db39b..8dda1d362 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Geçersiz PCap cihazı" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Genel kürek kontrol cihazları" msgid "2-axis, 1-button joystick(s)" msgstr "2 eksenli, 1 düğmeli oyun kolları" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Adaptörlü Thrustmaster Formula T1/T2" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Adaptörsüz Thrustmaster Formula T1/T2" msgid "None" msgstr "Hiçbiri" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index b155d0da0..1c6017b51 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Невірний пристрій PCap" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Загальний контролер(и) весла" msgid "2-axis, 1-button joystick(s)" msgstr "2-осьовий, 1-кнопковий джойстик" @@ -975,11 +975,11 @@ msgstr "Система управління польотом Thrustmaster" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Система управління кермом" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 з адаптером" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 без адаптера" msgid "None" msgstr "Ні" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index acb904b04..7edddb94d 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "Thiết bị PCap không hợp quy" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "Bộ điều khiển dạng mái chèo thông dụng" msgid "2-axis, 1-button joystick(s)" msgstr "Cần điều khiển hai trục, một nút" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Hệ thống bánh lái" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 kèm bộ chuyển đổi" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 không kèm bộ chuyển đổi" msgid "None" msgstr "Không có" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index a53520c3f..58a98fc0c 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "无效 PCap 设备" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "通用桨式控制器" msgid "2-axis, 1-button joystick(s)" msgstr "2 轴, 1 键操纵杆" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "带适配器 Thrustmaster Formula T1/T2" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "不带适配器 Thrustmaster Formula T1/T2" msgid "None" msgstr "无" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 053dde129..69055e9f0 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -850,7 +850,7 @@ msgid "Invalid PCap device" msgstr "無效 PCap 裝置" msgid "Generic paddle controller(s)" -msgstr "" +msgstr "通用槳式控制器" msgid "2-axis, 1-button joystick(s)" msgstr "2 軸, 1 鍵搖桿" @@ -975,11 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 with Adaptor" +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "附轉接器 Thrustmaster Formula T1/T2" -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 without Adaptor" +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "不附轉接器 Thrustmaster Formula T1/T2" msgid "None" msgstr "無" From 2042ef9257a037c63c4b62449e6bd8b5286aad81 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 26 Oct 2025 01:59:09 +0200 Subject: [PATCH 096/113] AD1848: Should be &&, not ||. --- src/sound/snd_ad1848.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/snd_ad1848.c b/src/sound/snd_ad1848.c index c25890c50..8f120b157 100644 --- a/src/sound/snd_ad1848.c +++ b/src/sound/snd_ad1848.c @@ -521,7 +521,7 @@ readonly_x: } if (ad1848->type == AD1848_TYPE_CS4231) /* I23 is reserved and read-only on CS4231 non-A */ goto readonly_i; - if ((ad1848->type >= AD1848_TYPE_CS4232) || (ad1848->type <= AD1848_TYPE_CS4236)) /* I23 bits 7-1 are read-only on CS4231A/4232/4236 non-B, Win2k relies on this for detection */ + if ((ad1848->type >= AD1848_TYPE_CS4232) && (ad1848->type <= AD1848_TYPE_CS4236)) /* I23 bits 7-1 are read-only on CS4231A/4232/4236 non-B, Win2k relies on this for detection */ val = (val & 0x01); break; From 1063ac86fd01522b1ccc77d97455d2aeef1130dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= <13226155+dhrdlicka@users.noreply.github.com> Date: Sun, 26 Oct 2025 01:59:50 +0200 Subject: [PATCH 097/113] Update Czech translation --- src/qt/languages/cs-CZ.po | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 339fdc112..dea5fb3ec 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -850,10 +850,10 @@ msgid "Invalid PCap device" msgstr "Neplatné PCap zařízení" msgid "Generic paddle controller(s)" -msgstr "Obecný ovladač pádla" +msgstr "Obecný otočný ovladač" msgid "2-axis, 1-button joystick(s)" -msgstr "Joystick s 2 osami a 1 tlačítky" +msgstr "Joystick s 2 osami a 1 tlačítkem" msgid "2-axis, 2-button joystick(s)" msgstr "Joystick s 2 osami a 2 tlačítky" @@ -880,19 +880,19 @@ msgid "3-axis, 4-button joystick" msgstr "Joystick s 3 osami a 4 tlačítky" msgid "4-axis, 2-button joystick" -msgstr "Joystick s 4 osami a 2 tlačítky" +msgstr "Joystick se 4 osami a 2 tlačítky" msgid "4-axis, 3-button joystick" -msgstr "Joystick s 4 osami a 3 tlačítky" +msgstr "Joystick se 4 osami a 3 tlačítky" msgid "4-axis, 4-button joystick" -msgstr "Joystick s 4 osami a 4 tlačítky" +msgstr "Joystick se 4 osami a 4 tlačítky" msgid "2-button gamepad(s)" -msgstr "Ovladač se 2 tlačítky" +msgstr "Ovladač s 2 tlačítky" msgid "3-button gamepad" -msgstr "Ovladač se 3 tlačítky" +msgstr "Ovladač s 3 tlačítky" msgid "4-button gamepad" msgstr "Ovladač se 4 tlačítky" @@ -904,10 +904,10 @@ msgid "Gravis PC GamePad" msgstr "Gravis PC GamePad" msgid "2-button flight yoke" -msgstr "Letecký knipl se 2 tlačítky" +msgstr "Letecký knipl s 2 tlačítky" msgid "3-button flight yoke" -msgstr "Letecký knipl se32 tlačítky" +msgstr "Letecký knipl s 3 tlačítky" msgid "4-button flight yoke" msgstr "Letecký knipl se 4 tlačítky" @@ -919,7 +919,7 @@ msgid "3-button flight yoke with throttle" msgstr "Letecký knipl s 3 tlačítky a pákou" msgid "4-button flight yoke with throttle" -msgstr "Letecký knipl s 4 tlačítky a pákou" +msgstr "Letecký knipl se 4 tlačítky a pákou" msgid "Steering wheel (3-axis, 2-button)" msgstr "Volant (3 osy, 2 tlačítka)" @@ -975,11 +975,21 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" +<<<<<<< HEAD +msgid "Thrustmaster Formula T1/T2 with Adaptor" +msgstr "Thrustmaster Formula T1/T2 s adaptérem" +======= msgid "Thrustmaster Formula T1/T2 with adapter" msgstr "Thrustmaster Formula T1/T2 s adaptérem" +>>>>>>> 0a80ae2debdb61f381194ed5f17b5579d5510cc4 +<<<<<<< HEAD +msgid "Thrustmaster Formula T1/T2 without Adaptor" +msgstr "Thrustmaster Formula T1/T2 bez adaptéru" +======= msgid "Thrustmaster Formula T1/T2 without adapter" msgstr "Thrustmaster Formula T1/T2 bez adaptéru" +>>>>>>> 0a80ae2debdb61f381194ed5f17b5579d5510cc4 msgid "None" msgstr "Žadné" @@ -1852,10 +1862,10 @@ msgid "Adapter:" msgstr "Adaptér:" msgid "VDE Socket:" -msgstr "Zásuvka VDE:" +msgstr "VDE socket:" msgid "TAP Bridge Device:" -msgstr "" +msgstr "Zařízení TAP mostu:" msgid "86Box Unit Tester" msgstr "86Box Unit Tester" From 41f2c0ac0bbf3c3406acf93d53af1b32209726a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= <13226155+dhrdlicka@users.noreply.github.com> Date: Sun, 26 Oct 2025 02:07:16 +0200 Subject: [PATCH 098/113] Remove merge conflict in Czech translation --- src/qt/languages/cs-CZ.po | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index dea5fb3ec..7dd1e5d7a 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -975,21 +975,11 @@ msgstr "Thrustmaster Flight Control System" msgid "Thrustmaster FCS + Rudder Control System" msgstr "Thrustmaster FCS + Rudder Control System" -<<<<<<< HEAD -msgid "Thrustmaster Formula T1/T2 with Adaptor" -msgstr "Thrustmaster Formula T1/T2 s adaptérem" -======= msgid "Thrustmaster Formula T1/T2 with adapter" msgstr "Thrustmaster Formula T1/T2 s adaptérem" ->>>>>>> 0a80ae2debdb61f381194ed5f17b5579d5510cc4 -<<<<<<< HEAD -msgid "Thrustmaster Formula T1/T2 without Adaptor" -msgstr "Thrustmaster Formula T1/T2 bez adaptéru" -======= msgid "Thrustmaster Formula T1/T2 without adapter" msgstr "Thrustmaster Formula T1/T2 bez adaptéru" ->>>>>>> 0a80ae2debdb61f381194ed5f17b5579d5510cc4 msgid "None" msgstr "Žadné" From 5a42a7c6f484271d5d02e3a3e1d4987520832ce9 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 25 Oct 2025 21:29:40 -0300 Subject: [PATCH 099/113] Remove some unnecessary backslashes --- src/mem/rom.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/mem/rom.c b/src/mem/rom.c index 631328913..cee00cb0f 100644 --- a/src/mem/rom.c +++ b/src/mem/rom.c @@ -643,27 +643,27 @@ bios_load(const char *fn1, const char *fn2, uint32_t addr, int sz, int off, int int bios_load_linear_combined(const char *fn1, const char *fn2, int sz, UNUSED(int off)) { - return bios_load_linear(fn1, 0x000f0000, 131072, 128) && \ + return bios_load_linear(fn1, 0x000f0000, 131072, 128) && bios_load_aux_linear(fn2, 0x000e0000, sz - 65536, 128); } int bios_load_linear_combined2(const char *fn1, const char *fn2, const char *fn3, const char *fn4, const char *fn5, int sz, int off) { - return bios_load_linear(fn3, 0x000f0000, 262144, off) && \ - bios_load_aux_linear(fn1, 0x000d0000, 65536, off) && \ - bios_load_aux_linear(fn2, 0x000c0000, 65536, off) && \ - bios_load_aux_linear(fn4, 0x000e0000, sz - 196608, off) && \ + return bios_load_linear(fn3, 0x000f0000, 262144, off) && + bios_load_aux_linear(fn1, 0x000d0000, 65536, off) && + bios_load_aux_linear(fn2, 0x000c0000, 65536, off) && + bios_load_aux_linear(fn4, 0x000e0000, sz - 196608, off) && (!fn5 || bios_load_aux_linear(fn5, 0x000ec000, 16384, 0)); } int bios_load_linear_combined2_ex(const char *fn1, const char *fn2, const char *fn3, const char *fn4, const char *fn5, int sz, int off) { - return bios_load_linear(fn3, 0x000e0000, 262144, off) && \ - bios_load_aux_linear(fn1, 0x000c0000, 65536, off) && \ - bios_load_aux_linear(fn2, 0x000d0000, 65536, off) && \ - bios_load_aux_linear(fn4, 0x000f0000, sz - 196608, off) && \ + return bios_load_linear(fn3, 0x000e0000, 262144, off) && + bios_load_aux_linear(fn1, 0x000c0000, 65536, off) && + bios_load_aux_linear(fn2, 0x000d0000, 65536, off) && + bios_load_aux_linear(fn4, 0x000f0000, sz - 196608, off) && (!fn5 || bios_load_aux_linear(fn5, 0x000fc000, 16384, 0)); } From 3b43627f38f8a5a5d9faa5a2640820d9be8b4663 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 25 Oct 2025 21:39:21 -0300 Subject: [PATCH 100/113] Add forgotten machine migration for MS-6119 --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 4a0556de9..a0ef1c9e7 100644 --- a/src/config.c +++ b/src/config.c @@ -339,6 +339,7 @@ load_machine(void) { .old = "infinia7200", .new = "tc430hx", .new_bios = "infinia7200" }, { .old = "dellvenus", .new = "vs440fx", .new_bios = "dellvenus" }, { .old = "gw2kvenus", .new = "vs440fx", .new_bios = "gw2kvenus" }, + { .old = "lgibmx7g", .new = "ms6119", .new_bios = "lgibmx7g" }, { 0 } }; From 080632bd4a4f29da112f477d55e4424fe2c40e42 Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Sat, 25 Oct 2025 22:20:25 -0500 Subject: [PATCH 101/113] Initial implementation of the Crystal CS4232 audio controller --- src/include/86box/sound.h | 1 + src/sound/snd_cs423x.c | 58 +++++++++++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/include/86box/sound.h b/src/include/86box/sound.h index 2280824e4..c2b41776f 100644 --- a/src/include/86box/sound.h +++ b/src/include/86box/sound.h @@ -177,6 +177,7 @@ extern const device_t sb_awe64_ide_device; extern const device_t sb_awe64_gold_device; /* Crystal CS423x */ +extern const device_t cs4232_onboard_device; extern const device_t cs4235_device; extern const device_t cs4235_onboard_device; extern const device_t cs4236_onboard_device; diff --git a/src/sound/snd_cs423x.c b/src/sound/snd_cs423x.c index 78b628b3b..10eb27cf2 100644 --- a/src/sound/snd_cs423x.c +++ b/src/sound/snd_cs423x.c @@ -88,6 +88,20 @@ static const uint8_t slam_init_key[32] = { 0x96, 0x35, 0x9A, 0xCD, 0xE6, 0xF3, 0 0x5E, 0xAF, 0x57, 0x2B, 0x15, 0x8A, 0xC5, 0xE2, 0xF1, 0xF8, 0x7C, 0x3E, 0x9F, 0x4F, 0x27, 0x13, 0x09, 0x84, 0x42, 0xA1, 0xD0, 0x68, 0x34, 0x1A }; + +static const uint8_t cs4232_default[] = { + // clang-format off + /* Chip configuration */ + 0x00, /* external decode length */ + 0x48, /* reserved */ + 0x75, 0xb9, 0xfc, /* IRQ routing */ + 0x10, 0x03, /* DMA routing */ + + /* Default PnP data */ + 0x0e, 0x63, 0x42, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00 /* hinted by documentation to be just the header */ + // clang-format on +}; + static const uint8_t cs4236_default[] = { // clang-format off /* Chip configuration */ @@ -388,9 +402,17 @@ cs423x_write(uint16_t addr, uint8_t val, void *priv) case 6: /* RAM Access End */ /* TriGem Delhi-III BIOS writes undocumented value 0x40 instead of 0x00. */ - if ((val == 0x00) || (val == 0x40)) { + /* Intel Atlantis, Holly, Monaco, Morrison and Thor BIOSes use several undocumented values */ + /* 0x25, 0x60, 0x69, 0x86, 0xE2, 0xFE and 0xFF were observed on these BIOSes */ + /* CS4232 likely accepts any written value to end RAM writes */ + if ((val == 0x00) || (val == 0x40) || (dev->type == CRYSTAL_CS4232)) { cs423x_log("CS423x: RAM end\n"); dev->ram_dl = CRYSTAL_RAM_CMD; + /* CS4232 resource data at 0x2090/2091 is written backwards */ + if (dev->type == CRYSTAL_CS4232) { + dev->ram_data[0x2090] = 0x00; + dev->ram_data[0x2091] = 0x48; + } /* Update PnP state and resource data. */ dev->pnp_size = (dev->type >= CRYSTAL_CS4236) ? 384 : 256; /* we don't know the length */ @@ -808,6 +830,10 @@ static void cs423x_load_defaults(cs423x_t *dev, uint8_t *dest) { switch (dev->type) { + case CRYSTAL_CS4232: + memcpy(dest, cs4232_default, sizeof(cs4232_default)); + dev->pnp_size = 9; /* header-only PnP ROM size */ + break; case CRYSTAL_CS4236: case CRYSTAL_CS4236B: case CRYSTAL_CS4237B: @@ -841,7 +867,11 @@ cs423x_reset(void *priv) memset(dev->ram_data, 0, sizeof(dev->ram_data)); /* Load default configuration data to RAM. */ - cs423x_load_defaults(dev, &dev->ram_data[0x4000]); + /* CS4232 uses 0x2090 as the initial RAM location instead of 0x4000 */ + if (dev->type == CRYSTAL_CS4232) + cs423x_load_defaults(dev, &dev->ram_data[0x2090]); + else + cs423x_load_defaults(dev, &dev->ram_data[0x4000]); if (dev->eeprom) { /* Load EEPROM data to RAM if the magic bytes are present. */ @@ -890,6 +920,7 @@ cs423x_init(const device_t *info) dev->type = info->local & 0xff; cs423x_log("CS423x: init(%02X)\n", dev->type); switch (dev->type) { + case CRYSTAL_CS4232: case CRYSTAL_CS4236: case CRYSTAL_CS4236B: case CRYSTAL_CS4237B: @@ -897,13 +928,16 @@ cs423x_init(const device_t *info) case CRYSTAL_CS4235: case CRYSTAL_CS4239: /* Different WSS codec families. */ - dev->ad1848_type = (dev->type >= CRYSTAL_CS4235) ? AD1848_TYPE_CS4235 : ((dev->type >= CRYSTAL_CS4236B) ? AD1848_TYPE_CS4236B : AD1848_TYPE_CS4236); + dev->ad1848_type = (dev->type >= CRYSTAL_CS4235) ? AD1848_TYPE_CS4235 : ((dev->type >= CRYSTAL_CS4236B) ? AD1848_TYPE_CS4236B : (dev->type >= CRYSTAL_CS4236) ? AD1848_TYPE_CS4236 : AD1848_TYPE_CS4232); /* Different Chip Version and ID values (N/A on CS4236), which shouldn't be reset by ad1848_init. */ dev->ad1848.xregs[25] = dev->type; - /* Same EEPROM structure. */ - dev->pnp_offset = 0x4013; + /* Same EEPROM structure on CS4236+. CS4232 is different. */ + if (dev->type == CRYSTAL_CS4232) + dev->pnp_offset = 0x2097; + else + dev->pnp_offset = 0x4013; if (!(info->local & CRYSTAL_NOEEPROM)) { /* Start a new EEPROM with the default configuration data. */ @@ -1056,6 +1090,20 @@ cs423x_speed_changed(void *priv) ad1848_speed_changed(&dev->ad1848); } +const device_t cs4232_onboard_device = { + .name = "Crystal CS4232 (On-Board)", + .internal_name = "cs4232_onboard", + .flags = DEVICE_ISA16, + .local = CRYSTAL_CS4232 | CRYSTAL_NOEEPROM, + .init = cs423x_init, + .close = cs423x_close, + .reset = cs423x_reset, + .available = cs423x_available, + .speed_changed = cs423x_speed_changed, + .force_redraw = NULL, + .config = NULL +}; + const device_t cs4235_device = { .name = "Crystal CS4235", .internal_name = "cs4235", From 7b40cfb563de413464ea8d8086f77e4d8123617a Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Sat, 25 Oct 2025 23:01:39 -0500 Subject: [PATCH 102/113] Give the Intel Atlantis, Monaco and Thor boards their onboard CS4232 audio --- src/machine/m_at_socket7_3v.c | 31 ++++++++++--------------------- src/machine/machine_table.c | 12 ++++++------ 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 07faa9f9f..04505d0fd 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -435,6 +435,9 @@ machine_at_thor_gpio_init(void) else if (cpu_busspeed > 60000000) gpio |= 0xffff1000; + if (sound_card_current[0] == SOUND_INTERNAL) + gpio |= 0xffff0400; + machine_set_gpio_default(gpio); } @@ -476,6 +479,9 @@ machine_at_thor_init(const machine_t *model) if (has_video && (gfxcard[0] == VID_INTERNAL)) device_add(machine_get_vid_device(machine)); + if (has_video && (sound_card_current[0] == SOUND_INTERNAL)) + machine_snd = device_add(machine_get_snd_device(machine)); + device_add(&i430fx_device); device_add(&piix_device); device_add_params(&pc87306_device, (void *) PCX730X_AMI); @@ -576,27 +582,6 @@ machine_at_monaco_gpio_init(void) { uint32_t gpio = 0xffffe0cf; - /* Return to this after CS4232 PnP is working. */ - /* Register 0x0078 (Undocumented): */ - /* Bit 5,4: Vibra 16S base address: 0 = 220h, 1 = 260h, 2 = 240h, 3 = 280h. */ - /*device_context(machine_get_snd_device(machine)); - addr = device_get_config_hex16("base"); - switch (addr) { - case 0x0220: - gpio |= 0xffff00cf; - break; - case 0x0240: - gpio |= 0xffff00ef; - break; - case 0x0260: - gpio |= 0xffff00df; - break; - case 0x0280: - gpio |= 0xffff00ff; - break; - } - device_context_restore();*/ - /* Register 0x0079: */ /* Bit 7: 0 = Clear password, 1 = Keep password. */ /* Bit 6: 0 = NVRAM cleared by jumper, 1 = NVRAM normal. */ @@ -682,6 +667,9 @@ machine_at_endeavor_init(const machine_t *model) return ret; } +/* The Monaco and Atlantis share the same GPIO config */ +#define machine_at_monaco_gpio_init machine_at_atlantis_gpio_init + int machine_at_atlantis_init(const machine_t *model) { @@ -695,6 +683,7 @@ machine_at_atlantis_init(const machine_t *model) return ret; machine_at_common_init_ex(model, 2); + machine_at_atlantis_gpio_init(); pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 7628d29fa..b65dd5d51 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -13488,7 +13488,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, /* Machine has onboard sound: Crystal CS4232-KQ */ + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_SOUND | MACHINE_GAMEPORT | MACHINE_APM, /* Machine has onboard sound: Crystal CS4232-KQ */ .ram = { .min = 8192, .max = 131072, @@ -13507,7 +13507,7 @@ const machine_t machines[] = { .fdc_device = NULL, .sio_device = NULL, .vid_device = &mach64ct_device_onboard, - .snd_device = NULL, + .snd_device = &cs4232_onboard_device, .net_device = NULL }, /* According to tests from real hardware: This has AMI MegaKey KBC firmware on the @@ -13534,7 +13534,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_GAMEPORT, /* Machine has optional onboard sound: Crystal CS4232-KQ */ + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM | MACHINE_SOUND | MACHINE_GAMEPORT, /* Machine has optional onboard sound: Crystal CS4232-KQ */ .ram = { .min = 8192, .max = 131072, @@ -13553,7 +13553,7 @@ const machine_t machines[] = { .fdc_device = NULL, .sio_device = NULL, .vid_device = &s3_phoenix_trio64vplus_onboard_pci_device, - .snd_device = NULL, + .snd_device = &cs4232_onboard_device, .net_device = NULL }, /* According to tests from real hardware: This has AMI MegaKey KBC firmware on the @@ -13626,7 +13626,7 @@ const machine_t machines[] = { .max_multi = 3.0 }, .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_APM, /* Machine has onboard sound: Crystal CS4232-KQ */ + .flags = MACHINE_IDE_DUAL | MACHINE_VIDEO | MACHINE_SOUND | MACHINE_GAMEPORT | MACHINE_APM, /* Machine has onboard sound: Crystal CS4232-KQ */ .ram = { .min = 8192, .max = 131072, @@ -13645,7 +13645,7 @@ const machine_t machines[] = { .fdc_device = NULL, .sio_device = NULL, .vid_device = &mach64ct_device_onboard, - .snd_device = NULL, + .snd_device = &cs4232_onboard_device, .net_device = NULL }, /* This has an AMIKey-2, which is type 'H'. */ From 69b05d5bfc88fefda83f5cb4c0cfcf22f7307b22 Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Sat, 25 Oct 2025 23:05:28 -0500 Subject: [PATCH 103/113] Correct flipped names in GPIO define --- src/machine/m_at_socket7_3v.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 04505d0fd..7336c36d0 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -668,7 +668,7 @@ machine_at_endeavor_init(const machine_t *model) } /* The Monaco and Atlantis share the same GPIO config */ -#define machine_at_monaco_gpio_init machine_at_atlantis_gpio_init +#define machine_at_atlantis_gpio_init machine_at_monaco_gpio_init int machine_at_atlantis_init(const machine_t *model) From ae1163993dbabc5affe74280160df161380cb5f1 Mon Sep 17 00:00:00 2001 From: Valerio Vitali <57093958+Valefungo@users.noreply.github.com> Date: Sun, 26 Oct 2025 12:14:29 +0100 Subject: [PATCH 104/113] Update README-DEDICATED-PC.txt removed a reference to my fork --- README-DEDICATED-PC.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README-DEDICATED-PC.txt b/README-DEDICATED-PC.txt index ba3dfa50c..400880110 100644 --- a/README-DEDICATED-PC.txt +++ b/README-DEDICATED-PC.txt @@ -9,9 +9,8 @@ These are the steps to install a machine fully dedicated to 86Box and tuned to m apt install git build-essential cmake extra-cmake-modules pkg-config ninja-build libfreetype-dev libsdl2-dev libpng-dev libopenal-dev librtmidi-dev libfluidsynth-dev libsndfile1-dev libserialport-dev libevdev-dev libxkbcommon-dev libxkbcommon-x11-dev libslirp-dev 4) setup git and clone - git@github.com:Valefungo/86Box.git + git@github.com:86Box/86Box.git git@github.com:86Box/roms.git - git checkout unix_ods 5) build (128 => super speed, too much for a 2GB machine) cd 86Box From 1a4588292f6bcd656114afbdcf3aef905d82b515 Mon Sep 17 00:00:00 2001 From: Valerio Date: Sun, 26 Oct 2025 17:19:42 +0100 Subject: [PATCH 105/113] gcc strict code style, removed an annoying unuseful printf --- src/include/86box/unix_osd.h | 6 +++--- src/unix/unix.c | 2 +- src/unix/unix_osd.c | 19 ++++++------------- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/include/86box/unix_osd.h b/src/include/86box/unix_osd.h index c6582b322..a71b0ec74 100644 --- a/src/include/86box/unix_osd.h +++ b/src/include/86box/unix_osd.h @@ -4,8 +4,8 @@ #include // state management -extern void osd_init(); -extern void osd_deinit(); +extern void osd_init(void); +extern void osd_deinit(void); extern int osd_open(SDL_Event event); extern int osd_close(SDL_Event event); @@ -13,7 +13,7 @@ extern int osd_close(SDL_Event event); extern int osd_handle(SDL_Event event); // draw the osd interface, if it's open -extern void osd_present(); +extern void osd_present(void); // future ui extern void osd_ui_sb_update_icon_state(int tag, int state); diff --git a/src/unix/unix.c b/src/unix/unix.c index 4502c1e5b..ffee8df0f 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1516,7 +1516,7 @@ main(int argc, char **argv) } default: { - printf("Unhandled SDL event: %d\n", event.type); + // printf("Unhandled SDL event: %d\n", event.type); break; } } diff --git a/src/unix/unix_osd.c b/src/unix/unix_osd.c index 8122e19eb..61597242f 100644 --- a/src/unix/unix_osd.c +++ b/src/unix/unix_osd.c @@ -78,11 +78,8 @@ static const char *menu_items[] = { }; #define MENU_ITEMS (sizeof(menu_items) / sizeof(menu_items[0])) -static char selected_file[256] = ""; // memoria della selezione - // chars per cols and rows static int font_cols = 16; -static int font_rows = 16; static int selected = 0; static int file_selected = 0; @@ -96,7 +93,7 @@ static int file_count = 0; static int max_visible = 0; -int reset_iso_files() +void reset_iso_files(void) { file_selected = 0; scroll_offset = 0; @@ -181,11 +178,8 @@ void draw_menu(SDL_Renderer *renderer, int selected) draw_text(renderer, "MAIN MENU", x0 + 20, y0 + 5, (SDL_Color){255,255,255,255}); - if (sdl_win_title != NULL) - { - int length = wcstombs(sdl_win_title_mb, sdl_win_title, 256); - draw_text(renderer, sdl_win_title_mb, x0 + 120, y0 + 5, (SDL_Color){255,255,255,255}); - } + wcstombs(sdl_win_title_mb, sdl_win_title, 256); + draw_text(renderer, sdl_win_title_mb, x0 + 120, y0 + 5, (SDL_Color){255,255,255,255}); for (int i = 0; i < MENU_ITEMS; i++) { @@ -211,7 +205,6 @@ void draw_menu(SDL_Renderer *renderer, int selected) #endif } -// ------------------- Disegna selezione file ------------------- void draw_file_selector(SDL_Renderer *renderer, char *title, char files[][1024], int file_count, @@ -254,7 +247,7 @@ void draw_file_selector(SDL_Renderer *renderer, #endif } -void osd_init() +void osd_init(void) { // debug: fprintf(stderr, "OSD INIT\n"); @@ -284,7 +277,7 @@ void osd_init() } } -void osd_deinit() +void osd_deinit(void) { // nothing to do // debug: fprintf(stderr, "OSD DEINIT\n"); @@ -329,7 +322,7 @@ static void osd_cmd_run(char *c) free(l); } -void osd_present() +void osd_present(void) { // shortcut if (!osd_is_open) From f4f050d14e09eb2e5318dbbe02b4e5f89fb81ca8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 26 Oct 2025 17:42:10 +0100 Subject: [PATCH 106/113] Bump the version number to 6.0... again. --- CMakeLists.txt | 2 +- debian/changelog | 4 ++-- src/unix/assets/86Box.spec | 4 ++-- src/unix/assets/net.86box.86Box.metainfo.xml | 2 +- vcpkg.json | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 29fedd6ad..2f6c18af0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,7 @@ if(MUNT_EXTERNAL) endif() project(86Box - VERSION 5.2 + VERSION 6.0 DESCRIPTION "Emulator of x86-based systems" HOMEPAGE_URL "https://86box.net" LANGUAGES C CXX) diff --git a/debian/changelog b/debian/changelog index cfb4bd9d0..d2606a616 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -86box (5.2) UNRELEASED; urgency=medium +86box (6.0) UNRELEASED; urgency=medium * Bump release. - -- Jasmine Iwanek Thu, 18 Sep 2025 04:25:57 +0200 + -- Jasmine Iwanek Sun, 26 Oct 2025 17:41:47 +0100 diff --git a/src/unix/assets/86Box.spec b/src/unix/assets/86Box.spec index 27805a9e4..e71497698 100644 --- a/src/unix/assets/86Box.spec +++ b/src/unix/assets/86Box.spec @@ -15,7 +15,7 @@ %global romver 4.1 Name: 86Box -Version: 5.2 +Version: 6.0 Release: 1%{?dist} Summary: Classic PC emulator License: GPLv2+ @@ -121,5 +121,5 @@ popd %{_datadir}/%{name}/roms %changelog -* Sat Aug 31 Jasmine Iwanek 5.2-1 +* Sat Aug 31 Jasmine Iwanek 6.0-1 - Bump release diff --git a/src/unix/assets/net.86box.86Box.metainfo.xml b/src/unix/assets/net.86box.86Box.metainfo.xml index fd633d426..1e929412c 100644 --- a/src/unix/assets/net.86box.86Box.metainfo.xml +++ b/src/unix/assets/net.86box.86Box.metainfo.xml @@ -11,7 +11,7 @@ net.86box.86Box.desktop - + diff --git a/vcpkg.json b/vcpkg.json index 73f6d08f8..6a4f6376c 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,6 +1,6 @@ { "name": "86box", - "version-string": "5.2", + "version-string": "6.0", "homepage": "https://86box.net/", "documentation": "https://86box.readthedocs.io/", "license": "GPL-2.0-or-later", From 379a3eaec7ab9deba2fa0615f5be809d1ee19305 Mon Sep 17 00:00:00 2001 From: Valerio Date: Sun, 26 Oct 2025 17:42:31 +0100 Subject: [PATCH 107/113] more useful readme --- README-UNIX-MODE-WITH-OSD.txt | 78 +++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 README-UNIX-MODE-WITH-OSD.txt diff --git a/README-UNIX-MODE-WITH-OSD.txt b/README-UNIX-MODE-WITH-OSD.txt new file mode 100644 index 000000000..22e45a920 --- /dev/null +++ b/README-UNIX-MODE-WITH-OSD.txt @@ -0,0 +1,78 @@ +UNIX MODE WITH OSD + +86Box supports running on the linux framebuffer without QT and without X, making the pc appear as a nearly native old machine. + +running it that way is already supported but when doing it, 86box loses all menu and all abilities to mount floppies and CDs, it also becomes the owner of the entire pc with no way of quitting it or changing virtual console. + +to overcome this, an on screen display menu is available that allows doing everything the textual console (src/unix/unix.c) does; +mount/unmount all supported media like floppy and cd +hard reset the machine +quit 86box +seeing the current performance % + +key bindings: +Control-F12 opens the osd + +while is open: +arrows up, down moves the cursor +enter does the action, at mount options it enters a list of appropriate files (*.img, *.iso) +ESC goes back to main or closes the OSD + +current limitations: + OSD can mount images to first floppy and first cd, secondary devices are not supported + it does not show if an image is mounted or not + the option "version" does actully print it, but it can't be seen beacuse its printed under 86box display + extremely long filenames can overflow the blue window + the title does actually overflow the window width :) + +These are the steps to install a machine fully dedicated to 86Box and tuned to make it appear almost native. +This works almost the same for on a Raspberry Pi + + +1) install a vanilla Debian Trixie with netinst and without any graphical environment, or a "server" distro for RPI + depending on the machine speed, this will make boot time extremely short + +2) apt update if necessary + +3) install git and almost all required packages + apt install git build-essential cmake extra-cmake-modules pkg-config ninja-build libfreetype-dev libsdl2-dev libpng-dev libopenal-dev librtmidi-dev libfluidsynth-dev libsndfile1-dev libserialport-dev libevdev-dev libxkbcommon-dev libxkbcommon-x11-dev libslirp-dev + +4) setup git and clone + git@github.com:86Box/86Box.git + git@github.com:86Box/roms.git + +5) build (128 => super speed, too much for a 2GB machine) + cd 86Box + mkdir build + cd build + cmake .. --preset regular -D QT=OFF -D PREFER_STATIC=ON + cmake --build regular -j 128 + cd ../../ + ln -s 86Box/build/regular/src/86Box 86Box.exe + +6) boot + as root so it can take complete ownership of the linux framebuffer + +7) notes: +- 86Box will complain to be unable to find readline, this is fine, we don't need the command line at all +- ALSOFT will complain it can't connect to PipeWire, no problem, sounds will come from standard ALSA + +8) additional steps + add a new udev rule to automount any USB key to a known location so files in it can be listed in the OSD floppy/cd mount options + + create /etc/udev/rules.d/99-automount.rules + + with: + ACTION=="add", ENV{ID_BUS}=="usb", ENV{ID_TYPE}=="disk", ENV{ID_FS_TYPE}=="exfat", RUN+="/usr/bin/systemd-mount --no-block --automount=yes --collect /dev/%k '/mnt'" + + replicate this line for each filesystem you expect the usb key to be formatted, in this example "exfat" + this is going to conflict if multiple keys are inserted, don't do it + +final step + configure some 86box vm using another pc with the GUI + copy the VM definitions to this new pc and manually launch 86box from the textual command line + optionally craft a boot menu to be shown in place of the login prompt or setup 86box as a debiasn service, it will start at boot + just make sure the pc will be accessible via ssh or some other way, autobooting 86box can make difficult terminating it + + + From e3908e4d12d9a583c99bab9c2977ffdc000b3706 Mon Sep 17 00:00:00 2001 From: Valerio Date: Sun, 26 Oct 2025 17:59:57 +0100 Subject: [PATCH 108/113] changed hotkey to rightcontrol + F11, aligned README --- README-UNIX-MODE-WITH-OSD.txt | 2 +- src/unix/unix.c | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/README-UNIX-MODE-WITH-OSD.txt b/README-UNIX-MODE-WITH-OSD.txt index 22e45a920..2fff90103 100644 --- a/README-UNIX-MODE-WITH-OSD.txt +++ b/README-UNIX-MODE-WITH-OSD.txt @@ -11,7 +11,7 @@ quit 86box seeing the current performance % key bindings: -Control-F12 opens the osd +Right Control + F11 opens the osd while is open: arrows up, down moves the cursor diff --git a/src/unix/unix.c b/src/unix/unix.c index ffee8df0f..055b4075a 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -75,6 +75,10 @@ SDL_threadID eventthread; static int exit_event = 0; static int fullscreen_pending = 0; +// Two keys to be pressed together to open the OSD, variables to make them configurable in future +static uint16_t osd_open_first_key = SDL_SCANCODE_RCTRL; +static uint16_t osd_open_second_key = SDL_SCANCODE_F11; + static const uint16_t sdl_to_xt[0x200] = { [SDL_SCANCODE_ESCAPE] = 0x01, [SDL_SCANCODE_1] = 0x02, @@ -1305,7 +1309,7 @@ main(int argc, char **argv) while (!is_quit) { static int mouse_inside = 0; - static int r_alt_pressed = 0; + static int osd_first_key_pressed = 0; static int flag_osd_open = 0; while (SDL_PollEvent(&event)) @@ -1470,27 +1474,27 @@ main(int argc, char **argv) { uint16_t xtkey = 0; - if (event.key.keysym.scancode == SDL_SCANCODE_RALT) + if (event.key.keysym.scancode == osd_open_first_key) { if (event.type == SDL_KEYDOWN) - r_alt_pressed = 1; + osd_first_key_pressed = 1; else - r_alt_pressed = 0; + osd_first_key_pressed = 0; } - else if (r_alt_pressed && event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_G) + else if (osd_first_key_pressed && event.type == SDL_KEYDOWN && event.key.keysym.scancode == osd_open_second_key) { // open OSD! flag_osd_open = osd_open(event); // we can assume alt-gr has been released, tell this also to the virtual machine - r_alt_pressed = 0; - keyboard_input(0, sdl_to_xt[SDL_SCANCODE_RALT]); + osd_first_key_pressed = 0; + keyboard_input(0, sdl_to_xt[osd_open_first_key]); break; } else { - // invalidate r_alt_pressed is something happens between its keydown and keydown for G - r_alt_pressed = 0; + // invalidate osd_first_key_pressed is something happens between its keydown and keydown for G + osd_first_key_pressed = 0; } switch (event.key.keysym.scancode) { From cf6149c1c7c8fdddd2a12d8d6687837beb2e2d68 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 26 Oct 2025 13:59:33 -0300 Subject: [PATCH 109/113] bumpversion: Fix romset version patching and rework patching function to allow for multiple files [skip ci] --- bumpversion.sh | 46 +++++++++++++++++++++++--------------- src/unix/assets/86Box.spec | 2 +- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/bumpversion.sh b/bumpversion.sh index 6e2536cbe..76ef07554 100644 --- a/bumpversion.sh +++ b/bumpversion.sh @@ -43,23 +43,33 @@ pretty_date() { # Patch files. patch_file() { - # Stop if the file doesn't exist. - [ ! -e "$1" ] && return + # Parse arguments. + desc="$1" + shift + pattern="$1" + shift - # Patch file. - if sed -i -r -e "$3" "$1" - then - echo "[-] Patched $2 on $1" - else - echo "[!] Patching $2 on $1 failed" - fi + # Patch the specified files. + for file in "$@" + do + # Skip file if it doesn't exist. + [ ! -e "$file" ] && continue + + # Patch file. + if sed -i -r -e "$pattern" "$file" + then + echo "[-] Patched $desc in $file" + else + echo "[!] Patching $desc in $file failed" + fi + done } -patch_file CMakeLists.txt VERSION 's/^(\s*VERSION ).+/\1'"$newversion"'/' -patch_file vcpkg.json version-string 's/(^\s*"version-string"\s*:\s*")[^"]+/\1'"$newversion"'/' -patch_file src/unix/assets/*.spec Version 's/(Version:\s+)[0-9].+/\1'"$newversion"'/' -patch_file src/unix/assets/*.spec '%global romver' 's/(^%global\ romver\s+)[0-9]{8}/\1'"$romversion"'/' -patch_file src/unix/assets/*.spec 'changelog version' 's/(^[*]\s.*>\s+)[0-9].+/\1'"$newversion"-1'/' -patch_file src/unix/assets/*.spec 'changelog date' 's/(^[*]\s)[a-zA-Z]{3}\s[a-zA-Z]{3}\s[0-9]{2}\s[0-9]{4}/\1'"$(pretty_date)"'/' -patch_file src/unix/assets/*.metainfo.xml release 's/( .+/> '"$(date -R)"'/' -patch_file debian/changelog 'changelog version' 's/86box \(.+\)/86box \('"$newversion"'\)/' +patch_file VERSION 's/^(\s*VERSION ).+/\1'"$newversion"'/' CMakeLists.txt +patch_file version-string 's/(^\s*"version-string"\s*:\s*")[^"]+/\1'"$newversion"'/' vcpkg.json +patch_file Version 's/(Version:\s+)[0-9].+/\1'"$newversion"'/' src/unix/assets/*.spec +patch_file '%global romver' 's/(^%global\ romver\s+)[^\s]+/\1'"$romversion"'/' src/unix/assets/*.spec +patch_file 'changelog version' 's/(^[*]\s.*>\s+)[0-9].+/\1'"$newversion"-1'/' src/unix/assets/*.spec +patch_file 'changelog date' 's/(^[*]\s)[a-zA-Z]{3}\s[a-zA-Z]{3}\s[0-9]{2}\s[0-9]{4}/\1'"$(pretty_date)"'/' src/unix/assets/*.spec +patch_file release 's/( .+/> '"$(date -R)"'/' debian/changelog +patch_file 'changelog version' 's/86box \(.+\)/86box \('"$newversion"'\)/' debian/changelog diff --git a/src/unix/assets/86Box.spec b/src/unix/assets/86Box.spec index e71497698..35916ffff 100644 --- a/src/unix/assets/86Box.spec +++ b/src/unix/assets/86Box.spec @@ -12,7 +12,7 @@ # After a successful build, you can install the RPMs as follows: # sudo dnf install RPMS/$(uname -m)/86Box-3* RPMS/noarch/86Box-roms* -%global romver 4.1 +%global romver 5.2 Name: 86Box Version: 6.0 From 8d12c46a3a2ea261502068cb071d0b68a932d09d Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Sun, 26 Oct 2025 15:49:21 -0500 Subject: [PATCH 110/113] Add a generic discrete CS4232 sound card --- src/include/86box/sound.h | 1 + src/sound/snd_cs423x.c | 62 ++++++++++++++++++++++++++++++++------- src/sound/sound.c | 3 +- 3 files changed, 55 insertions(+), 11 deletions(-) diff --git a/src/include/86box/sound.h b/src/include/86box/sound.h index c2b41776f..ff096e0be 100644 --- a/src/include/86box/sound.h +++ b/src/include/86box/sound.h @@ -177,6 +177,7 @@ extern const device_t sb_awe64_ide_device; extern const device_t sb_awe64_gold_device; /* Crystal CS423x */ +extern const device_t cs4232_device; extern const device_t cs4232_onboard_device; extern const device_t cs4235_device; extern const device_t cs4235_onboard_device; diff --git a/src/sound/snd_cs423x.c b/src/sound/snd_cs423x.c index 10eb27cf2..4fd630e07 100644 --- a/src/sound/snd_cs423x.c +++ b/src/sound/snd_cs423x.c @@ -40,6 +40,7 @@ #include <86box/plat_fallthrough.h> #include <86box/plat_unused.h> +#define PNP_ROM_CS4232 "roms/sound/crystal/CS4232.BIN" #define PNP_ROM_CS4236B "roms/sound/crystal/PNPISA01.BIN" #define CRYSTAL_NOEEPROM 0x100 @@ -880,7 +881,10 @@ cs423x_reset(void *priv) dev->pnp_size = (dev->eeprom_data[2] << 8) | dev->eeprom_data[3]; if (dev->pnp_size > 384) dev->pnp_size = 384; - memcpy(&dev->ram_data[0x4000], &dev->eeprom_data[4], sizeof(dev->eeprom_data) - 4); + if (dev->type == CRYSTAL_CS4232) + memcpy(&dev->ram_data[0x2090], &dev->eeprom_data[4], sizeof(dev->eeprom_data) - 4); + else + memcpy(&dev->ram_data[0x4000], &dev->eeprom_data[4], sizeof(dev->eeprom_data) - 4); } else { cs423x_log("CS423x: EEPROM data invalid, ignoring\n"); } @@ -944,16 +948,30 @@ cs423x_init(const device_t *info) cs423x_load_defaults(dev, &dev->eeprom_data[4]); /* Load PnP resource data ROM. */ - FILE *fp = rom_fopen(PNP_ROM_CS4236B, "rb"); - if (fp) { - uint16_t eeprom_pnp_offset = (dev->pnp_offset & 0x1ff) + 4; - /* This is wrong. The header field only indicates PnP resource data length, and real chips use - it to locate the firmware patch area, but we don't need any of that, so we can get away - with pretending the whole ROM is PnP data, at least until we can get full EEPROM dumps. */ - dev->pnp_size = fread(&dev->eeprom_data[eeprom_pnp_offset], 1, sizeof(dev->eeprom_data) - eeprom_pnp_offset, fp); - fclose(fp); + if (dev->type == CRYSTAL_CS4232) { + FILE *fp = rom_fopen(PNP_ROM_CS4232, "rb"); + if (fp) { + uint16_t eeprom_pnp_offset = (dev->pnp_offset & 0x0f) + 4; + /* This is wrong. The header field only indicates PnP resource data length, and real chips use + it to locate the firmware patch area, but we don't need any of that, so we can get away + with pretending the whole ROM is PnP data, at least until we can get full EEPROM dumps. */ + dev->pnp_size = fread(&dev->eeprom_data[eeprom_pnp_offset], 1, sizeof(dev->eeprom_data) - eeprom_pnp_offset, fp); + fclose(fp); + } else { + dev->pnp_size = 0; + } } else { - dev->pnp_size = 0; + FILE *fp = rom_fopen(PNP_ROM_CS4236B, "rb"); + if (fp) { + uint16_t eeprom_pnp_offset = (dev->pnp_offset & 0x1ff) + 4; + /* This is wrong. The header field only indicates PnP resource data length, and real chips use + it to locate the firmware patch area, but we don't need any of that, so we can get away + with pretending the whole ROM is PnP data, at least until we can get full EEPROM dumps. */ + dev->pnp_size = fread(&dev->eeprom_data[eeprom_pnp_offset], 1, sizeof(dev->eeprom_data) - eeprom_pnp_offset, fp); + fclose(fp); + } else { + dev->pnp_size = 0; + } } /* Populate EEPROM header if the PnP ROM was loaded. */ @@ -966,6 +984,10 @@ cs423x_init(const device_t *info) /* Patch PnP ROM and set EEPROM file name. */ switch (dev->type) { + case CRYSTAL_CS4232: + dev->nvr_path = "cs4232.nvr"; + break; + case CRYSTAL_CS4236: if (dev->pnp_size) { dev->eeprom_data[26] = 0x36; @@ -1076,6 +1098,12 @@ cs423x_close(void *priv) free(dev); } +static int +cs4232_available(void) +{ + return rom_present(PNP_ROM_CS4232); +} + static int cs423x_available(void) { @@ -1090,6 +1118,20 @@ cs423x_speed_changed(void *priv) ad1848_speed_changed(&dev->ad1848); } +const device_t cs4232_device = { + .name = "Crystal CS4232", + .internal_name = "cs4232", + .flags = DEVICE_ISA16, + .local = CRYSTAL_CS4232, + .init = cs423x_init, + .close = cs423x_close, + .reset = cs423x_reset, + .available = cs4232_available, + .speed_changed = cs423x_speed_changed, + .force_redraw = NULL, + .config = NULL +}; + const device_t cs4232_onboard_device = { .name = "Crystal CS4232 (On-Board)", .internal_name = "cs4232_onboard", diff --git a/src/sound/sound.c b/src/sound/sound.c index 9373f067e..7b4141bd8 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -140,6 +140,7 @@ static const SOUND_CARD sound_cards[] = { { &azt2316a_device }, { &azt1605_device }, { &sb_goldfinch_device }, + { &cs4232_device }, { &cs4235_device }, { &cs4236b_device }, { &gus_device }, @@ -849,4 +850,4 @@ sound_fdd_thread_end(void) sound_fdd_start_event = NULL; } } -} \ No newline at end of file +} From 2a4ed0370f9d329f985b413e0fc2f096438713ee Mon Sep 17 00:00:00 2001 From: Valerio Date: Mon, 27 Oct 2025 09:36:19 +0100 Subject: [PATCH 111/113] removed old readme --- README-DEDICATED-PC.txt | 41 ----------------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 README-DEDICATED-PC.txt diff --git a/README-DEDICATED-PC.txt b/README-DEDICATED-PC.txt deleted file mode 100644 index 400880110..000000000 --- a/README-DEDICATED-PC.txt +++ /dev/null @@ -1,41 +0,0 @@ -These are the steps to install a machine fully dedicated to 86Box and tuned to make it appear almost native. - -1) install a vanilla Debian Trixie with netinst and without any graphical environment - depending on the machine speed, this will make boot time extremely short - -2) apt update if necessary - -3) install git and almost all required packages - apt install git build-essential cmake extra-cmake-modules pkg-config ninja-build libfreetype-dev libsdl2-dev libpng-dev libopenal-dev librtmidi-dev libfluidsynth-dev libsndfile1-dev libserialport-dev libevdev-dev libxkbcommon-dev libxkbcommon-x11-dev libslirp-dev - -4) setup git and clone - git@github.com:86Box/86Box.git - git@github.com:86Box/roms.git - -5) build (128 => super speed, too much for a 2GB machine) - cd 86Box - mkdir build - cd build - cmake .. --preset regular -D QT=OFF -D PREFER_STATIC=ON - cmake --build regular -j 128 - cd ../../ - ln -s 86Box/build/regular/src/86Box 86Box.exe - -6) boot - as root so it can take complete ownership of the linux framebuffer - -7) notes: -- 86Box will complain to be unable to find readline, this is fine, we don't need the command line at all -- ALSOFT will complain it can't connect to PipeWire, no problem, sounds will come from standard ALSA - -8) additional steps - add a new udev rule to automount any USB key to a known location so files in it can be listed in the OSD floppy/cd mount options - - create /etc/udev/rules.d/99-automount.rules - - with: - ACTION=="add", ENV{ID_BUS}=="usb", ENV{ID_TYPE}=="disk", ENV{ID_FS_TYPE}=="exfat", RUN+="/usr/bin/systemd-mount --no-block --automount=yes --collect /dev/%k '/mnt'" - - replicate this line for each filesystem you expect the usb key to be formatted, in this example "exfat" - this is going to conflict if multiple keys are inserted, don't do it - From c4a42a0994763edbe547bc2a724d7071f167b7ce Mon Sep 17 00:00:00 2001 From: Valerio Date: Mon, 27 Oct 2025 13:22:16 +0100 Subject: [PATCH 112/113] hope to make Code QL happy --- src/unix/unix.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 055b4075a..716fec109 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1095,16 +1095,19 @@ unix_executeLine(char *line) err = true; fprintf(stderr, "Path name too long.\n"); } - strcat(fn, xargv[curarg] + (xargv[curarg][0] == '\'' || xargv[curarg][0] == '"')); - if (fn[strlen(fn) - 1] == '\'' - || fn[strlen(fn) - 1] == '"') { - break; + else + { + strcat(fn, xargv[curarg] + (xargv[curarg][0] == '\'' || xargv[curarg][0] == '"')); + if (fn[strlen(fn) - 1] == '\'' + || fn[strlen(fn) - 1] == '"') { + break; + } + strcat(fn, " "); } - strcat(fn, " "); } } else { if (strlen(xargv[2]) < PATH_MAX) { - strcpy(fn, xargv[2]); + strncpy(fn, xargv[2], PATH_MAX-1); } else { fprintf(stderr, "Path name too long.\n"); } @@ -1246,8 +1249,6 @@ monitor_thread(UNUSED(void *param)) #endif } -#define FINGER_MOTION_MULTIPLIER 100 - extern int gfxcard[GFXCARD_MAX]; int main(int argc, char **argv) From dde256573653b6f004d5ff500fbe231bf0c8618b Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 27 Oct 2025 16:38:30 +0100 Subject: [PATCH 113/113] Revert the k1/k2 s3 virge masks. Should fix some overlay Streams bugs. --- src/video/vid_s3_virge.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index dcf380ff8..e9da4b412 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -1975,9 +1975,9 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) break; case 0x8190: virge->streams.sec_ctrl = val; - virge->streams.dda_horiz_accumulator = val & 0xfff; - if (val & 0x1000) - virge->streams.dda_horiz_accumulator |= ~0xfff; + virge->streams.dda_horiz_accumulator = val & 0x7ff; + if (val & 0x800) + virge->streams.dda_horiz_accumulator |= ~0x7ff; virge->streams.sdif = (val >> 24) & 7; break; @@ -1990,9 +1990,9 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) if (val & 0x800) virge->streams.k1_horiz_scale |= ~0x7ff; - virge->streams.k2_horiz_scale = (val >> 16) & 0x7ff; - if ((val >> 16) & 0x800) - virge->streams.k2_horiz_scale |= ~0x7ff; + virge->streams.k2_horiz_scale = (val >> 16) & 0x3ff; + if ((val >> 16) & 0x400) + virge->streams.k2_horiz_scale |= ~0x3ff; svga_recalctimings(svga); svga->fullchange = changeframecount; @@ -2048,14 +2048,14 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) virge->streams.k1_vert_scale |= ~0x7ff; break; case 0x81e4: - virge->streams.k2_vert_scale = val & 0x7ff; - if (val & 0x800) - virge->streams.k2_vert_scale |= ~0x7ff; + virge->streams.k2_vert_scale = val & 0x3ff; + if (val & 0x400) + virge->streams.k2_vert_scale |= ~0x3ff; break; case 0x81e8: - virge->streams.dda_vert_accumulator = val & 0xfff; - if (val & 0x1000) - virge->streams.dda_vert_accumulator |= ~0xfff; + virge->streams.dda_vert_accumulator = val & 0x7ff; + if (val & 0x800) + virge->streams.dda_vert_accumulator |= ~0x7ff; svga_recalctimings(svga); svga->fullchange = changeframecount;