Consultas Técnicas (ensamblador Z80 / Spectrum)

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor pser1 » 06 Mar 2015 21:30

Último mensaje de la página anterior:

me parece bien, a fin de cuentas , no vendrá de tres bytes ... eso espero!

saludos
pere

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor pser1 » 06 Mar 2015 22:57

sigo, esta vez con la parte de teclado que no acabo de pillar ...

Esta parte es llamada al recibir la orden "PAUSE"
El valor $04 en el OUT, ¿restringe a un determinado bloque de teclas?
Aquí entendimos la fila del Shift hasta la V
En el emulador TODAS las teclas alfanuméricas reanudan el juego (?)
Las flechas y los signos de puntuación no hacen nada (allí)

L_843A: LD A, $04		 ; 843A 3E 04		; Carga A con $04
OUT ($FE), A ; 843C D3 FE ; el valor de A se escribe en el puerto $FE
CALL GetAnyKey ; 843E CD B9 84 ; llama rutina GetAnyKey
i_8441: XOR A ; 8441 AF ; A = A XOR A ; A = 0, borra A, flag Z = 1
IN A, ($FE) ; 8442 DB FE ; lee teclado (Shift-Z-X-C-V)
AND $1F ; 8444 E6 1F ; Hace AND lógico de A con $1F
CP $1F ; 8446 FE 1F ; Compara A con $1F
JR NZ, i_8441 ; 8448 20 F7 ; Si Z = 0, Salta a i_8441
LD A, $07 ; 844A 3E 07 ; Carga A con $07
OUT ($FE), A ; 844C D3 FE ; el valor de A se escribe en el puerto $FE
JP GetB6DEJmpTable75D2 ; 844E C3 B3 82 ; salta a GetB6DEJmpTable75D2

Esta parte parece esperar que NO haya ninguna tecla pulsada y después espera que se pulse alguna tecla ... o no?

GetAnyKey: XOR A		 ; 84B9 AF		; A = A XOR A	; A = 0, borra A, flag Z = 1
IN A, ($FE) ; 84BA DB FE ; lee teclado (Shift-Z-X-C-V)
AND $1F ; 84BC E6 1F ; Se queda con los 5 Bit Bajos
CP $1F ; 84BE FE 1F ; Los compara para ver si hay teclas
JR NZ, GetAnyKey ; 84C0 20 F7 ; Si hay tecla Presionada repetir
; espera por una tecla
i_84C2: XOR A ; 84C2 AF ; A = A XOR A ; A = 0, borra A, flag Z = 1
IN A, ($FE) ; 84C3 DB FE ; lee teclado (Shift-Z-X-C-V)
AND $1F ; 84C5 E6 1F ; Se queda con los 5 Bit Bajos
CP $1F ; 84C7 FE 1F ; Los compara para ver si hay teclas
JR Z, i_84C2 ; 84C9 28 F7 ; Si no hay tecla repetir
RET ; 84CB C9 ; Retorna con un AND de todas las semifilas en "A"


A ver si me entero de una vez por todas ...

saludos
pere

Avatar de Usuario
Chema
Mensajes: 2664
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 3190 veces
Agradecimiento recibido: 926 veces
Contactar:

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor Chema » 06 Mar 2015 23:38

Hola Pere. Ya veo que estás avanzando mucho con esto. Respecto a la primera rutina es posible que sea un bug. Recuerda que este programa era famoso por la cantidad de pequeños errores que contenía. No he mirado todo el código, pero parece que lo que comentas es cierto.

Yo, en algún caso como éste tengo puesto un salto a una rutina que bloquea la ejecución. Algo tipo:

CatchMe:
clc
Loop: bcc Loop
rts


Por ejemplo si no encuentra bloque libre, puedes hacer esto y, cuando hagas las pruebas con el debugger si se cuelga mirar a ver si ha saltado a esa rutina. Si es así, desde el depurador seteo el Carry y sigo paso a paso a ver que hace el codigo y si todo va bien.

En cuanto a la segunda rutina parece que hace lo que dices... O al menos tiene sentido para no detectar como una pulsación si el usuario mantiene presionada una tecla.

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor pser1 » 07 Mar 2015 00:05

muchas gracias Chema,

