mirror of
https://github.com/bradgrantham/apple2e.git
synced 2025-02-06 11:29:53 +00:00
Better textport output and timing
Only output the textport every 16ms, and only if it's changed. Be more consistent with throttling to ~1.023MHz by using a constant. Fix bug where timeslice wasn't reduce when # of instructions was reduced
This commit is contained in:
parent
97f1091881
commit
d74e6f4f5d
44
apple2e.cpp
44
apple2e.cpp
@ -84,15 +84,16 @@ const int textport_row_base_addresses[] =
|
|||||||
0x7D0,
|
0x7D0,
|
||||||
};
|
};
|
||||||
|
|
||||||
void textport_change(unsigned char *textport)
|
bool textport_changed = false;
|
||||||
|
unsigned char textport[24][40];
|
||||||
|
|
||||||
|
void textport_display()
|
||||||
{
|
{
|
||||||
printf("TEXTPORT:\n");
|
|
||||||
printf("------------------------------------------\n");
|
printf("------------------------------------------\n");
|
||||||
for(int row = 0; row < 24; row++) {
|
for(int row = 0; row < 24; row++) {
|
||||||
printf("|");
|
printf("|");
|
||||||
for(int col = 0; col < 40; col++) {
|
for(int col = 0; col < 40; col++) {
|
||||||
int addr = textport_row_base_addresses[row] - 0x400 + col;
|
int ch = textport[row][col];
|
||||||
int ch = textport[addr] & 0x7F;
|
|
||||||
printf("%c", isprint(ch) ? ch : '?');
|
printf("%c", isprint(ch) ? ch : '?');
|
||||||
}
|
}
|
||||||
printf("|\n");
|
printf("|\n");
|
||||||
@ -100,6 +101,18 @@ void textport_change(unsigned char *textport)
|
|||||||
printf("------------------------------------------\n");
|
printf("------------------------------------------\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void textport_change(unsigned char *region)
|
||||||
|
{
|
||||||
|
for(int row = 0; row < 24; row++) {
|
||||||
|
for(int col = 0; col < 40; col++) {
|
||||||
|
int addr = textport_row_base_addresses[row] - 0x400 + col;
|
||||||
|
int ch = region[addr] & 0x7F;
|
||||||
|
textport[row][col] = ch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
textport_changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
struct region
|
struct region
|
||||||
{
|
{
|
||||||
string name;
|
string name;
|
||||||
@ -1420,6 +1433,8 @@ string read_bus_and_disassemble(bus_controller &bus, int pc)
|
|||||||
return dis;
|
return dis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int millis_per_slice = 16;
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
char *progname = argv[0];
|
char *progname = argv[0];
|
||||||
@ -1497,10 +1512,10 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if(have_key) {
|
if(have_key) {
|
||||||
if(key == '') {
|
if(key == '') {
|
||||||
debugging = true;
|
debugging = true;
|
||||||
clear_strobe();
|
clear_strobe();
|
||||||
stop_keyboard();
|
stop_keyboard();
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
mainboard->enqueue_key(key);
|
mainboard->enqueue_key(key);
|
||||||
clear_strobe();
|
clear_strobe();
|
||||||
@ -1508,7 +1523,8 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
chrono::time_point<chrono::system_clock> then;
|
chrono::time_point<chrono::system_clock> then;
|
||||||
for(int i = 0; i < 25575; i++) { // ~ 1/10th second
|
const int inst_per_slice = 255750 * millis_per_slice / 1000;
|
||||||
|
for(int i = 0; i < inst_per_slice; i++) {
|
||||||
string dis = read_bus_and_disassemble(bus, cpu.pc);
|
string dis = read_bus_and_disassemble(bus, cpu.pc);
|
||||||
if(debug & DEBUG_DECODE)
|
if(debug & DEBUG_DECODE)
|
||||||
printf("%s\n", dis.c_str());
|
printf("%s\n", dis.c_str());
|
||||||
@ -1517,10 +1533,14 @@ int main(int argc, char **argv)
|
|||||||
else
|
else
|
||||||
cpu.cycle(bus);
|
cpu.cycle(bus);
|
||||||
}
|
}
|
||||||
|
if(textport_changed) {
|
||||||
|
textport_display();
|
||||||
|
textport_changed = false;
|
||||||
|
}
|
||||||
chrono::time_point<chrono::system_clock> now;
|
chrono::time_point<chrono::system_clock> now;
|
||||||
|
|
||||||
auto elapsed_millis = chrono::duration_cast<chrono::milliseconds>(now - then);
|
auto elapsed_millis = chrono::duration_cast<chrono::milliseconds>(now - then);
|
||||||
this_thread::sleep_for(chrono::milliseconds(100) - elapsed_millis);
|
this_thread::sleep_for(chrono::milliseconds(millis_per_slice) - elapsed_millis);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -1552,6 +1572,10 @@ int main(int argc, char **argv)
|
|||||||
step6502();
|
step6502();
|
||||||
else
|
else
|
||||||
cpu.cycle(bus);
|
cpu.cycle(bus);
|
||||||
|
if(textport_changed) {
|
||||||
|
textport_display();
|
||||||
|
textport_changed = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user