我正在使用在GTK上运行GUI的Z80模拟器编写(对那些感兴趣的人为https://github.com/clancyj4/z80sim/tree/dev。
我的问题是,我需要捕获IN操作码,并允许编辑窗口以提供IO代码。让我告诉你我到目前为止所拥有的:
/* get a byte (char?) from the input part of the Port window */
/* What we really want to do is have a queue */
BYTE IOPort_IN(int port)
{
char whole_buffer[IOINBUFLEN * 4]; /* 4x in case of Hex */
BYTE c;
int i;
if (IOPort[port] == NULL) /* struct exists? */
Create_IOPort_Struct(port);
printf("IOPort_IN: port=%d in_len=%d in_ptr=%d\n",
port, IOPort[port]->in_len, IOPort[port]->in_ptr);
if (IOPort[port]->in_len == 0)
{
sprintf(tstr, "Port %d requires input", port);
Add_to_Log(tstr);
show_log(TRUE);
gtk_text_buffer_set_text(inportprompt_textbuffer, "Input Required", -1);
/* somehow keep the gtk main loop running so the interface updates and allows the editing of the ioportin_textbuffer,
but wait for the input submission button the be pressed */
i = gtk_text_buffer_get_char_count(ioportin_textbuffer);
printf("in port buff len is %d.\n", i);
}
return(c);
}
捕获操作码是可以的,并且会调用此函数。麻烦在于我不知道如何在中间实施注释。
目的是保留其余的模拟,但是在GTK主循环仍在运行的情况下,因此Log窗口等得到更新,我可以在IO窗口中输入一个字符串。但是它一直等到按下提交按钮。我可以通过设置标志来冻结Z80仿真,所以没问题。
[我很讨厌我没有很好地表达问题,所以请忍受并提出任何可以澄清这种情况的问题。
干杯,
贾斯汀。
我回避了这个问题,如果还没有输入队列,则强制返回00。当然会有很多警告。
我仍然想知道如何使GTK在主线程上保持执行,直到激活了子窗口。当我知道时,我将答案放在这里。