me parece buena idea lo de derivarlo a otra rutina que puedo tener interceptada con un breakpoint y si llega a ella pues ya saltará el debugger.

Por otro lado, la cuestión de lectura de teclado, mi duda es todavía la siguiente:
En el documento indicamos que se leen las teclas desde Shift hasta V, pero en el juego real cualquier tecla alfanumérica hace que el juego se reanude
sin embargo los cursores y los signos de puntuación son omitidos, no hacen nada.

No veo en ninguna parte este tratamiento ... no lo veo claro, por esto lo puse aquí.
En todo caso esta parte que copié es todo lo que hay para procesar el comando PAUSE, así que no acabo de ver como se excluyen las teclas no A-Z ni 0-9

saludos y buen finde
pere

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor pser1 » 07 Mar 2015 16:14

Buenas tardes,

me estoy volviendo majara con esto de los puertos.
A ver si alguien me confirma o desmiente lo siguiente:
- La parte LDA $04 y luego OUT($FE), A sirve solamente para CAMBIAR el borde a color verde fuerte
- GetAnyKey espera que no haya teclas pulsadas y luego acepta la primera que se pulse, retornando
- Tras ello en i_8441 se espera a que el usuario suelte la tecla pulsada
- finalmente con LDA $07 y OUT ($FE), A se deja el borde del color gris inicial

Pero sigo sin comprender porqué en el momento de leer el teclado le ponen 0 al registro A (XOR)
Segun he leido por ahí, el puerto se calcula como: 256 * A + Puerto, de esta forma
XOR A seguido de IN A, ($FE) leería el puerto $00FE = 254. ¿Qué fila de teclas implica este puerto? ¿Tal vez TODAS?
Yo apostaría por esto último ya que el programa Z-80 en SpecEmu se reanuda con cualquier tecla (todas valen)
pero entonces los comentarios (solo la fila Shift -Z-X-C-V) están equivocados ...

Espero vuestros comentarios para decidir como lo hago en 6809. Muchas gracias
Saludos
pere

Aquí va el código maldito.
L_843A: LD A, $04		 ; 843A 3E 04		; Carga A con $04
OUT ($FE), A ; 843C D3 FE ; el valor de A se escribe en el puerto $FE
CALL GetAnyKey ; 843E CD B9 84 ; llama rutina GetAnyKey
i_8441: XOR A ; 8441 AF ; A = A XOR A ; A = 0, borra A, flag Z = 1
IN A, ($FE) ; 8442 DB FE ; lee teclado (Shift-Z-X-C-V)
AND $1F ; 8444 E6 1F ; Hace AND lógico de A con $1F
CP $1F ; 8446 FE 1F ; Compara A con $1F
JR NZ, i_8441 ; 8448 20 F7 ; Si Z = 0, Salta a i_8441
LD A, $07 ; 844A 3E 07 ; Carga A con $07
OUT ($FE), A ; 844C D3 FE ; el valor de A se escribe en el puerto $FE
JP GetB6DEJmpTable75D2 ; 844E C3 B3 82 ; salta a GetB6DEJmpTable75D2

GetAnyKey: XOR A ; 84B9 AF ; A = A XOR A ; A = 0, borra A, flag Z = 1
IN A, ($FE) ; 84BA DB FE ; lee teclado (Shift-Z-X-C-V)
AND $1F ; 84BC E6 1F ; Se queda con los 5 Bit Bajos
CP $1F ; 84BE FE 1F ; Los compara para ver si hay teclas
JR NZ, GetAnyKey ; 84C0 20 F7 ; Si hay tecla Presionada repetir
; espera por una tecla
i_84C2: XOR A ; 84C2 AF ; A = A XOR A ; A = 0, borra A, flag Z = 1
IN A, ($FE) ; 84C3 DB FE ; lee teclado (Shift-Z-X-C-V)
AND $1F ; 84C5 E6 1F ; Se queda con los 5 Bit Bajos
CP $1F ; 84C7 FE 1F ; Los compara para ver si hay teclas
JR Z, i_84C2 ; 84C9 28 F7 ; Si no hay tecla repetir
RET ; 84CB C9 ; Retorna con un AND de todas las semifilas en "A"

Avatar de Usuario
Chema
Mensajes: 2664
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 3190 veces
Agradecimiento recibido: 926 veces
Contactar:

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor Chema » 07 Mar 2015 16:38

