Esta es una pregunta específica de la implementación, pero con trazos amplios: el acceso directo al hardware a través de interrupciones generalmente se limita al sistema operativo (específicamente al kernel). Su código no tendrá acceso en ningún sistema moderno. En su lugar, utilizaría API específicas del sistema operativo para acceder al hardware.
En resumen: los sistemas operativos de escritorio no se comportan como dispositivos incrustados y microcontrolados.
La entrada del usuario generalmente se maneja en sistemas modernos por algo llamado un evento loop. Su aplicación hace algo como esto, la implementación específica que varía entre sistemas operativos:
int main(int argc, char *argv[]) {
Event *e = NULL;
while (e = App::GetNextEvent()) {
switch (e->getType()) {
case E_MOUSEUP:
case E_RIGHTMOUSEDOWN:
case E_KEYDOWN:
// etc.
}
}
return EXIT_SUCCESS;
}
En este ejemplo, no lo hace App::GetNextEvent()
ocupado: espere: simplemente se sienta y no hace nada hasta que marcó internamente por el sistema operativo que ha llegado un evento . De esta forma, no se requiere un sondeo constante y el sistema operativo puede repartir las divisiones de tiempo a los procesos de manera más eficiente.
Sin embargo ... el NES no es un sistema moderno; emular uno significa que necesita emular las interrupciones y el hardware del NES. Hacerlo es una empresa muy grande y no tiene relación con el hardware subyacente o las interrupciones del sistema operativo host. El procesador 6502 en el NES es muy simple para los estándares modernos; hay libros disponibles que analizan emular procesadores simples similares, aunque los títulos se me escapan en este momento.
¿Eso ayuda?
Ciertamente sí, gracias :) – Russel
Tendré que estudiarlo más, ¡pero gracias por los consejos! – Russel