Consultas Técnicas (ensamblador Z80 / Spectrum)

BlackHole
Mensajes: 790
Registrado: 03 Ago 2011 23:07
Ubicación: Aluche, Madrid
Agradecido : 3 veces
Agradecimiento recibido: 65 veces

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

Mensajepor BlackHole » 13 Ene 2015 04:19

Último mensaje de la página anterior:

Supongo que estás hablando del comportamiento dentro del juego, ya que de ningún modo el comportamiento dentro del editor de BASIC es el que describes.
En ZXSpin, que es el emulador que suelo usar, acabo de ver que pulsando la tecla "0" (cero) borra un carácter, al igual que pulsando la tecla "5".
Si pulsamos la tecla "0" bien con "Caps Shift" (Delete) o bien con "Symbol Shift" (_) el juego esta programado para borrar la línea entera.

La tecla "Backspace" no existe en el Spectrum original, para borrar se usa "Caps + 0" (Delete). Los emuladores mandan dicha combinación al pulsar "Backspace" en un PC.
Sobre lo del código $40 del que hablas, no lo tengo claro porque no he examinado la rutina en código máquina que comentas, pero el ASCII para "Delete" es el 12 ($0C) y el de "_" es el 95 ($5F), así que no sé de dónde sale ese $40, salvo que estés malinterpretando el código, o los cálculos estén derivados de otras operaciones.

Avatar de Usuario
pser1
Mensajes: 2035
Registrado: 08 Dic 2012 18:34
Agradecido : 199 veces
Agradecimiento recibido: 200 veces

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

Mensajepor pser1 » 13 Ene 2015 10:02

@BlackHole

muchas gracias, está claro que tenía que haber una forma de enviar al programa el equivalente de BackSpace que borra toda la línea
En Dragón podremos utilizar la combinación Shift * Flecha Izquierda, sin problemas.

En lo que respecta al código $40 o arroba (@), como puedes ver, aquí no hay interpretaciones, es código literal

i_6DF5: CALL L_7249		 ; 6DF5 CD 49 72	; llama L_7249 - A=f(B)
BIT 7, B ; 6DF8 CB 78 ; está a 1 el bit7 de B?
JR Z, i_6E01 ; 6DFA 28 05 ; no, salta a i_6E01
CP $40 ; 6DFC FE 40 ; es A $40 ("@")? - Ver posibles teclas segun KEYBMAP1-2
JP Z, i_6E7A ; 6DFE CA 7A 6E ; si, salta a i_6E7A

Que seriamente me preocupa poco, Dragón tiene la tecla @ directa, o sea que ya veremos que pasa con ella
al probar esta rutinas relacionadas con la L_6DD6 que estoy convirtiendo ahora.

saludos
pere

Pd. puedes descargarte el fuente entero de aquí
viewtopic.php?f=84&t=200031385&start=580
La última versión es la HOBASM_V9_10b

BlackHole
Mensajes: 790
Registrado: 03 Ago 2011 23:07
Ubicación: Aluche, Madrid
Agradecido : 3 veces
Agradecimiento recibido: 65 veces

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

Mensajepor BlackHole » 13 Ene 2015 13:26

Es toda una aventura ponerse a hacer ingeniería inversa a tal magnitud, y siento no disponer del tiempo necesario para involucrarme en el proyecto.
Hay que tener en cuenta que ese $40 es el resultado del acumulador tras volver de la rutina en $7249, así que intenté leerla por encima.
Francamente yo NO sé que diablos hace esa rutina, pero en circunstancias normales, vuelve con el acumulador a 13 ($0D) que lo metemos en $726E
Si miramos el principio de la rutina en $7249 vemos:

Código: Seleccionar todo

L_7249: PUSH HL         ; 7249 E5       ; Guarda HL
        LD HL, (L_B714) ; 724A 2A 14 B7 ; HL = (L_B714) = $08B8
L_724D: CALL GetKey     ; 724D CD 93 8B ; llama rutina GetKey
        AND A           ; 7250 A7       ; A = A AND A   ; Adecua flags
        JR NZ, L_7273   ; 7251 20 20    ; Si Z = 0, Salta a L_7273
        DEC HL          ; 7253 2B       ; Decrementa HL
        LD A, H         ; 7254 7C       ; Carga A con H
        OR L            ; 7255 B5       ; Hace OR lógico de A con L
        JR NZ, L_724D   ; 7256 20 F5    ; Si Z = 0, Salta a L_724D
        POP HL          ; 7258 E1       ; Recupera HL


