Emulando 2 opcodes de Z80 de una sola vez.
- explorer
- MSX Turbo R
- Mensajes: 425
- 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 dadas: 2 veces
- Gracias recibidas: 143 veces
- Contactar:
Re: Emulando 2 opcodes de Z80 de una sola vez.
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?
- Bubu
- Atari 1040 STf
- Mensajes: 895
- 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: 21 veces
- Gracias recibidas: 67 veces
Re: Emulando 2 opcodes de Z80 de una sola vez.
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
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!!
- Namek
- Atari 1040 STf
- Mensajes: 840
- Registrado: 11 Jul 2011, 13:13
- Gracias dadas: 18 veces
- Gracias recibidas: 63 veces
Re: Emulando 2 opcodes de Z80 de una sola vez.
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.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?
- Namek
- Atari 1040 STf
- Mensajes: 840
- Registrado: 11 Jul 2011, 13:13
- Gracias dadas: 18 veces
- Gracias recibidas: 63 veces
Re: Emulando 2 opcodes de Z80 de una sola vez.
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.
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.
- Namek
- Atari 1040 STf
- Mensajes: 840
- Registrado: 11 Jul 2011, 13:13
- Gracias dadas: 18 veces
- Gracias recibidas: 63 veces
Re: Emulando 2 opcodes de Z80 de una sola vez.
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...
Seguimos investigando...
Seguimos investigando...
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 5 invitados