añadir instrucciones al z80

Dudas, cuestiones, sugerencias y peticiones en general sobre el proyecto / Questions and requests about the project
Responder
Avatar de Usuario
Haplo
Mensajes: 368
Registrado: 05 Oct 2015, 13:51
Ubicación: Ciudad Real

añadir instrucciones al z80

Mensaje por Haplo » 22 Nov 2016, 16:51

Llevando ya un tiempo peleándome con el asm del spectrum, a veces hecho de menos alguna instrucción "lógica" que pareció habérsele olvidado incluir a los ingenieros o que, por la razón que sea, no fue posible implementar en su día. Mi pregunta es ¿sería posible añadir instrucciones nuevas, en plan las MMX de los pentium?

algo como:

ld hl,(de) igual que ld hl,(NN)
ex bc,hl
xor (de)
bit b,(de)
rrd r (desplazamiento o rotación 4 bits de golpe pero sin usar HL)

y alguna más que les gustaría tener a los que hayan programado para otros micros más potentes.

Yo hablo desde el punto de vista zxuno y del software exclusivo del mismo.
Obviamente no sería ya z80 asm estándar y habría que modificar compiladores (o "engañarlos" con DEFB). Además de que, para no liarla más, estas nuevas instrucciones ocuparían el sitio de las famosas indocumentadas del z80, ¿no?.
Ya sé que con 14 mhz (de momento :) ) no estaría justificado meterse en este berenjenal para ahorrar ciclos de reloj, pero por hipotetizar que no quede :silbando:

P.D: me han sangrado los ojos al tener que escribir con faltas de sintaxis ensambladoriana...

Avatar de Usuario
Uto
Mensajes: 1394
Registrado: 17 Dic 2015, 16:39

Re: añadir instrucciones al z80

Mensaje por Uto » 23 Nov 2016, 17:01

Al ponerme recientemente a trastear un poco con el ASM de Z80 yo también me he encontrado limitado por la ausencia de algunas instrucciones, o mejor dicho, la falta de direccionamiento indirecto en muchas instrucciones. Lo cierto es que me había acostumbrado a otros ensambladores - x86 en los 90 y Glulx en los 2000 - que admiten direccionamiento indirecto en todo parámetro (como el que echas de menos en tres de tus ejemplos), o al menos yo así lo recuerdo. También echo de menos a veces tener más registros, sobre todo de 16 bit.

Sin embargo, por muy evolucionado que crea yo que el ZX-Uno deba ser, y por mucho que crea que sería deseable que hubiera software específico para el ZX-Uno, cambiar de CPU - y meterle nuevas instrucciones es eso - me parece demasiado.

Hacerlo además solo está en manos de los expertos en cores, y supondría cambiar el core T80, cosa que imagino no será sencilla. Sinceramente, puestos a hacer eso, yo no me plantearía pensar en un Z80 custom, sino meter uno de esos Z80 evolucionados como los Rabbit, que además tienen la ventaja de que ya tienen un compilador de C creado (porque un Z80+ como dices se iba a encontrar con problemas con todos los compiladores y ensambladores existentes).

Ahora mismo, creo que la unica solución son las macros, aunque eso en general es poco eficiente en memoria y velocidad (para asegurar que funcionen en todo caso seguramente tocaría hacer push y pop de todo registro usado, e incluso utilizar una zona de memoria para intercambio, cosa que en algunos casos es innecesario porque los registros te dan igual, pero la macro te va a poner los push/pop igualmente)

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: añadir instrucciones al z80

Mensaje por mcleod_ideafix » 23 Nov 2016, 19:42

El SjASMplus incorpora instrucciones virtuales del tipo LD HL,BC y así, que son en realidad macros. Si lo que pretendes es programar de una forma un poco más sencilla y no te importa (demasiado) que la instrucción sea un poco más lenta, es esto lo que realmente necesitas, y no requiere cambiar nada en el Z80.

Pongo un extracto de la documentación del SjASMplus con la lista de instrucciones "fake" (falsas), que el propio ensamblador traduce a varias instrucciones reales:

5. Fake instructions

