Emulando 2 opcodes de Z80 de una sola vez.

Foro dedicado a la emulación de sistemas clásicos en el PC o en otros sistemas.
Avatar de Usuario
explorer
MSX Turbo R
MSX Turbo R
Mensajes: 278
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias recibidas: 65 veces
Contactar:

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor explorer » 23 Nov 2018, 21:13

No sé si lo he entendido bien, pero... ¿qué ocurre en los casos en los que el programa salta -por efecto de un bucle, por ejemplo- al segundo opcode?

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 768
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 14 veces
Gracias recibidas: 27 veces

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Bubu » 23 Nov 2018, 21:29

Yo entiendo que en ciertos casos no va a decodificar un par de instrucciones, sino sólo una. Esos casos son los de modificación del registro PC: JP, CALL, JR, RET, RST, etc. Estas instrucciones las debería decodificar de una en una.
De todas formas yo creo que el resultado final va a ser muy malo, y el esfuerzo va a ser descomunal. Si yo me pusiera con esto haría un pre-compilador.
Ajolá yo no tenga razón y le salga bien ;)
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 697
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 13 veces
Gracias recibidas: 35 veces

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Namek » 24 Nov 2018, 00:26

explorer escribió:No sé si lo he entendido bien, pero... ¿qué ocurre en los casos en los que el programa salta -por efecto de un bucle, por ejemplo- al segundo opcode?
Tal como lo tengo pensado, solo se ejecutarían 2 opcodes de una vez si el primero de ellos ocupa solo 1 byte, osea, no utiliza un segundo byte como dato o no tiene prefijo, tampoco se ejecutarían 2 a la vez si el segundo opcode tiene prefijo, de esta manera pienso ahorrar un montón de memoria y combinaciones de pares de opcodes.

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 697
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 13 veces
Gracias recibidas: 35 veces

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Namek » 24 Nov 2018, 01:39

Este es el código que uso actualmente en mi emulador para saltar a la rutina emuladora del opcode leido:

CLR.l d7 ;(borramos d7.)
MOVE.b (a4)+,d7 ;(a4 lo uso como registro PC del Z80.)
ADD.w d7,d7 ;(multiplico d7 por 2 ya que las direcciones en la tabla ocupan 2 bytes.)
MOVE.w 0(a1,d7),d7 ;(a1 apunta a la tabla de direcciones y el salto relativo se carga en el mismo d7.)
JMP 0(a3,d7) ;(a3 apunta a la direccion absoluta 0 de la tabla de saltos relatios.)

Para emular 2 opcodes el código seria el mismo solo que en lugar de coger 1 byte al que apunta (a4) se cogerian 2 por lo que solo habría que cambiar:

MOVE.b (a4)+,d7 por: MOVE.w (a4)+,d7

Pero claro,ahora la tabla tendra 65536 direciones de 2 bytes, osea, una tabla de 128K, la cuestión es si la referencia relativa al usar d7 en el MOVE.w 0(a1,d7),d7 es de 16 o de 32 bits? si es de 32 bits o 24 bits o 20 bits o 18 bits, no habria problema, pero si es de 16 no podre acceder a la tabla entera con esa instrucción, tendría que hacerlo de otra forma.

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 697
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 13 veces
Gracias recibidas: 35 veces

Re: Emulando 2 opcodes de Z80 de una sola vez.

Mensajepor Namek » 03 Dic 2018, 13:15

Esto mejora por momentos, he hecho unos calculos y me sale que de los 256 opcodes primarios solo 186 serian combinables, elimino los que no hacen nada como NOP, LD B,B, LD C,C, etc.. los prefijos y los que ocupan mas de 1 byte, tambien aquellos que producen un salto incondicional, JP (HL), RET y todos los RST, esto me da 186 x 250 (250 sin NOP y sin los 4 prefijos) = 46500 combinaciones de las cuales hay que eliminar las que no influye el orden de ejecución, (LD A,B + INC C) se emula igual sin importar si una va antes u otra despues, pero es que ademas me he dado cuenta de que hay multitud de combinaciones incongruentes que se emularian de la misma forma, por ejemplo si tengo LD A,B + XOR A, esto pone A=0 y los flags igual con todas las combinaciones de LD A,X, osea 8 combinaciones que tendrian la misma emulación y eso no acaba ahi, cualquier operación que afecte a A anterior a XOR A ocurre igual, esto reduce drasticamente las combinaciones y aumenta ampliamente la posibilidad de emular de esta forma... :mrgreen: :mrgreen: :mrgreen:

Seguimos investigando... :roll:


Volver a “Emuladores”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados