Como hace esto en ASM

Discursiones en general sobre el proyecto que no tienen cabida en otro foro / General discussion for uncateorized topics about the ZX-Uno project
Avatar de Usuario
antoniovillena
Mensajes: 2621
Registrado: 27 Sep 2015, 20:41

Re: Como hace esto en ASM

Mensaje por antoniovillena » 19 Dic 2016, 13:02

El JP (HL) no va justo después del CALL como has podido intuir. Se me olvidó poner en medio puntos suspensivos para dar más claridad.
Uto escribió:
antoniovillena escribió:
Uto escribió:En fin, quizá mi solución de auto-modificar el código sea la más óptima, al menos en espacio ocupado, la verdad es que a esa le veía ya poco jugo que sacar.
Tu solución de automodificar son 6 bytes. La mía son 4 bytes, y si aprovechas un JP (HL) de la ROM (que es lo que se suele hacer) serían 3 bytes.
Pero es que no acabo de ver que tu solución esté bien. ¿has visto lo que comentaba? :-)

Por otro lado preferiría no usar la ROM, aunque ahora que lo pienso eso es lo que hace que funcione, tal como la has puesto tú no va, aunque supongo que no querías implicar que el JP (HL) fuera justo detrás.

O sea, esto funciona:

Código: Seleccionar todo

call jmpaddr
...
...
más código aqui
...
...
...
en otra zona de memoria (ya sea RAM o ROM)
....
jmpaddr JP (HL)
Esto no funciona:

Código: Seleccionar todo

        call jmpaddr
jmpaddr JP (HL)
La verdad es que es muy buena solución si usas la ROM, y si no la usas aun salvas 2 bytes.

Lo de no usar la ROM es por no depender de ella, y porque es posible que esto funcione en 128K modo normal (no USR 0) y no tengo muy claro si puedo contar con que el JP (HL) que sea esté en todos los casos. En el peor de los casos puedo gastar un byte de RAM para el JP (HL), de momento lo cambio así, gracias.

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

Re: Como hace esto en ASM

Mensaje por Uto » 19 Dic 2016, 14:04

antoniovillena escribió:El JP (HL) no va justo después del CALL como has podido intuir. Se me olvidó poner en medio puntos suspensivos para dar más claridad.
Sí, al final lo he puesto así, aunque con mi propio JP (HL) en RAM por seguridad.

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

Re: Como hace esto en ASM

Mensaje por Uto » 19 Dic 2016, 18:31

Aquí otra para nota:

Tengo en el registro C un valor, y en el registro A un bit que hay que activar en C. O sea, que si C=4 y A=2 el resultado en C sigue siendo 4, pero si A=1 el resultado es 6 al setear el bit 1 (valor 2).

Primer intento, consiste en utilizar la instruccion SET n, C, pero modificando el código para que al final sea "SET 0, C", "SET 1, C", etc. la instruccion "SET 0, C" tiene el código $C1 y las sucesivas van separadas por 8. Es una instruccion con prefijo así que de ahí el SET_SETLow +1.

Código: Seleccionar todo

				LD B, A
				DEC B
				LD A, $C1
SETLoop			ADD A, 8
				DJNZ SETLoop
				LD (SET_SETLow + 1), A
SET_SETLow 		SET 0, C
La segunda aproximación, consiste en meter un 1 en el registro A y hacer shift a la izquierda A-1 veces, y luego hacer OR con C. Al menos en espacio esta segunda ocupa menos, y además es más legible.¿Es mejorable?

Código: Seleccionar todo

				LD B, A
				DEC B
				LD A, 1
SETLoop			SLA A
				DJNZ SETLoop
				OR C
				LD C, A


Avatar de Usuario
antoniovillena
Mensajes: 2621
Registrado: 27 Sep 2015, 20:41

Re: Como hace esto en ASM

Mensaje por antoniovillena » 19 Dic 2016, 18:51

Cambia el SLA A por RLCA

Avatar de Usuario
antoniovillena
Mensajes: 2621
Registrado: 27 Sep 2015, 20:41

Re: Como hace esto en ASM

Mensaje por antoniovillena » 19 Dic 2016, 18:54

Y es un inc b, no un dec b
Con un ld a, $80

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

Re: Como hace esto en ASM

Mensaje por Uto » 19 Dic 2016, 18:57

antoniovillena escribió:Y es un inc b, no un dec b
Con un ld a, $80
Sí, justo iba a escribir que el código está mal, que falla si A=0, pero esa solucion funciona perfecta.

Lo del RLCA vs SLA será por tiempos claro, bueno ahora también porque sino lo del $80 no va.

Avatar de Usuario
jsj
Mensajes: 336
Registrado: 21 Nov 2015, 12:48

Re: Como hace esto en ASM

Mensaje por jsj » 20 Dic 2016, 13:05

Uhmmm... ¿ngPAWS Z80-edition? :conlupa:

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

Re: Como hace esto en ASM

Mensaje por Uto » 20 Dic 2016, 14:20

jsj escribió:Uhmmm... ¿ngPAWS Z80-edition? :conlupa:

Maybe... ¿me echas una mano? (por preguntar jajaja)

Responder