Comprueba el teclado completo con A=0, por lo que se dice en World of Spectrum:

http://www.worldofspectrum.org/faq/refe ... erence.htm


A zero in one of the five lowest bits means that the corresponding key is pressed. If more than one address line is made low, the result is the logical AND of all single inputs, so a zero in a bit means that at least one of the appropriate keys is pressed. For example, only if each of the five lowest bits of the result from reading from Port 00FE (for instance by XOR A/IN A,(FE)) is one, no key is pressed.

jltursan
Mensajes: 5619
Registrado: 20 Sep 2011 13:59
Ubicación: Madrid
Agradecido : 990 veces
Agradecimiento recibido: 2040 veces
Contactar:

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor jltursan » 07 Mar 2015 17:17

Todo lo que decís es correcto :-)

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor pser1 » 07 Mar 2015 22:21

muchas gracias a los dos ... -thumbup
ya tenía pinta, pero mas vale asegurarse antes de liarla parda.
Vi que en A se pone todo a 1s salvo la semifila que se quiere escanear/leer, así que si pones todo ceros es que quieres detectar cualquier tecla,
se la que sea, sin poder averiguar cual ha sido ... OK, así lo tengo convertido.
Si tengo suerte el lunes puedo tener este bloque 04C finalizado, tal vez probado !?
Aquí aparecen ya las rutinas de guardar y recuperar partidas. Con caset es simple ya que reposicionas la cinta y cargas sin mas el primer fichero que llega.
En disco, de momento, voy a grabar como SAVGAM.BIN y este es el nombre que se buscará al recuperar.
Tengo que ver la compatibilidad de este fichero de posición grabada con el fichero de reinicialización que se carga cuando Bilbo muere y hay que
empezar de cero de nuevo.
Mas adelante, según espacio disponible, tanto para el programa como en el disquet, se podría añadir una función que permita entrar el nombre del
fichero, tanto en grabación cono en carga, todo se andará ...

saludos
pere

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor pser1 » 19 Mar 2015 17:29

ya echaba de menos asomar la cabeza en este hilo ...

Os adjunto una parrafada del juego. A mi me parece que el programa jamás llegará a las dos últimas lineas, pero por si acaso preferiría vuestra opinión al respecto

saludos
pere

L_7C91: PUSH BC		 ; 7C91 C5		; Guarda BC
LD C, A ; 7C92 4F ; Carga C con A
LD B, $00 ; 7C93 06 00 ; Carga B con $00
PUSH HL ; 7C95 E5 ; Guarda HL
PUSH IY ; 7C96 FD E5 ; Guarda IY
POP HL ; 7C98 E1 ; Recupera HL
ADD HL, BC ; 7C99 09 ; Adiciona BC en HL
LD BC, $0006 ; 7C9A 01 06 00 ; Carga BC con $0006
LDIR ; 7C9D ED B0 ; (DE+)=(HL+);BC- ; copia $6 bytes de HL en DE
XOR A ; 7C9F AF ; A = A XOR A ; A = 0, borra A, flag Z = 1
LD B, $06 ; 7CA0 06 06 ; Carga B con $06
i_7CA2: DEC HL ; 7CA2 2B ; Decrementa HL
OR (HL) ; 7CA3 B6 ; Hace OR lógico de A con (HL)

DJNZ i_7CA2 ; 7CA4 10 FC ; Decrementa B y si no es cero vuelve a i_7CA2
POP HL ; 7CA6 E1 ; Recupera HL
POP BC ; 7CA7 C1 ; Recupera BC

RET Z ; 7CA8 C8 ; Z = 1? ; Retorna si es cero
SET 0, (HL) ; 7CA9 CB C6 ; Pasa a 1 el bit 0 en (HL)
RET ; 7CAB C9 ; Retorna

Avatar de Usuario
Chema
Mensajes: 2664
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 3190 veces
Agradecimiento recibido: 926 veces
Contactar:

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor Chema » 19 Mar 2015 17:41

Cuidado con una cosa! He leído que DJNZ NO modifica el flag Z. Es decir, decrementa B y, si es no es cero, salta, pero cuando llega a cero el flag Z no se pone a 1. Así que se tiene el valor que haya producido el OR(HL).

Y creo que esto ya salió antes...

