mirror of
https://github.com/buserror/mii_emu.git
synced 2024-11-22 01:30:51 +00:00
Fix for 'black window' on some hardware
Plus a few other minor bits... Signed-off-by: Michel Pollet <buserror@gmail.com>
This commit is contained in:
parent
352a7f0c62
commit
bd0cda4f02
@ -34,6 +34,7 @@ mui_dispose(
|
||||
mui_t *ui)
|
||||
{
|
||||
pixman_region32_fini(&ui->inval);
|
||||
pixman_region32_fini(&ui->redraw);
|
||||
mui_font_dispose(ui);
|
||||
mui_window_t *w;
|
||||
while ((w = TAILQ_FIRST(&ui->windows))) {
|
||||
|
@ -111,7 +111,7 @@ enum mui_modifier_e {
|
||||
#define MUI_ICON_SBAR_UP ""
|
||||
#define MUI_ICON_SBAR_DOWN ""
|
||||
|
||||
/* These are specific the Charcoal System font */
|
||||
/* These are specific to our custom version of the Charcoal System font */
|
||||
#define MUI_GLYPH_APPLE "" // solid apple
|
||||
#define MUI_GLYPH_OAPPLE "" // open apple
|
||||
#define MUI_GLYPH_COMMAND ""
|
||||
@ -138,7 +138,7 @@ enum mui_modifier_e {
|
||||
typedef uint64_t mui_time_t;
|
||||
|
||||
/*
|
||||
* Even description. pretty standard stuff here -- the 'when' field is
|
||||
* Event description. pretty standard stuff here -- the 'when' field is
|
||||
* only used really to detect double clicks so far.
|
||||
*
|
||||
* Even handlers should return true if the event was handled, (in which case
|
||||
@ -204,7 +204,7 @@ struct mui_listbox_elem_t;
|
||||
|
||||
/*
|
||||
* Window DEFinition -- Handle all related to a window, from drawing to
|
||||
* even handling.
|
||||
* event handling.
|
||||
*/
|
||||
enum {
|
||||
MUI_WDEF_INIT = 0,
|
||||
@ -288,7 +288,7 @@ struct cg_ctx_t;
|
||||
|
||||
/*
|
||||
* Describes a pixmap. Currently only used for the screen destination pixels.
|
||||
* And really, only bpp:43 for ARGB is supported.
|
||||
* And really, only bpp:32 for ARGB is supported.
|
||||
*/
|
||||
typedef struct mui_pixmap_t {
|
||||
uint8_t * pixels;
|
||||
@ -447,6 +447,7 @@ mui_font_textbox(
|
||||
unsigned int text_len,
|
||||
mui_color_t color,
|
||||
uint16_t flags );
|
||||
|
||||
DECLARE_C_ARRAY(stb_ttc_g*, mui_glyph_array, 8, int x, y, w; );
|
||||
DECLARE_C_ARRAY(mui_glyph_array_t, mui_glyph_line_array, 8);
|
||||
|
||||
@ -519,7 +520,7 @@ mui_window_create(
|
||||
uint8_t layer,
|
||||
const char * title,
|
||||
uint32_t instance_size);
|
||||
// Dispose a window and it's content (controls).
|
||||
// Dispose of a window and it's content (controls).
|
||||
/*
|
||||
* Note: if an action is in progress the window is not freed immediately
|
||||
* but added to the zombie list, and freed when the action is done.
|
||||
@ -574,8 +575,9 @@ struct mui_menu_items_t;
|
||||
|
||||
/*
|
||||
* This is a menu item descriptor (also used for the titles, bar a few bits).
|
||||
* This does not a *control* in the window, instead this is used to describe
|
||||
* the menus and menu item controls that are created when the menu becomes visible.
|
||||
* This is not a *control* in the window, instead this is used to describe
|
||||
* the menus and menu item controls that are created when the menu becomes
|
||||
* visible.
|
||||
*/
|
||||
typedef struct mui_menu_item_t {
|
||||
uint32_t disabled : 1, hilited : 1;
|
||||
@ -777,10 +779,11 @@ mui_button_new(
|
||||
const char * title,
|
||||
uint32_t uid );
|
||||
/*
|
||||
* Create a static text box. Font is optional, flags correponds to the MUI_TEXT_ALIGN_*
|
||||
* PLUS the extrast listed below.
|
||||
* Create a static text box. Font is optional (default to the system main font),
|
||||
* flags corresponds to the MUI_TEXT_ALIGN_* * PLUS the extra(s) listed below.
|
||||
*/
|
||||
enum mui_textbox_e {
|
||||
// draw the frame around the text box
|
||||
MUI_CONTROL_TEXTBOX_FRAME = (1 << 8),
|
||||
};
|
||||
mui_control_t *
|
||||
|
@ -64,15 +64,30 @@ show_state:
|
||||
char buf[32];
|
||||
sprintf(buf, "%s:%d", mii_sw_names[i],
|
||||
!!(mii->sw_state & (1 << i)));
|
||||
printf("%-13.13s%s", buf, !(i % 6) ? "\n" : " ");
|
||||
printf("%-13.13s%s", buf, !((i+1) % 6) ? "\n" : " ");
|
||||
}
|
||||
printf("\n");
|
||||
printf("RGB Video Mode: %d\n", mii->video.color_mode);
|
||||
return;
|
||||
}
|
||||
if (!strcmp(argv[1], "reset")) {
|
||||
mii_reset(mii, 0);
|
||||
return;
|
||||
}
|
||||
if (!strcmp(argv[1], "rgb")) {
|
||||
if (argc < 3) {
|
||||
printf("rgb: missing argument\n");
|
||||
return;
|
||||
}
|
||||
uint8_t val = strtol(argv[2], NULL, 16);
|
||||
if (val > MII_VIDEO_MODE_COUNT) {
|
||||
printf("rgb: invalid mode %d\n", val);
|
||||
return;
|
||||
}
|
||||
mii->video.color_mode = val;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!strcmp(argv[1], "mem")) {
|
||||
printf("mii: memory map: ");
|
||||
for (int i = 0; i < MII_BANK_COUNT; i++)
|
||||
@ -241,6 +256,54 @@ _mii_mish_il(
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
_mii_mish_mm(
|
||||
void * param,
|
||||
int argc,
|
||||
const char * argv[])
|
||||
{
|
||||
static uint32_t addr = 0x800;
|
||||
if (argv[1]) {
|
||||
addr = strtol(argv[1], NULL, 16);
|
||||
if (addr > 0x00100000)
|
||||
addr = 0x00fff0;
|
||||
}
|
||||
mii_t * mii = param;
|
||||
int bi = (addr >> 16) & 0xf;
|
||||
if (bi > MII_BANK_COUNT) {
|
||||
printf("mii: invalid bank index %d (0:7)\n", bi);
|
||||
return;
|
||||
}
|
||||
addr &= 0xffff;
|
||||
mii_bank_t * bank = &mii->bank[bi];
|
||||
// addr -= bank->base;
|
||||
if (!strcmp(argv[0], "mm")) {
|
||||
printf("%s %04x\n", bank->name, addr);
|
||||
for (int i = 0; i < 8; i++) {
|
||||
printf("%06x: ", addr);
|
||||
for (int j = 0; j < 16; j++)
|
||||
printf("%02x ", mii_bank_peek(bank, addr++));
|
||||
printf("\n");
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!strcmp(argv[0], "mb")) {
|
||||
printf("%s: %04x: ", bank->name, addr);
|
||||
printf("%02x ", mii_bank_peek(bank, addr++));
|
||||
printf("\n");
|
||||
return;
|
||||
}
|
||||
if (!strcmp(argv[0], "mw") || !strcmp(argv[0], "ma")) {
|
||||
printf("%s: %04x: ", bank->name, addr);
|
||||
uint8_t l = mii_bank_peek(bank, addr++);
|
||||
uint8_t h = mii_bank_peek(bank, addr++);
|
||||
printf("%02x%02x", h, l);
|
||||
printf("\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_mii_mish_dm(
|
||||
void * param,
|
||||
@ -403,6 +466,7 @@ MISH_CMD_NAMES(mii, "mii");
|
||||
MISH_CMD_HELP(mii,
|
||||
"mii: access internals, trace, reset, speed, etc",
|
||||
" <default> : dump current state",
|
||||
" rgb <val>: Set RGB mode to <val>(0:color,1:green,2:amber)"
|
||||
" reset : reset the cpu",
|
||||
" t|trace : toggle trace_cpu (WARNING HUGE traces!))",
|
||||
" mem : dump memory and bank map",
|
||||
@ -442,6 +506,17 @@ MISH_CMD_HELP(dm,
|
||||
);
|
||||
MII_MISH(dm, _mii_mish_dm);
|
||||
|
||||
MISH_CMD_NAMES(mm, "mm","mb","mw","ma");
|
||||
MISH_CMD_HELP(mm,
|
||||
"mii: dump memory, byte, word, [raw address]",
|
||||
" <default>|mm <addr>: dump 64 bytes.",
|
||||
" mb [<addr>]: dump one byte.",
|
||||
" mw [<addr>]: dump one word.",
|
||||
" ma [<addr>]: dump one address.",
|
||||
" [addr]: 24 bits address addr 00 main, 01 aux"
|
||||
);
|
||||
MII_MISH(mm, _mii_mish_mm);
|
||||
|
||||
MISH_CMD_NAMES(step, "s","step","n","next","cont","h","halt");
|
||||
MISH_CMD_HELP(step,
|
||||
"mii: step instructions",
|
||||
|
96
src/mii_sw.h
96
src/mii_sw.h
@ -8,60 +8,54 @@
|
||||
#pragma once
|
||||
|
||||
enum {
|
||||
SW80STORE = 0xc018,
|
||||
SWVBL = 0xc019,
|
||||
SWALTCHARSET = 0xc01e,
|
||||
SW80COL = 0xc01f,
|
||||
SWTEXT = 0xc01a,
|
||||
SWMIXED = 0xc01b,
|
||||
SWPAGE2 = 0xc01c,
|
||||
SWHIRES = 0xc01d,
|
||||
|
||||
SW80STOREOFF = 0xc000,
|
||||
SW80STOREON = 0xc001,
|
||||
SWKBD = 0xc000,
|
||||
SW80STOREOFF = 0xc000,
|
||||
SW80STOREON = 0xc001,
|
||||
SWRAMRDOFF = 0xc002,
|
||||
SWRAMRDON = 0xc003,
|
||||
SWRAMWRTOFF = 0xc004,
|
||||
SWRAMWRTON = 0xc005,
|
||||
SWINTCXROMOFF = 0xc006,
|
||||
SWINTCXROMON = 0xc007,
|
||||
SWALTPZOFF = 0xc008,
|
||||
SWALTPZON = 0xc009,
|
||||
SWSLOTC3ROMOFF = 0xc00a,
|
||||
SWSLOTC3ROMON = 0xc00b,
|
||||
SW80COLOFF = 0xc00c,
|
||||
SW80COLON = 0xc00d,
|
||||
SWALTCHARSETOFF = 0xc00e,
|
||||
SWALTCHARSETON = 0xc00f,
|
||||
SW80COLOFF = 0xc00c,
|
||||
SW80COLON = 0xc00d,
|
||||
SWTEXTOFF = 0xc050, // (AKA LORES ON)
|
||||
SWTEXTON = 0xc051,
|
||||
SWMIXEDOFF = 0xc052,
|
||||
SWMIXEDON = 0xc053,
|
||||
SWPAGE2OFF = 0xc054,
|
||||
SWPAGE2ON = 0xc055,
|
||||
SWHIRESOFF = 0xc056,
|
||||
SWHIRESON = 0xc057,
|
||||
|
||||
SWAKD = 0xc010,
|
||||
SWBSRBANK2 = 0xc011,
|
||||
SWBSRREADRAM = 0xc012,
|
||||
SWRAMRD = 0xc013,
|
||||
SWRAMWRT = 0xc014,
|
||||
SWINTCXROM = 0xc015,
|
||||
SWALTPZ = 0xc016,
|
||||
SWSLOTC3ROM = 0xc017,
|
||||
SW80STORE = 0xc018,
|
||||
SWVBL = 0xc019,
|
||||
SWALTCHARSET = 0xc01e,
|
||||
SW80COL = 0xc01f,
|
||||
SWTEXT = 0xc01a,
|
||||
SWMIXED = 0xc01b,
|
||||
SWPAGE2 = 0xc01c,
|
||||
SWHIRES = 0xc01d,
|
||||
SWSPEAKER = 0xc030,
|
||||
SWTEXTOFF = 0xc050, // (AKA LORES ON)
|
||||
SWTEXTON = 0xc051,
|
||||
SWMIXEDOFF = 0xc052,
|
||||
SWMIXEDON = 0xc053,
|
||||
SWPAGE2OFF = 0xc054,
|
||||
SWPAGE2ON = 0xc055,
|
||||
SWHIRESOFF = 0xc056,
|
||||
SWHIRESON = 0xc057,
|
||||
// this one is inverted, the ON is the even address
|
||||
SWDHIRESOFF = 0xc05f, // AN3_ON
|
||||
SWDHIRESON = 0xc05e, // AN3_OFF
|
||||
SWAN3 = 0xc05e, // AN3 status
|
||||
SWAN3_REGISTER = 0xc05f, // AN3 register for video mode
|
||||
SWRDDHIRES = 0xc07f,
|
||||
|
||||
SWRAMRDOFF = 0xc002,
|
||||
SWRAMRDON = 0xc003,
|
||||
SWRAMWRTOFF = 0xc004,
|
||||
SWRAMWRTON = 0xc005,
|
||||
SWALTPZOFF = 0xc008,
|
||||
SWALTPZON = 0xc009,
|
||||
SWINTCXROMOFF = 0xc006,
|
||||
SWINTCXROMON = 0xc007,
|
||||
SWSLOTC3ROMOFF = 0xc00a,
|
||||
SWSLOTC3ROMON = 0xc00b,
|
||||
SWBSRBANK2 = 0xc011,
|
||||
SWBSRREADRAM = 0xc012,
|
||||
|
||||
SWRAMRD = 0xc013,
|
||||
SWRAMWRT = 0xc014,
|
||||
SWINTCXROM = 0xc015,
|
||||
SWALTPZ = 0xc016,
|
||||
SWSLOTC3ROM = 0xc017,
|
||||
|
||||
SWSPEAKER = 0xc030,
|
||||
SWKBD = 0xc000,
|
||||
SWAKD = 0xc010,
|
||||
|
||||
SWDHIRESON = 0xc05e, // AN3_OFF
|
||||
SWDHIRESOFF = 0xc05f, // AN3_ON
|
||||
SWAN3 = 0xc05e, // AN3 status
|
||||
SWAN3_REGISTER = 0xc05f, // AN3 register for video mode
|
||||
SWRDDHIRES = 0xc07f,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -15,13 +15,20 @@
|
||||
#define MII_VIDEO_WIDTH (280 * 2)
|
||||
#define MII_VIDEO_HEIGHT (192 * 2)
|
||||
// in case padding is needed, these can be changed
|
||||
|
||||
#if 0 // Loads of padding to align to power of 2 sizes
|
||||
#define MII_VRAM_WIDTH (1024 * 4)
|
||||
#define MII_VRAM_HEIGHT 512
|
||||
#else
|
||||
#define MII_VRAM_WIDTH (MII_VIDEO_WIDTH * 4)
|
||||
#define MII_VRAM_HEIGHT MII_VIDEO_HEIGHT
|
||||
#endif
|
||||
|
||||
enum {
|
||||
MII_VIDEO_COLOR = 0,
|
||||
MII_VIDEO_GREEN,
|
||||
MII_VIDEO_AMBER,
|
||||
MII_VIDEO_MODE_COUNT
|
||||
};
|
||||
|
||||
struct mii_t;
|
||||
|
@ -36,9 +36,10 @@
|
||||
#define WINDOW_WIDTH 1280
|
||||
#define WINDOW_HEIGHT 720
|
||||
|
||||
#define POWER_OF_TWO 0
|
||||
|
||||
typedef struct mii_gl_tex_t {
|
||||
c2_rect_t frame;
|
||||
// c2_rect_t frame;
|
||||
GLuint id;
|
||||
} mii_gl_tex_t;
|
||||
|
||||
@ -47,6 +48,7 @@ typedef struct mii_x11_t {
|
||||
pthread_t cpu_thread;
|
||||
|
||||
mui_drawable_t dr; // drawable
|
||||
uint32_t dr_padded_y;
|
||||
|
||||
union {
|
||||
struct {
|
||||
@ -392,6 +394,7 @@ mii_x11_init(
|
||||
ui->glContext = create_context(ui->dpy, ui->fbc, 0, True, attr);
|
||||
}
|
||||
}
|
||||
|
||||
XSync(ui->dpy, False);
|
||||
XSetErrorHandler(old_handler);
|
||||
if (gl_err || !ui->glContext)
|
||||
@ -402,9 +405,28 @@ mii_x11_init(
|
||||
mui_pixmap_t* pix = &ui->dr.pix;
|
||||
pix->size.y = WINDOW_HEIGHT;
|
||||
pix->size.x = WINDOW_WIDTH;
|
||||
pix->row_bytes = WINDOW_WIDTH * 4;
|
||||
// annoyingly I have to make it a LOT bigger to handle that the
|
||||
// non-power-of-2 texture extension is not avialable everywhere
|
||||
// textures, which is a bit of a waste of memory, but oh well.
|
||||
|
||||
#if POWER_OF_TWO
|
||||
int padded_x = 1;
|
||||
int padded_y = 1;
|
||||
while (padded_x < pix->size.x)
|
||||
padded_x <<= 1;
|
||||
while (padded_y < pix->size.y)
|
||||
padded_y <<= 1;
|
||||
#else
|
||||
int padded_x = pix->size.x;
|
||||
int padded_y = pix->size.y;
|
||||
#endif
|
||||
pix->row_bytes = padded_x * 4;
|
||||
pix->bpp = 32;
|
||||
pix->pixels = malloc(pix->row_bytes * WINDOW_HEIGHT * (pix->bpp / 8));
|
||||
|
||||
ui->dr_padded_y = padded_y;
|
||||
printf("MUI Padded UI size is %dx%d\n", padded_x, padded_y);
|
||||
|
||||
pix->pixels = malloc(pix->row_bytes * ui->dr_padded_y);
|
||||
mui->screen_size = pix->size;
|
||||
}
|
||||
{
|
||||
@ -631,7 +653,7 @@ mii_x11_prepare_textures(
|
||||
mii_x11_t *ui)
|
||||
{
|
||||
mii_t * mii = &ui->video.mii;
|
||||
mui_t * mui = &ui->video.mui;
|
||||
// mui_t * mui = &ui->video.mui;
|
||||
GLuint tex[2];
|
||||
glGenTextures(2, tex);
|
||||
for (int i = 0; i < 2; i++) {
|
||||
@ -658,9 +680,10 @@ mii_x11_prepare_textures(
|
||||
glBindTexture(GL_TEXTURE_2D, ui->mui_tex.id);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, 4,
|
||||
ui->dr.pix.row_bytes / 4,
|
||||
mui->screen_size.y, 0, GL_RGBA,
|
||||
ui->dr.pix.row_bytes / 4, // already power of two.
|
||||
ui->dr_padded_y, 0, GL_RGBA,
|
||||
GL_UNSIGNED_BYTE,
|
||||
ui->dr.pix.pixels);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
@ -730,10 +753,10 @@ mii_x11_render(
|
||||
glTexCoord2f(ui->attr.width / (double)(ui->dr.pix.row_bytes / 4), 0);
|
||||
glVertex2f(ui->attr.width, 0);
|
||||
glTexCoord2f(ui->attr.width / (double)(ui->dr.pix.row_bytes / 4),
|
||||
ui->attr.height / (double)(ui->dr.pix.size.y));
|
||||
ui->attr.height / (double)(ui->dr_padded_y));
|
||||
glVertex2f(ui->attr.width, ui->attr.height);
|
||||
glTexCoord2f(0,
|
||||
ui->attr.height / (double)(ui->dr.pix.size.y));
|
||||
ui->attr.height / (double)(ui->dr_padded_y));
|
||||
glVertex2f(0, ui->attr.height);
|
||||
glEnd();
|
||||
}
|
||||
@ -857,6 +880,8 @@ mii_x11_reload_config(
|
||||
ui->cpu_thread = mii_thread_start(mii);
|
||||
}
|
||||
|
||||
mii_x11_t g_mii = {};
|
||||
|
||||
int
|
||||
main(
|
||||
int argc,
|
||||
@ -866,7 +891,6 @@ main(
|
||||
asprintf(&conf_path, "%s/.local/share/mii", getenv("HOME"));
|
||||
mkdir(conf_path, 0755);
|
||||
|
||||
mii_x11_t g_mii = {};
|
||||
mii_x11_t * ui = &g_mii;
|
||||
mii_t * mii = &g_mii.video.mii;
|
||||
bool no_config_found = false;
|
||||
@ -990,6 +1014,7 @@ main(
|
||||
glViewport(0, 0, ui->width, ui->height);
|
||||
_mii_transition(ui);
|
||||
mii_x11_render(ui);
|
||||
glFlush();
|
||||
glXSwapBuffers(ui->dpy, ui->win);
|
||||
}
|
||||
/* Wait for next frame */
|
||||
|
@ -333,8 +333,8 @@ mii_mui_menu_slot_menu_update(
|
||||
mui_control_t * m = mui_control_get_by_id(mbar, FCC('f','i','l','e'));
|
||||
mui_menu_items_t * items = mui_popupmenu_get_items(m);
|
||||
|
||||
printf("%s items %p count %d RO:%d\n",
|
||||
__func__, items, items? items->count : 0, items? items->read_only : 0);
|
||||
// printf("%s items %p count %d RO:%d\n",
|
||||
// __func__, items, items? items->count : 0, items? items->read_only : 0);
|
||||
|
||||
mui_menu_items_clear(items);
|
||||
if (!items->read_only)
|
||||
@ -373,11 +373,6 @@ mii_mui_menu_slot_menu_update(
|
||||
}
|
||||
// array is NULL terminated
|
||||
mui_menu_items_push(items, (mui_menu_item_t){});
|
||||
for (int i = 0; i < (int)items->count; i++)
|
||||
printf(" %d: %s\n", i, items->e[i].title);
|
||||
|
||||
printf("%s items %p count %d RO:%d done\n",
|
||||
__func__, items, items? items->count : 0, items? items->read_only : 0);
|
||||
}
|
||||
|
||||
void
|
||||
@ -400,4 +395,4 @@ mii_mui_menus_init(
|
||||
mui_menubar_add_simple(mbar, "CPU",
|
||||
FCC('c','p','u','m'),
|
||||
m_cpu_menu);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user