Aquí ciertos comentarios están mal. Hacemos un AND A justamente para ver si A vale cero. Si no es cero es cuando saltamos a $7273 y salimos de la rutina. En caso contrario hay un bucle hasta que HL valga cero, determinado por el valor almacenado en $B714 que luego con diversos cálculos actualizamos más tarde en un código que no he pegado. Así que en general, el acumulador se modificaría en esa rutina "GetKey" en $8B93, es el único sitio de donde podría tomar el valor $40.

Esa rutina "GetKey" devuelve valores tomados a partir de dos tablas fijas almacenadas en memoria. El valor $40 solo aparece una vez en la segunda tabla y únicamente cuando BC, que calcula el offset respecto al inicio de la tabla, vale 12 ($0C). En ningún otro caso obtenemos el valor $40, así que habrá que averiguar cómo llegamos a obtener ese valor de BC, tras unos cálculos matemáticos generados a partir de la detección de teclas pulsadas en determinadas semifilas.

Es probable, debido al comportamiento conocido del juego, que sea tras detectar CAPS o SHIFT más la tecla 0... revisadlo vosotros. Siento no tener tiempo para investigar más.

Avatar de Usuario
pser1
Mensajes: 2035
Registrado: 08 Dic 2012 18:34
Agradecido : 199 veces
Agradecimiento recibido: 200 veces

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

Mensajepor pser1 » 13 Ene 2015 15:23

@Blackhole

muchas gracias de nuevo, efectivamente $12 se obtiene con Shift+0 (DELETE) que se convierte a $40 via KEYBMAP2

Por cierto los comentarios sobre los flags hay que intepretarlos como tales flags, es decir:
si el flag de zero esta a uno (Z=1) significa que la comparación anterior dió cero (igualdad)
de igual forma Z=0 indica que el resultado fué distinto de cero ... ya se que es chocante decir que si Z=1 es que dió cero, pero así es cuando se tratan como indicadores 1-0 (on-off)

saludos
pere

Avatar de Usuario
pser1
Mensajes: 2035
Registrado: 08 Dic 2012 18:34
Agradecido : 199 veces
Agradecimiento recibido: 200 veces

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

Mensajepor pser1 » 24 Ene 2015 13:40

Buenos dias,

como ya comenté en el hilo de "Conversión a 6809", el parseo de órdenes del usuario solamente se hace contra el Diccionario 1, el que está agrupado por letras.
No se utiliza para nada el Diccionario 2, que hemos llamado Word_AZ

He comprobado que el intento de utilizar verbos del segundo o cualquier palabra de éste, es rechazada en el emulador "SpecEmu" con:
I do not know the word "----"

Así que asumo que al usuario solo se le permite utilizar las palabras del primer diccionario, mientras que las otras las emplea el programa para formar frases / mensajes
para explicar acciones que suceden u otras cosas, si así fuera, ya me olvidaría del parser porqué esto es lo que me está haciendo la versión convertida ...
Solo queda el tema de ver como se da por mala una palabra como "HALLB" cuando en el diccionario existen tanto "HALL" como "HALLS". En la versión convertida
se come HALLB como palabra aceptable!!
Parece que en el emulador también se consiguen cosas guapas
Podéis arrancar y hacer lo siguiente:
OPEN ALL
EXAMINE HALLOWEEN
para esta última la respuesta es interesante ...
I DO NOT SEE THE HALL HERE
Parece que el parser se come cualquier palabra por larga que sea si encuentra previamente una de CUATRO o MAS letras que coincida con las cuatro primeras
Bug o Feature?

Ya me contaréis
Saludos
pere

PD probad también "GET HEADSKIN" es una chorrada, pero cuela igual que la otra y recibe como respuesta:
I DO NOT SEE THE HEAD HERE

Avatar de Usuario
luiscoco
Mensajes: 2337
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 34 veces
Agradecimiento recibido: 45 veces
Contactar:

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

Mensajepor luiscoco » 24 Ene 2015 17:11

Muy avanzado vas, yo no he podido ayudar, a ve si me apunto pronto