Of course the Z80 is only an 8 bit cpu, but sometimes ld hl,de would be nice. SjASMPlus now 'fakes' some instructions like that. This improves the readability of the source, but it might not be the fastest way to get the result. Also possibly some 'new' load instructions do affect the flags in ways you wouldn't expect. Anyway, here's the list:

rl bc
rl de
rl hl
rr bc
rr de
rr hl
sla bc
sla de
sla hl
sll bc
sll de
sll hl
sli bc
sli de
sli hl
sra bc
sra de
sra hl
srl bc
srl de
srl hl

ld bc,bc
ld bc,de
ld bc,hl
ld bc,ix
ld bc,iy
ld bc,(hl)
ld bc,(ix+nn)
ld bc,(iy+nn)

ld de,bc
ld de,de
ld de,hl
ld de,ix
ld de,iy
ld de,(hl)
ld de,(ix+nn)
ld de,(iy+nn)

ld hl,bc
ld hl,de
ld hl,hl
ld hl,ix
ld hl,iy
ld hl,(ix+nn)
ld hl,(iy+nn)

ld ix,bc
ld ix,de
ld ix,hl
ld ix,ix
ld ix,iy

ld iy,bc
ld iy,de
ld iy,hl
ld iy,ix
ld iy,iy

ld (hl),bc
ld (hl),de

ld (ix+nn),bc
ld (ix+nn),de
ld (ix+nn),hl

ld (iy+nn),bc
ld (iy+nn),de
ld (iy+nn),hl

ldi bc,(hl)
ldi bc,(ix+nn)
ldi bc,(iy+nn)

ldi de,(hl)
ldi de,(ix+nn)
ldi de,(iy+nn)

ldi hl,(ix+nn)
ldi hl,(iy+nn)

ldi (hl),bc
ldi (hl),de

ldi (ix+nn),bc
ldi (ix+nn),de
ldi (ix+nn),hl

ldi (iy+nn),bc
ldi (iy+nn),de
ldi (iy+nn),hl

ldi a,(bc)
ldi a,(de)
ldi a,(hl)
ldi b,(hl)
ldi c,(hl)
ldi d,(hl)
ldi e,(hl)
ldi h,(hl)
ldi l,(hl)
ldi a,(ix+nn)
ldi b,(ix+nn)
ldi c,(ix+nn)
ldi d,(ix+nn)
ldi e,(ix+nn)
ldi h,(ix+nn)
ldi l,(ix+nn)
ldi a,(iy+nn)
ldi b,(iy+nn)
ldi c,(iy+nn)
ldi d,(iy+nn)
ldi e,(iy+nn)
ldi h,(iy+nn)
ldi l,(iy+nn)

ldd a,(bc)
ldd a,(de)
ldd a,(hl)
ldd b,(hl)
ldd c,(hl)
ldd d,(hl)
ldd e,(hl)
ldd h,(hl)
ldd l,(hl)
ldd a,(ix+nn)
ldd b,(ix+nn)
ldd c,(ix+nn)
ldd d,(ix+nn)
ldd e,(ix+nn)
ldd h,(ix+nn)
ldd l,(ix+nn)
ldd a,(iy+nn)
ldd b,(iy+nn)
ldd c,(iy+nn)
ldd d,(iy+nn)
ldd e,(iy+nn)
ldd h,(iy+nn)
ldd l,(iy+nn)

ldi (bc),a
ldi (de),a
ldi (hl),a
ldi (hl),b
ldi (hl),c
ldi (hl),d
ldi (hl),e
ldi (hl),h
ldi (hl),l
ldi (ix+nn),a
ldi (ix+nn),b
ldi (ix+nn),c
ldi (ix+nn),d
ldi (ix+nn),e
ldi (ix+nn),h
ldi (ix+nn),l
ldi (iy+nn),a
ldi (iy+nn),b
ldi (iy+nn),c
ldi (iy+nn),d
ldi (iy+nn),e
ldi (iy+nn),h
ldi (iy+nn),l

