Solo te diré una cosa Namek, las tablas son tus amigas...
Una tabla que tenga la correspondencia de las direcciones de memoria de pantalla del Spectrum a la posición de los píxeles en tu imagen. Otra que lleve la correspondencia de cada posición de los 6144 bytes de pantalla a la dirección de su atributo. Cuantos menos cálculos hagas, mejor.
Y en un emulador "real" la única manera de refrescar la pantalla 50 veces por segundo es *NO* redibujarla entera cada vez. Muchos juegos usan dos ciclos de trabajo, en uno de ellos controlan los sprites, leen el teclado y el joystick, etc, y en el otro redibujan la pantalla con lo que consiguen 25 Hz de refresco. Así que en uno de cada dos frames no tocan la pantalla. Redibujarla completa en esas condiciones es una perdida de tiempo. Otra parte que no cambia mucho es el borde, así que frecuentemente no hay que redibujarlo. Eso sí, cuando toca, tiene algunas particularidades curiosas. En general, cuanto menos redibujes, mejor que mejor.
En ese aspecto,
ZXBaremulator es una notable excepción. Como no hay otra cosa que hacer, sí redibujo el 100 de la pantalla cada vez, con lo que simplifico mucho el código. Y, aún así, uso unas cuantas tablas...