http://wikiti.brandonw.net/index.php?ti ... uction_Set

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor pser1 » 19 Mar 2015 18:13

Hola Chema,

muchísimas gracias por recordármelo ... tienes razón, ya lo había olvidado.
Voy a tener que echar una ojeada buscando todos los DJNZ para ver si he guardado los flags anteriores ya que en 6809
DECB seguido de BNE xxxx garantiza que saldrás del bucle con el flag Z=1 siempre!

En la parte en que estoy ahora (DescribeActionOnScreen, AnalyzeUserCommand, ExecuteAction y sus allegadas) se realizan frecuentemente
consultas a los flags unas cuantas sentencias después de haber hecho la operación que los modifica, así que si puedo los meto en el stack
pero a veces está lleno y le siguen operaciones puls así que tengo que buscarme la vida ...

Saludos y gracias de nuevo por estar al quite -thumbup
pere

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor pser1 » 19 Mar 2015 18:26

aprovecho para poner esta otra parte:
L_7D98: LD HL, L_793E		 ; 7D98 21 3E 79	; Carga HL con L_793E

BIT 0, (HL) ; 7D9B CB 46 ; Esta a 1 el bit 0 de (HL)?
JP Z, L_7E4D ; 7D9D CA 4D 7E ; Si Z = 1, Salta a L_7E4D
BIT 1, (HL) ; 7DA0 CB 4E ; Esta a 1 el bit 1 de (HL)?
LD HL, SecObj3WordPtrs ; 7DA2 21 48 79 ; apunta a SecObj3WordPtrs
LD DE, SecondObject ; 7DA5 11 E9 B6 ; apunta a SecondObject

LD BC, IsSecObjLoc ; 7DA8 01 FF B6 ; apunta a IsSecObjLoc


JR Z, L_7DFE ; 7DAB 28 51 ; Si Z = 1, Salta a L_7DFE
LD A, (L_7941) ; 7DAD 3A 41 79 ; Carga A con (L_7941)
AND A ; 7DB0 A7 ; A = A AND A ; Adecua flags
JP Z, L_7DF5 ; 7DB1 CA F5 7D ; Si Z = 1, Salta a L_7DF5
LD A, (L_7955) ; 7DB4 3A 55 79 ; Carga A con (L_7955)
LD A, (SecObj3WordPtrs) ; 7DB7 3A 48 79 ; Carga A con (SecObj3WordPtrs) - byte bajo del 1er puntero
JR i_7D89 ; 7DBA 18 CD ; Salta a i_7D89

La antepenúltima linea y la penúltima son LD A, ¿Para que hacer dos seguidas? ... la última machaca la anterior si o si, ¿cierto?

saludos
pere

Avatar de Usuario
Chema
Mensajes: 2664
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 3190 veces
Agradecimiento recibido: 926 veces
Contactar:

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor Chema » 19 Mar 2015 20:09

Esa ya me supera. No tengo ni idea de por qué se hacen dos ld a seguidos... Parece uno de los famosos parches...

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor pser1 » 19 Mar 2015 20:30

Hola Chema,

revisando los DJNZ me he encontrado con una zona de código ya en 6809 que parece que habíamos llegado a la conclusión de que NUNCA debería llegar al ejecutarse a cierta parte del programa ...
y puse un salto a una rutina de control.

Revisando ahora con la seguridad de que DJNZ no altera flags, pasa a tener sentido todo, por lo que debería cambiarlo.
A pesar de ser código 6809, a la derecha está el de Z-80

A ver que te parece ahora ... ya me dirás alguna cosa , sin prisas

saludos
pere


i_8341	lda	,u			; recupera ID del bloque		; i_8341: LD A, (IX+$00)	 ; 8341 DD 7E 00	; recupera ID del bloque apuntado
; AND A ; 8344 A7 ; es 0 (está libre)?
beq i_834B ; si 0, salta a i_834B ; JR Z, i_834B ; 8345 28 04 ; si, salta a i_834B (ya encontramos uno libre!)
leax +$19,u ; suma 25, apunta al siguiente bloque ; ADD IX, DE ; 8347 DD 19 ; apunta al siguiente bloque
decb ; decrementa contador
bne i_8341 ; si no es cero, vuelve a i_8341 ; DJNZ i_8341 ; 8349 10 F6 ; decrementa contador y si todavía quedan bloques, mira el siguiente
cmpx #$0000 ; AÑADIDO AHORA !!!!
i_834B pshs cc ; guarda flags
dec ,u ; pasa el ID a $FF ; i_834B: LD (IX+$00), $FF ; 834B DD 36 00 FF ; pone ID = $FF en el bloque
leau 1,u ; incrementa puntero ; INC IX ; 834F DD 23 ; apunta al primer byte de datos del bloque
; POP BC ; 8351 C1 ; Recupera BC
puls cc ; recupera flags ; POP DE ; 8352 D1 ; Recupera DE (-24)

