emulador "speccy" opcode indocumentado 71h (LD (HL), C

Emuladores y aplicaciones que ayudarán a la perpetuación del Spectrum y su software en el futuro

Moderador: Sir Cilve Sinclair

Responder
Z80user
Manic Miner
Mensajes: 215
Registrado: Vie Jun 08, 2007 9:42 am
Ubicación: En un lugar de la mancha
Contactar:

emulador "speccy" opcode indocumentado 71h (LD (HL), C

Mensaje por Z80user » Lun Jun 24, 2013 6:24 pm

"Added undocumented opcode 71h to the Z80 emulation"
¿Me he perdido algo? El 71h... LD (HL), C
Sera algun otro opcode con prefijo seguramente.
Speccy 1.9.6 para android.

Tambien dice algo de un LD R, A mas realista.

¿ El dia 18 de abrir es el dia de los santos inocentes en algun pais?
Si vas a tirar Hardware, primero pregunta si alguien lo puede recuperar.
No abandones un ordenador en un vertedero, donalo a alguien.

zx81
Freddy Hardest
Mensajes: 619
Registrado: Vie Dic 28, 2007 2:14 pm
Ubicación: Valencia
Contactar:

Re: emulador "speccy" opcode indocumentado 71h (LD (HL), C

Mensaje por zx81 » Mar Jun 25, 2013 11:40 pm

Creo que se refiere al undocumented-opcode ED71 que corresponde a OUT (C), 0. No veo que haya otro opcode 0x71 con posibilidad de estar indocumentado.

Lo del registro R él sabrá, porque no es ni de lejos lo más difícil de implementar, y eso de "realista".... :D

Addenda: mirando mi emulación, solo hay un detalle importante. Esa instrucción tiene un estado de contención adicional respecto del contenido de la combinación de los registros IR, y el valor de R debe corresponder con el que tenía el registro *ANTES* de copiar el contenido del registro A en él. Salvo eso, no veo mayor dificultad. Y es algo aplicable igualmente a LD I,A.
Debido al fallo de un mecanismo, el lanzagranadas M203 se te podía disparar cuando menos lo esperaras, lo que te habría hecho bastante impopular entre lo que quedara de tu unidad.
Revista del ejército EE.UU. PS, agosto 1993.

Emulador JSpeccy
ZXBaremulator

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: emulador "speccy" opcode indocumentado 71h (LD (HL), C

Mensaje por mcleod_ideafix » Mar Oct 22, 2013 1:38 am

zx81 escribió:Creo que se refiere al undocumented-opcode ED71 que corresponde a OUT (C), 0. No veo que haya otro opcode 0x71 con posibilidad de estar indocumentado.

Un emulador debería tener en cuenta que no todos los Z80 responden a este opcode de la misma forma: la versión CMOS del Z80, para este opcode hace en realidad esta operación: OUT (C),255

zx81 escribió:Lo del registro R él sabrá, porque no es ni de lejos lo más difícil de implementar, y eso de "realista".... :D

Addenda: mirando mi emulación, solo hay un detalle importante. Esa instrucción tiene un estado de contención adicional respecto del contenido de la combinación de los registros IR, y el valor de R debe corresponder con el que tenía el registro *ANTES* de copiar el contenido del registro A en él. Salvo eso, no veo mayor dificultad. Y es algo aplicable igualmente a LD I,A.

Esas dos instrucciones... no sé, pero resulta que LD A,I y LD A,R presentan algunas peculiaridades en lo que a la gestión de las interrupciones se refiere, y otra vez hay diferencias en cómo se comporta en un Z80 NMOS y un Z80 CMOS. En este documento hay más información al respecto:
http://www.zxprojects.com/atc/zilog_z80_faq.zip
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
aleasoft
Herbert
Mensajes: 57
Registrado: Lun Sep 30, 2013 4:24 pm
Ubicación: Asturias

Re: emulador "speccy" opcode indocumentado 71h (LD (HL), C

Mensaje por aleasoft » Mar Oct 22, 2013 10:55 am

Respecto a los spectrum ¿cuales tenian NMOS y cuales tenian CMOS? ¿hay algun juego o programa que este documentado que esta diferencia le afecta?

zx81
Freddy Hardest
Mensajes: 619
Registrado: Vie Dic 28, 2007 2:14 pm
Ubicación: Valencia
Contactar:

Re: emulador "speccy" opcode indocumentado 71h (LD (HL), C

Mensaje por zx81 » Mar Oct 22, 2013 5:04 pm

Reflotación sorpresa de un hilo.... mola! :D

mcleod_ideafix escribió:
zx81 escribió:Creo que se refiere al undocumented-opcode ED71 que corresponde a OUT (C), 0. No veo que haya otro opcode 0x71 con posibilidad de estar indocumentado.

Un emulador debería tener en cuenta que no todos los Z80 responden a este opcode de la misma forma: la versión CMOS del Z80, para este opcode hace en realidad esta operación: OUT (C),255


Cuando se desarrolla un emulador, como pasa con muchos otros desarrollos y con otras profesiones, hay que alcanzar un balance entre funcionalidades, prestaciones y esfuerzo para alcanzar unas y otras. (Yo) no conozco ningún emulador que de como opción elegir el modelo de Z80 que quieres emular (no digo que no exista). Entre otras cosas porque no hay dos, sino más, ya que las segundas fuentes del Z80 tienen también sus particularidades, por ejemplo, con la emulación del registro oculto MEMPTR. Desconozco si algún modelo de Spectrum llevó el Z80 CMOS, pero parece que al principio salían con el NMOS.

mcleod_ideafix escribió:
zx81 escribió:Lo del registro R él sabrá, porque no es ni de lejos lo más difícil de implementar, y eso de "realista".... :D

Addenda: mirando mi emulación, solo hay un detalle importante. Esa instrucción tiene un estado de contención adicional respecto del contenido de la combinación de los registros IR, y el valor de R debe corresponder con el que tenía el registro *ANTES* de copiar el contenido del registro A en él. Salvo eso, no veo mayor dificultad. Y es algo aplicable igualmente a LD I,A.

Esas dos instrucciones... no sé, pero resulta que LD A,I y LD A,R presentan algunas peculiaridades en lo que a la gestión de las interrupciones se refiere, y otra vez hay diferencias en cómo se comporta en un Z80 NMOS y un Z80 CMOS. En este documento hay más información al respecto:
http://www.zxprojects.com/atc/zilog_z80_faq.zip


Estupendo documento que no conocía, ya lo tengo impreso y archivado en mi carpeta.... ;)

Supongo que las peculiaridades a las que aludes son las mencionadas en la página 130 de ese documento, última pregunta de la columna de la izquierda. Queda patente que el comportamiento de la versión NMOS es un error. Dado que no es posible (fácilmente) para un programa saber si la CPU que lo ejecuta es CMOS, NMOS o de plastelina Pelikán, la solución es la que describe el documento, no creerse que el flag P/V tiene el contenido correcto del flip-flop IFF2 y tomar sus precauciones. No le veo sentido a emular un bug de ese tipo. Si el programa sabía que eso pasaba, no se creerá el flag P/V y hará lo que toca. Si no lo sabía, mejor emular el comportamiento documentado oficialmente y arreglado en la versión CMOS y no cualquier otro.

Pero vaya, eso es solo mi argumentación, estoy abierto a escuchar otras. ;)
Debido al fallo de un mecanismo, el lanzagranadas M203 se te podía disparar cuando menos lo esperaras, lo que te habría hecho bastante impopular entre lo que quedara de tu unidad.
Revista del ejército EE.UU. PS, agosto 1993.

Emulador JSpeccy
ZXBaremulator

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: emulador "speccy" opcode indocumentado 71h (LD (HL), C

Mensaje por mcleod_ideafix » Dom Oct 27, 2013 12:43 pm

zx81 escribió:Dado que no es posible (fácilmente) para un programa saber si la CPU que lo ejecuta es CMOS, NMOS o de plastelina...

Si el programa se ejecuta en un Spectrum 128K, de hecho hay una forma muy sencilla de distinguir entre un NMOS y un CMOS:

Código: Seleccionar todo

ld bc,0fffdh
ld a,14
out (c),a
ld b,0bfh
out (c),0   ;ED71
ld b,0ffh
in a,(c)
cp 255
jr z,EsCMOS
cp 0
jr z,EsNMOS
jr EsOtraCosa

La idea es escribir un valor con la instrucción out (c),0 en el registro R16 del AY-3-8912. Si lo que se escribió fue un 0, entonces estamos en un chip NMOS. Si es un 255, es un CMOS. Si no es ni 0 ni 255, puede que sea algún clon que no soporta esa instrucción, o un Z80 emulado al que le falta emular esa instrucción.

Si no se tiene a mano un Spectrum 128K, en el 48K el usuario puede hacer una comprobación visual (no me refiero a abrir el aparato y mirar el tipo de CPU que lleva):

Código: Seleccionar todo

ld c,254
out (c),0

Si tras ejecutar este código, el borde es negro, es un chip NMOS. Si es blanco, es CMOS.

Dado que esta instrucción se usa dentro de programas que "escriben" en el borde, he añadido soporte en la ULAplus que estoy diseñando para el +2A/B/3, para que reconozca cuándo se está ejecutando esta instrucción, de forma que independientemente de lo que la CPU envíe a la ULA, ésta siempre interprete un 0. Así, se puede usar una CPU CMOS con estos programas sin que haya errores en el dibujo mostrado.
Web: ZX Projects | Twitter: @zxprojects

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Majestic-12 [Bot] y 12 invitados