ldd (bc),a
ldd (de),a
ldd (hl),a
ldd (hl),b
ldd (hl),c
ldd (hl),d
ldd (hl),e
ldd (hl),h
ldd (hl),l
ldd (ix+nn),a
ldd (ix+nn),b
ldd (ix+nn),c
ldd (ix+nn),d
ldd (ix+nn),e
ldd (ix+nn),h
ldd (ix+nn),l
ldd (iy+nn),a
ldd (iy+nn),b
ldd (iy+nn),c
ldd (iy+nn),d
ldd (iy+nn),e
ldd (iy+nn),h
ldd (iy+nn),l

ldi (hl),nn
ldi (ix+nn),nn
ldi (iy+nn),nn

ldd (hl),nn
ldd (ix+nn),nn
ldd (iy+nn),nn

sub hl,bc
sub hl,de
sub hl,hl
sub hl,sp

ldi increases the data pointer after the data access, so LDI A,(HL) is the same as LD A,(HL):INC HL. likewise, LDD A,(DE) is LD A,(DE):DEC DE.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
Mejias3D
Mensajes: 429
Registrado: 06 Oct 2015, 23:01

Re: añadir instrucciones al z80

Mensaje por Mejias3D » 23 Nov 2016, 20:28

Gracias mcleod_ideafix. Algo así me habría venido muy bien en mitad de los 80's cuando programaba en ASM con el Gens 3M de Hisoft (DEVPAC)

Avatar de Usuario
Haplo
Mensajes: 368
Registrado: 05 Oct 2015, 13:51
Ubicación: Ciudad Real

Re: añadir instrucciones al z80

Mensaje por Haplo » 23 Nov 2016, 20:38

Como dije, con el modo turbo el tema de arañar ciclos deja de ser tan crítico :)

No me hagáis mucho caso, era sólo una idea al aire, a veces de estos desvaríos sale algo útil como por ejemplo lo de las instrucciones "fake" del sjamsplus que no las conocía. Es una solución curiosa pero dudo mucho que las use, creo me haría un lío al depurar, tendría que programar mucho, mucho para que me resultaran "naturales".
Respecto a la legibilidad del código usando macros y tal, os parecerá raro pero nunca las he usado, sé que tienen ventajas pero como no coja una tarde y me líe a aplicarlas para acostumbrarme seguirán ignoradas como hasta ahora.

Avatar de Usuario
Uto
Mensajes: 1394
Registrado: 17 Dic 2015, 16:39

Re: añadir instrucciones al z80

Mensaje por Uto » 23 Nov 2016, 22:28

Yo tampoco conocía esas macros de sjasm

Avatar de Usuario
chernandezba
Mensajes: 841
Registrado: 02 Oct 2015, 23:35

Re: añadir instrucciones al z80

Mensaje por chernandezba » 24 Nov 2016, 09:09

Yo soy contrario a agregar instrucciones nuevas al Z80. Pensad que es un procesador que tiene 40 años, que está super extendido, documentado, etc. Agregar instrucciones nuevas supone que hay alguien que vaya a tener que documentar eso, que especificar como funciona la instrucción "por dentro", cuantos t-estados ocupa, implicaciones para la memoria contenida del spectrum, y un largo etcétera... Eso lógicamente si se quiere hacer bien.

Y luego están las implicaciones que me afectan a mi, como creador de emulador, y a otros programadores de emuladores. Y es que hay que agregar "cosas" nuevas, que no están probadas, que luego puede ser que mientras las estás agregando, a alguien se le ocurre cambiar la especificación y te mandan al garete el trabajo que has hecho. Por no hablar de que acabas haciendo de beta tester de algo recién creado que no está muy probado. Y no hay nada más frustrante (como digo, desde mi punto de vista de programador de emulador) tener que emular algo que es beta y que no está probado.

En fin, perdonad que sea tan radical pero en un caso tan poco probable como este de agregar instrucciones yo creo que me quedaria al margen

:smashPC:

Saludos
César
----

ZEsarUX
ZX Second-Emulator And Released for UniX
https://github.com/chernandezba/zesarux

Avatar de Usuario
Haplo
Mensajes: 368
Registrado: 05 Oct 2015, 13:51
Ubicación: Ciudad Real

Re: añadir instrucciones al z80

Mensaje por Haplo » 24 Nov 2016, 12:25

Pues sí, para eso mejor me metería en asm de un micro más potente y ya documentado, un 68000 a algo así, pero eso ya es otra liga :)

Responder