bne i_8378 ; si flag Z=0, salta a i_8378 ; JR NZ, i_8378 ; 8353 20 23 ; si no encontró un bloque libre, sale via i_8378
; beq e_834B ; si flag Z=1, salta a e_834B (OK)
; jsr CtrlMal ; derivado a un Break! ; JR NZ, i_8378 ; 8353 20 23 ; si no encontró un bloque libre, sale via i_8378


e_834B ldb ,y ; recupera (IY) --- CAMBIO ---
andb #%01000000 ; está el bit6 a 1? ; BIT 6, (IY+$01) ; 8355 FD CB 01 76 ; Está a 1 el bit 6 de (IY+$01)? es el byte alto de la primera palabra

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor pser1 » 20 Mar 2015 11:00

Hola,
siempre he dicho que hay que revisar el código unos días después de haberlo escrito, siempre encuentras algo que o está mal o lo puedes hacer mejor -banghead
Repito el trozo antes copiado porqué he encontrado un error GRAVE (uso de registro X en lugar de U)
La idea está en que si DJNZ no altera flags, entoces la última operación que los afectó debe ser (en Z-80) ADD IX,DE por lo que para verificar flags, debería
controlar el valor de IX, ¿verdad?
Por esto he añadido CMPU #$0000 (actualiza flag cero y negativo) tras la última iteración. Guardo los flags en el stack y los recupero tras las dos
siguientes operaciones que en 6809 si modifican los flags
¿Podríais confirmarme este comentario?
muchas gracias

saludos
pere

ldb	#8			        ; numero de bloques a buscar		; 	LD B, $08		 ; 833F 06 08		; número de bloques a revisar
i_8341 lda ,u ; recupera ID del bloque ; i_8341: LD A, (IX+$00) ; 8341 DD 7E 00 ; recupera ID del bloque apuntado
; AND A ; 8344 A7 ; es 0 (está libre)?
beq i_834B ; si 0, salta a i_834B ; JR Z, i_834B ; 8345 28 04 ; si, salta a i_834B (ya encontramos uno libre!)
; leax +$19,u ;ERROR ; suma 25, apunta al siguiente bloque ; ADD IX, DE ; 8347 DD 19 ; apunta al siguiente bloque
leau +$19,u ; OK ; suma 25, apunta al siguiente bloque ; ADD IX, DE ; 8347 DD 19 ; apunta al siguiente bloque
decb ; decrementa contador
bne i_8341 ; si no es cero, vuelve a i_8341 ; DJNZ i_8341 ; 8349 10 F6 ; decrementa contador y si todavía quedan bloques, mira el siguiente
; cmpx #$0000 ;ERROR
cmpu #$0000 ; OK ; AÑADIDO 19/3/2015
i_834B pshs cc ; guarda flags
dec ,u ; pasa el ID a $FF ; i_834B: LD (IX+$00), $FF ; 834B DD 36 00 FF ; pone ID = $FF en el bloque
leau 1,u ; incrementa puntero ; INC IX ; 834F DD 23 ; apunta al primer byte de datos del bloque
; POP BC ; 8351 C1 ; Recupera BC
puls cc ; recupera flags ; POP DE ; 8352 D1 ; Recupera DE (-24)
bne i_8378 ; si flag Z=0, salta a i_8378 ; JR NZ, i_8378 ; 8353 20 23 ; si no encontró un bloque libre, sale via i_8378
; beq e_834B ;SOBRA ; si flag Z=1, salta a e_834B (OK)
; jsr CtrlMal ;SOBRA ; derivado a un Break! ; JR NZ, i_8378 ; 8353 20 23 ; si no encontró un bloque libre, sale via i_8378

