Uto escribió:Pero es que no acabo de ver que tu solución esté bien. ¿has visto lo que comentaba?antoniovillena escribió: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.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.
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:
Esto no 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)
La verdad es que es muy buena solución si usas la ROM, y si no la usas aun salvas 2 bytes.Código: Seleccionar todo
call jmpaddr jmpaddr JP (HL)
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.
Como hace esto en ASM
- antoniovillena
- Mensajes: 2621
- Registrado: 27 Sep 2015, 20:41
Re: Como hace esto en ASM
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.
Re: Como hace esto en ASM
Sí, al final lo he puesto así, aunque con mi propio JP (HL) en RAM por seguridad.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.
Re: Como hace esto en ASM
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.
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?
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
Código: Seleccionar todo
LD B, A
DEC B
LD A, 1
SETLoop SLA A
DJNZ SETLoop
OR C
LD C, A
- antoniovillena
- Mensajes: 2621
- Registrado: 27 Sep 2015, 20:41
- antoniovillena
- Mensajes: 2621
- Registrado: 27 Sep 2015, 20:41
Re: Como hace esto en ASM
Sí, justo iba a escribir que el código está mal, que falla si A=0, pero esa solucion funciona perfecta.antoniovillena escribió:Y es un inc b, no un dec b
Con un ld a, $80
Lo del RLCA vs SLA será por tiempos claro, bueno ahora también porque sino lo del $80 no va.
Re: Como hace esto en ASM
Uhmmm... ¿ngPAWS Z80-edition?
Re: Como hace esto en ASM
jsj escribió:Uhmmm... ¿ngPAWS Z80-edition?
Maybe... ¿me echas una mano? (por preguntar jajaja)