Avatar de Usuario
pser1
Mensajes: 2035
Registrado: 08 Dic 2012 18:34
Agradecido : 199 veces
Agradecimiento recibido: 200 veces

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

Mensajepor pser1 » 24 Ene 2015 18:10

@Luis,

por lo menos ya sabemos porqué hay dos diccionarios en lugar de uno solo!

no te preocupes, esto es complicado y exige hacer cantidad de pruebas antes de seguir adelante, hay que asegurar cada rutina que se añade o
mas adelante se pagan en exceso y cuesta mucho mas detectar errores.

La verdad es que ya me he acostumbrado al GDB para XRoar, va perfecto para debugar en entorno Dragon, y para comparar uso el SpecEmu que también
permite hacer muchas cosas en plan debugger, de hecho ha habido momentos en los que he tenido que comparar lo que llegaba en los registros en cada
entorno para poder averiguar donde estaba fallando la conversión a 6809

En fin, que de paso voy encontrando bugs o defectos de belleza como quieras llamarles en la versión original de Spectrum.

Pasando al tema de la conversión a 6809, la situación ahora es la siguiente:
Ya tengo separadas las rutinas de los tres grandes bloques que faltan por convertir (un documento para cada bloque), de ahí a dibujar el árbol de cada una, falta poco.
1) De la IfB17AZeroClearAndJumpTable75D2 está acabado (son unas 550 líneas de código)
2) De la ExecuteUsrComandsBilboEvents sólo llega hasta el nivel 3 y ya ocupa un A4 entero, desgraciadamente hay ramas que llegan hasta el nivel 6, por lo que
tendré que dividirlo en varios subárboles si me decido a dibujarlo ... son unas 2200 líneas de código!
3) Del SayWhat que llama a PrintMsg, que es bastante pequeño, pero llega a cuatro niveles, ya veré como lo hago, no debe llegar a las 350 líneas de código.
Estimo que llevo convertido cerca de 1500 líneas de Z-80 o sea algo así como el 30% del total, no queda nada -507


Habiendo visto que la parte ya codificada pide a gritos el "PrintMsg", para enviar mensajes al usuario, me dedicaré a ella y por tanto al bloque SayWhat

saludos
pere

Avatar de Usuario
pser1
Mensajes: 2035
Registrado: 08 Dic 2012 18:34
Agradecido : 199 veces
Agradecimiento recibido: 200 veces

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

Mensajepor pser1 » 26 Ene 2015 00:22

Hola,
a ver si alguien puede echarme un cable en esta duda:

;----------------- 0x10  "You are" -----------------------------------
; (#44# OK)
L_740C: LD A, (ActionActor) ; 740C 3A EA B6 ; carga ActionActor

EX AF, AF' ; 740F 08 ; Intercambia AF <-> AF', guarda AF en registro 'espejo'
XOR A ; 7410 AF ; A = A XOR A ; A = 0, borra A, flag Z = 1
i_7411: LD (L_B703), A ; 7411 32 03 B7 ; (L_B703) = 0

EX AF, AF' ; 7414 08 ; Intercambia AF <-> AF', recupera AF del registro 'espejo'
PUSH AF ; 7415 F5 ; Guarda AF
CALL FillActorIfNull ; 7416 CD 88 74 ; llama FillActorIfNull
POP AF ; 7419 F1 ; Recupera AF
AND A ; 741A A7 ; A = A AND A ; Adecua flags
LD DE, $039B ; 741B 11 9B 03 ; DE = $039B (palabra 'is')
RET NZ ; 741E C0 ; Retorna si flag Z = 0
LD DE, $0065 ; 741F 11 65 00 ; DE = $0065 (palabra 'are')
OR $01 ; 7422 F6 01 ; A = A OR 1, flag Z = 0
RET ; 7424 C9 ; Retorna


Vamos a ver, empecemos por el EX AF,AF en $740F parece que el valor de AF les importa poco ya que tras el EX AF,AF pasan A a cero con lo que se cargan también el F recuperado.
Debo pensar que solo tendrían interés en guardar los valores actuales (como un push cualquiera)
Pero lo que remata la jugada es que acto seguido hacen PUSH AF, llaman una rutina y recuperan con POP AF
Y luego, tristemente hacen un ANDA que se carga vilmente lo que hubiera en el F tan bien guardado ... en el stack

Digo yo, pensando en voz alta ... ¿Puedo eliminar tranquilamente los dos EX AF,AF ya que A se lo cargan inmediatamente y F también aunque después de marearlo por el stack?
Una vez asumido esto, bastaría con hacer un solo PSHS A y luego PULS A (en 6809) cosa que evitaría quebraderos de cabeza ...

Como segunda parte, vamos a suponer que en 6809 queremos imitar la sentencia EX AF,AF pero sin poder usar U (DE), Y (IX) ni X (HL), situación habitual
Consideremos que existe en memoria una zona llamada reg_AF
A mi se me ocurren esta forma, que no me encanta precisamente, tengo que encontrar algo mejor ... lo que queda por convertir usa los espejos de vez en cuando
pshs   CC
puls B ; Ahora tenemos en AB el equivalente de AF
pshs U ; para liberarlo
ldu <reg_AF'
exg u,d ; aquí hacemos el intercambio
stu <reg_AF' ; recibe los valores de AF
puls U ; recuperamos U
pshs B
puls CC ; ahora tenemos F' en CC

Y como me resulta horroroso, me planteo otro método usando mas el stack
y redefiniendo reg_AF' como reg_FA' por facilidad de uso ... veamos pues
pshs CC,A ; guardamos lo actual
ldd <reg_FA' ; recuperamos el AF' de memoria espejo (F' en A y A en B)
pshs D ; guardamos AB, queda el stack así: A, CC, A', F' (siendo F' el byte de la cima del stack, o sea offset 0)
ldd 2,s ; recupera CC en A y A en B
std <reg_FA' ; guarda A(CC) en F' y luego B(A) en A'
puls CC,A ; recupera F' en CC y luego A' en A
leas 2,s ; limpiamos el stack


Pero, no consigo una reducción notable ... -banghead

Espero mejores ideas que éstas, posiblemente me he empeñado en complicarme la vida ... -nb

saludos
pere

Avatar de Usuario
Chema
Mensajes: 1740
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 688 veces
Agradecimiento recibido: 267 veces
Contactar:

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

Mensajepor Chema » 27 Ene 2015 10:23

;----------------- 0x10  "You are" -----------------------------------
; (#44# OK)
L_740C: LD A, (ActionActor) ; 740C 3A EA B6 ; carga ActionActor

EX AF, AF' ; 740F 08 ; Intercambia AF <-> AF', guarda AF en registro 'espejo'


Parece que guarda el valor del actor en A y lo mueve a los registros alternativos para luego
XOR A			 ; 7410 AF		; A = A XOR A	; A = 0, borra A, flag Z = 1
i_7411: LD (L_B703), A ; 7411 32 03 B7 ; (L_B703) = 0

EX AF, AF' ; 7414 08 ; Intercambia AF <-> AF', recupera AF del registro 'espejo'

Sólo para poner a cero b703 para lo cual debe usar A. Así no lo machaca. No sé si necesita los flags guardados en algún momento anterior en F. Lo dudo.

PUSH AF			 ; 7415 F5		; Guarda AF
CALL FillActorIfNull ; 7416 CD 88 74 ; llama FillActorIfNull
POP AF ; 7419 F1 ; Recupera AF

Esto será porque FillActorIfNull modifica A. Mantenemos en A el Actor cargado antes.

AND A			 ; 741A A7		; A = A AND A	; Adecua flags
LD DE, $039B ; 741B 11 9B 03 ; DE = $039B (palabra 'is')
RET NZ ; 741E C0 ; Retorna si flag Z = 0
LD DE, $0065 ; 741F 11 65 00 ; DE = $0065 (palabra 'are')
OR $01 ; 7422 F6 01 ; A = A OR 1, flag Z = 0
RET ; 7424 C9 ; Retorna

Ahora adecúa los flags para el RET NZ...

pser1 escribió:Digo yo, pensando en voz alta ... ¿Puedo eliminar tranquilamente los dos EX AF,AF ya que A se lo cargan inmediatamente y F también aunque después de marearlo por el stack?
Una vez asumido esto, bastaría con hacer un solo PSHS A y luego PULS A (en 6809) cosa que evitaría quebraderos de cabeza ...
pere


Pues supongo que depende de lo que puedas hacer en 6809 (que yo no conozco). Si los flags no se han guardado en alguna rutina anterior y los necesitase FillActorIfNull, efectivamente basta con guardar con cuidado A para que esta rutina no nos lo machaque. La rutina vuelve con Z=0 en cualquier caso (aunque si A es 0 carga DE con $0065 y si no lo es DE queda con $039B) y A mantiene el valor del ActionActor que hubiese al principio.

El código en Z80 parece enrevesado, probablemente basta con guardar A y adecuar el flag Z antes del RET NZ. En 6502 yo lo guardaría en la pila, llamaría a FillActorIfNull, lo recuperaría y esto ya me pondría el flag Z al valor adecuado según A. Si no habría que comparar con 0.

Algo como:
Guardar ActionActor, p.ej. tmp=(ActionActor)
(L_B703)=0;
Llamar a FillActorIfNull (que seguro que modifica ActionActor)
Si tmp==0 DE=0065 sino DE=039b
Z=0
return

Eso es lo que yo creo que hace. Seguro que puede hacerse en 6809 de manera más corta.

P.D. No estoy ayudando nada últimamente. Lo siento. Estoy muy liado en el curro, en casa, y con cosas que estamos resolviendo en los foros de Oric. Me queda poco tiempo libre. Intentaré ponerme las pilas...

Avatar de Usuario
pser1
Mensajes: 2035
Registrado: 08 Dic 2012 18:34
Agradecido : 199 veces
Agradecimiento recibido: 200 veces

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

Mensajepor pser1 » 27 Ene 2015 11:29

Chema escribió:Pues supongo que depende de lo que puedas hacer en 6809 (que yo no conozco). Si los flags no se han guardado en alguna rutina anterior y los necesitase FillActorIfNull, efectivamente basta con guardar con cuidado A para que esta rutina no nos lo machaque. La rutina vuelve con Z=0 en cualquier caso (aunque si A es 0 carga DE con $0065 y si no lo es DE queda con $039B) y A mantiene el valor del ActionActor que hubiese al principio.

El código en Z80 parece enrevesado, probablemente basta con guardar A y adecuar el flag Z antes del RET NZ. En 6502 yo lo guardaría en la pila, llamaría a FillActorIfNull, lo recuperaría y esto ya me pondría el flag Z al valor adecuado según A. Si no habría que comparar con 0.



Es que FillActorIfNul empieza con un CP que machaca los flags, así que poco lo utilizan ...
La salida JP NZ la sustituyo por BNE que implica Z=0
Lo he dejado como comentaba, es decir guardando solamente A en lugar de AF y lo hago en el stack

Muchas gracias, Chema y no te preocupes, ahora ya estoy de lleno en la conversión y estoy aceptando respetar los usos de los registros no 6809 a rajatabla así que el programa crecerá algo en extensión, pero parece mas seguro hacerlo así.
En rutinas donde claramente se entiende lo que hace localmente, me atrevo a usar los registros mas económicamente.
Cualquier aclaración sobre las áreas de scripts / ejecución de comandos será de ayuda cuando llegue a esta zona, pero queda bastante para liarme con esta parte todavía ...

saludos
pere

Avatar de Usuario
pser1
Mensajes: 2035
Registrado: 08 Dic 2012 18:34
Agradecido : 199 veces
Agradecimiento recibido: 200 veces

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

Mensajepor pser1 » 06 Mar 2015 18:58

regreso a estos lares por una duda.
Ved esta pequeña porción de código Z-80

i_8341: LD A, (IX+$00)		 ; 8341 DD 7E 00	; recupera ID del bloque apuntado
AND A ; 8344 A7 ; es 0 (está libre)?
JR Z, i_834B ; 8345 28 04 ; si, salta a i_834B (ya encontramos uno libre!)
ADD IX, DE ; 8347 DD 19 ; apunta al siguiente bloque
DJNZ i_8341 ; 8349 10 F6 ; decrementa contador y si todavía quedan bloques, mira el siguiente
i_834B: LD (IX+$00), $FF ; 834B DD 36 00 FF ; pone ID = $FF en el bloque
INC IX ; 834F DD 23 ; apunta al primer byte de datos del bloque
POP BC ; 8351 C1 ; Recupera BC
POP DE ; 8352 D1 ; Recupera DE (-24)
JR NZ, i_8378 ; 8353 20 23 ; si no encontró un bloque libre, sale via i_8378

El tema es ver que sentido tiene la última linea o sea el JR NZ
En la tercera línea se salta a i_8348 si el flag Z=1 y las cuatro sentencias siguientes NO modifican dicho flag (eso creo yo ...)
Si no se ha llevado a cabo el salto, el programa realiza un bucle con el DJNZ y no saldrá de el para llegar a i_8348 hasta que el flag Z sea 1
o sea que también en este caso tenemos cero.
Así pues, ¿Qué pinta la consulta JR NZ, si no se cumplirá nunca?
Está claro que cuantas mas veces se lee un programa mas dudas te asaltan ...

espero vuestros comentarios
muchas gracias de antemano

saludos
pere

jltursan
Mensajes: 2010
Registrado: 20 Sep 2011 13:59
Agradecido : 77 veces
Agradecimiento recibido: 167 veces

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

Mensajepor jltursan » 06 Mar 2015 19:55

Pues aparentemente es como dices, no veo como desde ese trozo de código podría llegar a tener NZ; pero es posible que ese trozo del final (a partir de i_834B) sea reutilizado desde algún otro sitio y por ese otro punto de entrada si que pueda haber un NZ.

A ver que opinan los demás...

Avatar de Usuario
pser1
Mensajes: 2035
Registrado: 08 Dic 2012 18:34
Agradecido : 199 veces
Agradecimiento recibido: 200 veces

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

Mensajepor pser1 » 06 Mar 2015 20:01

Hola José Luis,
muchas gracias.
Solo para vuestra información, no he encontrado ninguna otra llamada a este punto en todo el fuente Z-80
Por si las moscas, adjunto aquí el fuente Z-80 por si queréis verificarlo, puede que no lo haya visto yo ...

saludos
pere
Adjuntos
Analisis - HOBASM_V10_00.asm.zip
Ultima versión Análisis Z-80
(196.36 KiB) Descargado 38 veces

jltursan
Mensajes: 2010
Registrado: 20 Sep 2011 13:59
Agradecido : 77 veces
Agradecimiento recibido: 167 veces

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

Mensajepor jltursan » 06 Mar 2015 20:15

Pues entonces no lo veo, pasar por i_834B implica tener Z en ambos casos y de las instrucciones hasta el JR ninguna modifica el flag -nb

Avatar de Usuario
pser1
Mensajes: 2035
Registrado: 08 Dic 2012 18:34
Agradecido : 199 veces
Agradecimiento recibido: 200 veces

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

Mensajepor pser1 » 06 Mar 2015 20:27

gracias José Luis,

quería oirlo de alguien mas, no sea que yo le esté tomando ojeriza a la forma en que se programó esto.

Es correcto que si NO se ha encontrado ningun bloque, la salida correcta es la que tomaría via JP NZ, este es el fallo para mí:
Si se encuentra un bloque libre (valor 0), se salta y se marca con $FF
En caso contrario se sigue buscando (hay 8 bloques), pero si no hubiera ninguna libre ... cosa que no debe pasar nunca, el código no lo detecta ya que el final del DJNZ también pone Z a 1
y no han previsto ninguna otra validación.
Para mi lo ideal sería poner un JP sin condiciones a i_8378 tras el DJNZ y antes de la etiqueta i_8348 por supuesto y olvidarse del JP NZ que no sirve para nada.
¿Qué te parece mi idea? o me ciño al guión y lo dejo igual aunque no haga nada positivo ...

saludos
pere

jltursan
Mensajes: 2010
Registrado: 20 Sep 2011 13:59
Agradecido : 77 veces
Agradecimiento recibido: 167 veces

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

Mensajepor jltursan » 06 Mar 2015 20:38

Yo lo dejaba como estaba con un gran interrogante al lado a ver si en algún otro momento aparece algo que esclarece el funcionamiento. Igualmente si se tiene claro el funcionamiento de la rutina, al verla funcionar quedaría patente si hace lo que debe o no.

Avatar de Usuario
pser1
Mensajes: 2035
Registrado: 08 Dic 2012 18:34
Agradecido : 199 veces
Agradecimiento recibido: 200 veces

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

Mensajepor pser1 » 06 Mar 2015 21:30

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

saludos
pere


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