e_834B ldb ,y ; recupera (IY) --- CAMBIO ---
andb #%01000000 ; está el bit6 a 1? ; BIT 6, (IY+$01) ; 8355 FD CB 01 76 ; Está a 1 el bit 6 de (IY+$01)? es el byte alto de la primera palabra

Avatar de Usuario
Chema
Mensajes: 2664
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 3190 veces
Agradecimiento recibido: 926 veces
Contactar:

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor Chema » 20 Mar 2015 11:09

Mira, esto es lo que no me gusta del Z80. Hay que saberse mil detalles para hacer las cosas bien. Mirando por ahí parece ser que ADD e INC sobre registros de 16 bit no alteran el flag Z, así que llegas al JR NZ en 8352 con el valor que viene de el AND A en 8344.

Si no recuerdo mal esto miraba si había alguna entrada libre en la tabla (conteniendo 0). Así que si llegas a 834b con Z=1 es que la has encontrado y si no es que no la has encontrado (de ahí el JR NZ a 8378). Eso sín en ambos casos pone el $ff e incrementa IX, pero eso no sé por qué lo hace...

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor pser1 » 20 Mar 2015 11:41

muchas gracias, Chema -thumbup
Voy a cambiar de página para consultar lo que hacen los opcodes, he encontrado ésta que explica esta casuística del ADD para 16 bits:
http://z80-heaven.wikidot.com/instructions-set

Espero que cositas de este tipo no duelan mas adelante, cuando el programa ya sea muuuy grande!
Corrijo el código y lo dejaré como se mas abajo.
A ver que te parece ahora

saludos
pere

ldb	#8			        ; numero de bloques a buscar		; 	LD B, $08		 ; 833F 06 08		; número de bloques a revisar
i_8341 lda ,u ; recupera ID del bloque ; i_8341: LD A, (IX+$00) ; 8341 DD 7E 00 ; recupera ID del bloque apuntado
; AND A ; 8344 A7 ; es 0 (está libre)?
beq i_834B ; si 0, salta a i_834B ; JR Z, i_834B ; 8345 28 04 ; si, salta a i_834B (ya encontramos uno libre!)
; leax +$19,u ;ERROR ; suma 25, apunta al siguiente bloque ; ADD IX, DE ; 8347 DD 19 ; apunta al siguiente bloque
leau +$19,u ; OK ; suma 25, apunta al siguiente bloque ; ADD IX, DE ; 8347 DD 19 ; apunta al siguiente bloque
decb ; decrementa contador
bne i_8341 ; si no es cero, vuelve a i_8341 ; DJNZ i_8341 ; 8349 10 F6 ; decrementa contador y si todavía quedan bloques, mira el siguiente
; cmpx #$0000 ;ERROR
; cmpu #$0000 ; MAL ; AÑADIDO 19/3/2015
andcc #$11111011 ;20-3-15; fuerza flag Z=0 (no es cero)
i_834B pshs cc ; guarda flags
ldb #$FF ; pone $FF ; i_834B: LD (IX+$00), $FF ; 834B DD 36 00 FF ; pone ID = $FF en el bloque
stb ,u+ ; en el ID del bloque ; INC IX ; 834F DD 23 ; apunta al primer byte de datos del bloque
; e incrementa puntero ; POP BC ; 8351 C1 ; Recupera BC
puls cc ; recupera flags ; POP DE ; 8352 D1 ; Recupera DE (-24)
bne i_8378 ; si flag Z=0, salta a i_8378 ; JR NZ, i_8378 ; 8353 20 23 ; si no encontró un bloque libre, sale via i_8378
; beq e_834B ;SOBRA ; si flag Z=1, salta a e_834B (OK)
; jsr CtrlMal ;SOBRA ; derivado a un Break! ; JR NZ, i_8378 ; 8353 20 23 ; si no encontró un bloque libre, sale via i_8378

e_834B ldb ,y ; recupera (IY) --- CAMBIO ---
andb #%01000000 ; está el bit6 a 1? ; BIT 6, (IY+$01) ; 8355 FD CB 01 76 ; Está a 1 el bit 6 de (IY+$01)? es el byte alto de la primera palabra


Volver a “Proyecto The Hobbit 6809 por pser1”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado