Scripts Z-80 en The Hobbit

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 (assembler Z80 / Spectrum)

Mensajepor Chema » 25 Nov 2014 23:23

Último mensaje de la página anterior:

Vale. Yo no he tenido tiempo de mirar más. A ver cuándo saco un rato y sigo. ¿Me entendiste con lo de cómo van los comandos y el "directorio"?

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

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

Mensajepor pser1 » 26 Nov 2014 00:55

@Chema

espero que así haya sido, sino la panzada de currar que me he pegado no habrá servido para naaaadaaaaa -banghead

Voy a subir el fichero en el otro hilo.
Bájatelo y cuando puedas verfícalo, porfa -nb

muchas gracias -thanks
saludos
pere

Pd. Tomo nota para echarle una ojeada a la rutina $7f10

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 (assembler Z80 / Spectrum)

Mensajepor Chema » 26 Nov 2014 11:06

Le he echado un vistazo rápido y me parece que está todo OK. Te has pegado un pedazo de curro...

Lo miraré con más calma y me pondré con las cosas que faltan. Me gustaría encontrar sentido a los scripts y tener una idea de qué hacen... pero lo que falta tiene un código asociado de lo más intrincado.

Por cierto, en todo el proceso he tenido que mirar un montón de rutinas. Tengo que buscar tiempo para organizarlas (tengo mucho anotado en papel) por si queréis comentarlas en el fuente.

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

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

Mensajepor pser1 » 26 Nov 2014 14:08

Hola,
cualquier anotación es mas que bienvenida para el proyecto.
Ya sabéis lo que cuesta avanzar ahora, de forma que vuestras aportaciones son indispensables!

Habréis visto que, dentro de lo posible, me gusta tener el máximo de detalle sobre la estructura de los datos.
Esta parte es seguro que la tendremos tal cual en 6809 y cuanto mejor documentada esté tanto mejor para entender las rutinas.

Lo que ya empieza a ponerme los pelos de punta es el código enrevesado con que tropezamos continuamente.
La verdad es que esperaba encontrar muchas mas partes claras que se pudieran convertir a 6809 directamente, pero me da la impresión de que habrá bastantes
trozos de código que requerirán traducción línea a línea y ésto va a doler -banghead
El 6809 es muy potente pero solo tiene registros A-B, X,Y,U,S (olvidando CC y DP que no se pueden marranear)
Lo comparamos con los A, BC, DE, HL, IX, IY, SP (olvidando F, I, R por lo mismo que antes)
Disponemos de 3 registros de 16 bits frente a los 5 del Z-80 o sea que si hiciera falta, habría que recurrir a posiciones fijas de memoria para los menos usados ...
¿Alguien ha hecho alguna conversión de Z-80 a 6809 por pequeña que sea ...
Nos podría contar como afrontó el proyecto y que tuvo que hacer, a grandes rasgos ya sería una ayuda -nb

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 (assembler Z80 / Spectrum)

Mensajepor pser1 » 26 Nov 2014 14:14

@Chema
respecto a los scripts, creo que necesitaremos tener un documento en el que se hable de como están estructurados y que rutinas o partes de código
hacen uso de ellos .... lo mas detallado posible para ver que posibilidades tendremos al hacer la conversión.

Estaba pensando en abrir un hilo solo para los scripts, pasando los mensajes sobre este tema de este hilo al nuevo.
¿Vale la pena o se va a agotar el filón en media docena de mensajes?
Aunque el mismo hilo lo podríamos usar también para hacer la conversión a 6809
Podríamos llamarle "Scripts Z80 - Conversión a 6809"
Ya me dirás algo, a veces el divide y vencerás funciona, otras la lía ... -507

saludos
pere

Avatar de Usuario
luiscoco
Mensajes: 2414
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 38 veces
Agradecimiento recibido: 59 veces

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

Mensajepor luiscoco » 26 Nov 2014 14:33

Bueno hay un auto conversor, un documento donde usan el stack para hacer todos los registros, usa U+ y -U y lo hace muy bien, lo conoces no?, pero no se si sea buena idea, yo puedo hacerlo de esa manera con un programa, pero creo que a mano es mejor, sera mas compacto al menos.

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 (assembler Z80 / Spectrum)

Mensajepor Chema » 26 Nov 2014 15:06

Respecto a la traducción yo traduje Z80 a 6502 que es peor -banghead. Si vas rutina por rutina y traduciendo lo que se intenta hacer (sin entrar a por qué) es posible (vaya si lo es). Pero yo me lo plantearía más adelante, porque desde aquí (hoy en día) se ve muy complejo y puede desmotivar. Pero no lo es... Yo traduje TODO SkoolDaze, así que se puede.

Intentaré recopilar toda la documentación posible. Lo que pasa es que suelo tirar de papel y lápiz para ir haciéndome una idea y más de una y de dos veces me equivoco (sobre todo en el uso de un flag o de una variable). Generalmente basta para hacerse una idea, pero no os fiéis al 100% de los detalles del código.

Por ejemplo. Estuve mirando los comandos que tenemos puestos como HAZ_ALGO. La rutina que los trata acaba llamando a 99c6 que es enorme y liosa, pero lo primero que hace es llamar a 7af5 (también sin documentar). Pues a grandes rasgos lo que hace esta segunda es lo siguiente: toma el byte almacenado en b6e7 como un ID de acción y analiza sus flags para ver si se puede realizar la acción con el objeto en b6e8 y, si hace falta, con un tercer objeto en b6e9. Yo creo que es la rutina básica para ejecutar una acción en el juego y seguro que se usa también para interpretar comandos del usuario.

La cuestión es que 99c6 hace más cosas que no he mirado pero sé que retorna 0 si lo hace 7af5, así que indica de algún modo si se tuvo éxito o no (creo). Pero al grano. Esto me permitió descifrar (también creo) nuestro HAZ_ALGO (códigos acabados en 2 y 4).

Los acabados en 4 tienen un parámetro que es la acción a realizar y se pone en b6e7, dejando b6e8 y b6e9 a $ff (que se usa para indicar vacío). Los acabados en dos tienen tres parámetros que se copian en esas direcciones. Veamos cómo quedan los scripts:

Código: Seleccionar todo

NastyHidGoblin_E01:
   ; ACCION(open,crack small insignificant,$ff)
        DB $02          ; C842 02      ; comando $02
   DB $10          ; C843 10      ; accion
   DB $06          ; C844 06      ; objeto1      
   DB $FF          ; C845 FF      ; objeto2

   ; ACCION(capture,$ff,$ff) JUMP(L_c84d)
L_C846:   DB $14          ; C846 14      ; comando $14 (update address)
   DB $30          ; C847 30      ;
   DW L_C84D           ; C848 4D C8      ; apunta a L_C84D

   DB $0E          ; C84A 0E      ; comando $0E (jump)      
   DW L_C846       ; C84B 46 C8      ; dirección L_C846

   ; ACCION(go up,$ff,$ff)
L_C84D:   DB $04          ; C84D 04      ; comando $04
   DB $09          ; C84E 09      ;

   ; ACCION(capture,$ff,$ff) JUMP(L_c856)
L_C84F:   DB $14          ; C84F 14      ; comando $14 (update address)
   DB $30           ; C850 30      ;
   DW L_C856           ; C851 56 C8      ; dirección para Word1 = L_C856

   DB $0E          ; C853 0E      ; comando $0E (jump)
   DW L_C84F       ; C854 4F C8      ; dirección L_C84F

   ; ACCION(down,$ff,$ff)
L_C856:   DB $04          ; C856 04      ; comando $04
   DB $0A          ; C857 0A      ;

   ; ACCION(capture,$ff,$ff) JUMP(L_c85f)
L_C858:   DB $14          ; C858 14      ; comando $14 (update address)
   DB $30          ; C859 30      ;
   DW L_C85F       ; C85A 5F C8      ; dirección L_C85F

   DB $0E          ; C85C 0E      ; comando $0E (jump)
   DW L_C858       ; C85D 58 C8      ; dirección L_C858

   ; ACCION(close,crack small insignificant,$ff)
L_C85F:   DB $02          ; C85F 02      ; comando $02
   DB $0C          ; C860 0C      ;
   DB $06          ; C861 06      ;
   DB $FF          ; C862 FF      ;

   ; ACCION(south,$ff,$ff)
   DB $04          ; C863 04      ; comando $04
   DB $02          ; C864 02      ;

   ; ACCION(capture,$ff,$ff) JUMP(L_c8c6)
L_C865:   DB $14          ; C865 14      ; comando $14 (update address)
   DB $30          ; C866 30      ;
   DW L_C86C       ; C867 6C C8      ; dirección L_C86C

   DB $0E          ; C869 0E      ; comando $0E (jump)
   DW L_C865       ; C86A 65 C8      ; dirección L_C865

   ; ACCION(north,$ff,$ff)
L_C86C:   DB $04          ; C86C 04      ; comando $04
   DB $01          ; C86D 01      ;

   DB $0E          ; C86E 0E      ; comando $0E (jump)
   DW NastyHidGoblin_E01    ; C86F 42 C8      ; dirección NastyHidGoblin_E01


Tienen una pinta estupenda ¿no? Fijaos que viendo esto da la impresión de que los comandos que tienen un 1 en la parte alta (los $12 y $14) da la impresión de que NO SIEMPRE saltan. Quizás sólo cuando la acción tiene éxito lo hagan... o eso combinado con un temporizador... Tengo que revisar el código de nuevo. Tiene que ser algo así porque así quedaría algo como esto:

Código: Seleccionar todo

Captura:
       Si ACCION(capture,$ff,$ff) Exitosa
           JUMP(Mueve)
       JUMP(Captura)
Mueve:
   ACCION(go up)
...



Si miramos las primeras de Gandalf, nos resultan conocidas fijo:

Código: Seleccionar todo

   
ACCION(give to, curious map, Bilbo)
ACCION(open, green round door,$ff)
ACCION(run,$ff,$ff)
...


Y tras eso se queda en un bucle ejecutando la acción "take" sin parámetros.

Para llegar ahí, por cierto, me he tenido que mirar unas 7 rutinas, no está el código pensado para ser claro... -banghead

Una cosa: Voy posteando las cosas según avanzo, igual preferís que tenga mucho más hecho (y comprobado!) antes de poner nada... decidme cómo lo preferís. Y abrir un hilo para los scripts igual está bien, si podéis mover todo esto allí. Y fijo que estaría bien abrir uno por problema de envergadura (como interpretar las rutinas que ejecutan acciones) y dejar este para consultas técnicas exclusivamente... No sé. Decididlo vosotros.

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

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

Mensajepor pser1 » 26 Nov 2014 16:48

@Chema,

casi mejor que lo hagas sobre la marcha, así puedo digerir sin tener un empacho -507

Ya podéis utilizar los dos hilos nuevos:
- rutinas para Acciones
- Scripts

saludos
pere

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

Re: Scripts Z80 - Conversión a 6809

Mensajepor pser1 » 26 Nov 2014 16:58

Hola Luis,

si no recuerdo mal, este es el sistema que emplean los compiladores de lenguajes de alto nivel en 6809, utilizando el registro de Stack de usuario U, pero, en el fondo, hay que reservar unas direcciones fijas de memoria para este Stack y reduces mucho las posibilidades de utilizar U como registro en si mismo cuando hagan falta alguno(s) de los que el apunta ...
De todas formas seguramente es la mejor solución al problema
Ya veremos cuando lleguemos a este esperado punto -thumbup

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: Rutinas tratamiento de acciones

Mensajepor Chema » 27 Nov 2014 20:15

Pues ahí va mi primera aportación a este hilo. Tirando del código que curraba con los scripts, había una llamada a 7af5. Mirando dicha función me encontré un montón de rollos, pero sobre todo una llamada a 950f, rutina que se llama desde más sitios y que parece que es la que acababa ejecutando la acción.

Aquí está comentada:

Código: Seleccionar todo

;                     ; (#95# --)
; ExecuteAction
; Recibe la acción a realizar en b6e7 y los objetos utilizados en b6e8 y b6e9. Si un
; objeto no se utiliza, se pasa a $ff.
; Usa otras posiciones de memoria cuyo valor es aun desconocido.
; b6ea
; b6fe
; b6ff
; Efectos laterales, al acabar quedan modificadas:
; b708/9 Puntero al objeto primario
; b70a/b Puntero al objeto secundario

L_950F:
   ; Salvamos registros
   PUSH HL          ; 950F E5      ; Guarda HL
   PUSH IX          ; 9510 DD E5      ; Guarda IX
   PUSH BC          ; 9512 C5      ; Guarda BC
   
   ; Comprueba si la acción tiene efecto sobre un objeto.
   ; Devuelve Z=1 si no es el caso
   CALL L_9B44       ; 9513 CD 44 9B   ; llama rutina L_9B44 (#208# --)
   
   ; Si no saltamos a 95DA que imprime "I cannot do that y sale por 95c7
   JP Z, L_95DA       ; 9516 CA DA 95   ; Si Z = 1, Salta a L_95DA
   
   ; Es una acción tiene efecto, lo primero miramos si está oscuro:
   CALL IsItDark       ; 9519 CD ED 95   ; llama rutina IsItDark
   JR NC, L_9539       ; 951C 30 1B      ; Si C = 0, Salta a L_9539
   
   ; Si está oscuro:
   ;  Si *b711 es 0
   LD A, (L_B711)       ; 951E 3A 11 B7   ; Carga A con (L_B711)
   AND A          ; 9521 A7      ; A = A AND A   ; Adecua flags
   JR NZ, L_9531       ; 9522 20 0D      ; Si Z = 0, Salta a L_9531

   ;      Llamamos a 9c78 que vuelve con C=1 si el objeto en *b6e8
   ;      es $ff o está denro del objeto *b6ea
   CALL L_9C78       ; 9524 CD 78 9C   ; llama rutina L_9C78 (#177# --)
   JR NC, L_9531       ; 9527 30 08      ; Si C = 0, Salta a L_9531

   ;       Si C==1 se llama a 9c7b con A=*b6e9, que es básicamente lo mismo
   ;          pero para este nuevo objeto
   LD A, (L_B6E9)       ; 9529 3A E9 B6   ; Carga A con (L_B6E9)
   CALL L_9C7B       ; 952C CD 7B 9C   ; llama rutina L_9C7B (#196# --)

   ;       Si C==0 Imprimimos "I see nothing here" y saltamos a 959b
   JR C, L_9539       ; 952F 38 08      ; Si C = 1, Salta a L_9539
L_9531: LD HL, L_AFC4       ; 9531 21 C4 AF   ; apunta a mensaje "i see nothing here"
   CALL PrintMsg       ; 9534 CD DD 72   ; llama rutina PrintMsg
   JR L_959B       ; 9537 18 62      ; Salta a L_959B
   
   ; fin si está oscuro
      
L_9539:
   ; Si *b6fe es 1 o *b6e8 es $ff procesamos a través de la tabla de
   ; acciones en 95cc. Se busca su entrada en C730 y se pone IX a esa entrada y se salta a
   ; 9586 (donde se llama a las rutinas, más adelante).
   ; Si no se encuentra se imprime "I cannot do that".
   LD A, (L_B6FE)       ; 9539 3A FE B6   ; Carga A con (L_B6FE)
   CP $01          ; 953C FE 01      ; Compara A con $01
   JP Z, L_95CC       ; 953E CA CC 95   ; Si Z = 1, Salta a L_95CC
   LD A, (L_B6E8)       ; 9541 3A E8 B6   ; Carga A con (L_B6E8)
   CP $FF          ; 9544 FE FF      ; Compara A con $FF
   JP Z, L_95CC       ; 9546 CA CC 95   ; Si Z = 1, Salta a L_95CC
   
   ; Obtenemos el Puntero al objeto principal *b6e8 y lo guardamos en b708
   CALL GetObjPointer2IX    ; 9549 CD CA 9B   ; llama GetObjPointer2IX devuelve puntero al objeto en IX
   LD (L_B708), IX       ; 954C DD 22 08 B7   ; Carga (L_B708) con IX
   LD A, (L_B6E8)       ; 9550 3A E8 B6   ; Carga A con (L_B6E8)

   ; Llamamos a 9728 Que comprueba si el objeto lo lleva otro PNJ, imprimiendo
   ; "A is carrying B" en ese caso y volviendo con Z=0
   ; Si fuese así, se salta a 959b para procesar la acción del PNJ si fuese el caso.
   CALL L_9728       ; 9553 CD 28 97   ; llama rutina L_9728 (#209# --)
   JR NZ, L_959B       ; 9556 20 43      ; Si Z = 0, Salta a L_959B

   ; Si el objeto secundario *b6e9 no es $ff
   LD A, (L_B6E9)       ; 9558 3A E9 B6   ; Carga A con (L_B6E9)
   CP $FF          ; 955B FE FF      ; Compara A con $FF
   JR Z, L_957A       ; 955D 28 1B      ; Si Z = 1, Salta a L_957A
   
   ;    si *b6ff es 1 salir por 95cc, procesar por tabla de acciones
   LD A, (L_B6FF)       ; 955F 3A FF B6   ; Carga A con (L_B6FF)
   CP $01          ; 9562 FE 01      ; Compara A con $01
   JR Z, L_95CC       ; 9564 28 66      ; Si Z = 1, Salta a L_95CC
   ;    Obtener el puntero a ese objeto secundario y guardarlo en b70a
   LD A, (L_B6E9)       ; 9566 3A E9 B6   ; Carga A con (L_B6E9)
   CALL GetObjPointer2IX    ; 9569 CD CA 9B   ; llama GetObjPointer2IX devuelve puntero al objeto en IX
   LD (L_B70A), IX       ; 956C DD 22 0A B7   ; Carga (L_B70A) con IX

   ; Llamamos a 9728 Que comprueba si el objeto lo lleva otro PNJ, imprimiendo
   ; "A is carrying B" en ese caso y volviendo con Z=0
   ; Si fuese así, se salta a 959b para procesar la acción del PNJ si fuese el caso.
   CALL L_9728       ; 9570 CD 28 97   ; llama rutina L_9728 (#209# --)
   JR NZ, L_959B       ; 9573 20 26      ; Si Z = 0, Salta a L_959B

   ; Llamamos a a1d0. Esta rutina busca el código en b6e7 en una tabla de 5 bytes
   ; en A20b. Luego esa tabla contiene IDs de acciones. Devuelve Z=1 si lo encuentra.
   ; Si no se encuentra se pone IX al valor almacenado en *b708 (el puntero al
   ; objeto principal). En otro caso se quedaría con el puntero al objeto secundario.
   ; Esto sirve para determinar en los datos de qué objeto hay que buscar las rutinas
   ; a ejecutar para la acción.
   CALL L_A1D0       ; 9575 CD D0 A1   ; llama rutina L_A1D0 (#120# OK)
   JR Z, L_957E       ; 9578 28 04      ; Si Z = 1, Salta a L_957E
L_957A: LD IX, (L_B708)       ; 957A DD 2A 08 B7   ; Carga IX con (L_B708)

   ; Ahora tomamos la acción en A y apuntamos IX a la entrada en los datos del objeto
   ; correspondientes a dicha acción. Si no se encuentra se devuelve el C=0 y se sale por 95cc
   ; que busca en la tabla de acciones
L_957E: LD A, (L_B6E7)       ; 957E 3A E7 B6   ; Carga A con (L_B6E7)
   CALL L_9B81       ; 9581 CD 81 9B   ; llama rutina L_9B81 (#121# OK)
   JR NC, L_95CC       ; 9584 30 46      ; Si C = 0, Salta a L_95CC
   
   ; Ya tenemos la entrada en los datos del objeto asociados a la acción. El puntero
   ; se encuentra en los bytes 1 y 2 (los registros son acción, punterobajo, punteroalto)
   ; Se llama a ella a través de CallSubroutineHL y se sigue llamando a todas las rutinas
   ; siguientes siempre que la entrada en los datos del objeto tenga como acción 00.
L_9586: LD L, (IX+$01)       ; 9586 DD 6E 01   ; Carga L con (IX+$01)
   LD H, (IX+$02)       ; 9589 DD 66 02   ; Carga H con (IX+$02)
      CALL CallSubrutineHL    ; 958C CD 6C 9B   ; llama CallSubrutineHL
   INC IX          ; 958F DD 23      ; Incrementa IX
   INC IX          ; 9591 DD 23      ; Incrementa IX
   INC IX          ; 9593 DD 23      ; Incrementa IX
   SUB A          ; 9595 97      ; Resta A de A
   CP (IX+$00)       ; 9596 DD BE 00   ; Compara A con (IX+$00)
   JR Z, L_9586       ; 9599 28 EB      ; Si Z = 1, Salta a L_9586
   
   ; Si *b6fa==1
L_959B: LD A, (L_B6FA)       ; 959B 3A FA B6   ; Carga A con (L_B6FA)
   CP $01          ; 959E FE 01      ; Compara A con $01
   JR NZ, L_95C7       ; 95A0 20 25      ; Si Z = 0, Salta a L_95C7
   ;   si *b6ea==0
   ;       Si está oscuro, imprime el mensaje por defecto que viene de IsItDark: "it is dark"            
   LD A, (L_B6EA)       ; 95A2 3A EA B6   ; Carga A con (L_B6EA)
   CP $00          ; 95A5 FE 00      ; Compara A con $00
   JR NZ, L_95AF       ; 95A7 20 06      ; Si Z = 0, Salta a L_95AF
   CALL IsItDark       ; 95A9 CD ED 95   ; llama rutina IsItDark
   CALL C, PrintMsg    ; 95AC DC DD 72   ; si flag C=1, llama rutina PrintMsg
   ;      fin si
   ;   fin si
   
   ; Ponemos B=*b6e7, A=*b6e8 e IX=*b708 (acción, objeto principal y puntero a objeto principal)
   ; Y llamamos a 95df. Esta rutina mira a ver si el objeto es un animal y no está muerto y entonces
   ; busca en su directorio la entrada de acción B (los ID en las entradas de directorios son acciones).
   ; y pone WORD1 a esa entrada para que el PNJ reaccione.
   ; Estamos realizando una acción sobre un PNJ, como "attack troll"
L_95AF: LD A, (L_B6E7)       ; 95AF 3A E7 B6   ; Carga A con (L_B6E7)
   LD B, A          ; 95B2 47      ; Carga B con A
   LD A, (L_B6E8)       ; 95B3 3A E8 B6   ; Carga A con (L_B6E8)
   LD IX, (L_B708)       ; 95B6 DD 2A 08 B7   ; Carga IX con (L_B708)
   CALL L_95DF       ; 95BA CD DF 95   ; llama rutina L_95DF (#210# --)
   
   ; Se repite lo anterior con el objeto secundario. Supongo que para cosas como "Give map to Gandalf"
   LD A, (L_B6E9)       ; 95BD 3A E9 B6   ; Carga A con (L_B6E9)
   LD IX, (L_B70A)       ; 95C0 DD 2A 0A B7   ; Carga IX con (L_B70A)
   CALL L_95DF       ; 95C4 CD DF 95   ; llama rutina L_95DF (#210# --)
   
   ; fin si
   
   ; Recuperamos registros y salimos
L_95C7: POP BC          ; 95C7 C1      ; Recupera BC
   POP IX          ; 95C8 DD E1      ; Recupera IX
   POP HL          ; 95CA E1      ; Recupera HL
   RET          ; 95CB C9      ; Retorna
   
   
   ; Buscamos el puntero a la acción en la tabla de acciones de c730. Si lo encuentra
   ; salta a 9586 donde se ejecutan las mismas
   ; Si no, imprime "I cannot do that" y sale
L_95CC: LD A, (L_B6E7)       ; 95CC 3A E7 B6   ; Carga A con (L_B6E7)
   LD IX, L_C730       ; 95CF DD 21 30 C7   ; Carga IX con L_C730
   CALL FindPointer    ; 95D3 CD BD 9D   ; busca puntero con código A e inicio tabla en IX
   CP $FF          ; 95D6 FE FF      ; Compara A con $FF
   JR NZ, L_9586       ; 95D8 20 AC      ; Si Z = 0, Salta a L_9586
L_95DA: CALL L_72CE       ; 95DA CD CE 72   ; llama rutina L_72CE (#211# --)
   JR L_95C7       ; 95DD 18 E8      ; Salta a L_95C7
   

                     ; (#210# --)
   ; Recibe A=objeto, B=Accion, IX=puntero a objeto
   ; Comprueba si el objeto pasado en IX es un animal y está vivo, para llamar a la
   ; rutina 9aa0.
   ; Busca en su directorio la entrada de acción B (los ID en las entradas de directorios son acciones).
   ; y pone WORD1 a esa entrada para que el PNJ reaccione.
   ; Estamos realizando una acción sobre un PNJ, como "attack goblin"
L_95DF: BIT 6, (IX+$07)       ; 95DF DD CB 07 76   ; Esta a 1 el bit 6 de (IX+$07)?
   RET Z          ; 95E3 C8      ; Z = 1?   ; Retorna si es cero
   BIT 3, (IX+$07)       ; 95E4 DD CB 07 5E   ; Esta a 1 el bit 3 de (IX+$07)?
   RET NZ          ; 95E8 C0      ; Si Z = 0, Retorna
   CALL L_9AA0       ; 95E9 CD A0 9A   ; llama rutina L_9AA0 (#212# --)
   RET          ; 95EC C9      ; Retorna


Véis que tuve que ir mirando otras pequeñas rutinas de paso y que no están aquí. Intenté poner en los comentarios lo que hacen. Si luego tengo tiempo las subo también.

Como cosa lateral he descubierto que parece que el primer byte de las entradas de los "directorios" de los PNJs (que teníamos como ID o algo así) son, en realidad, acciones o bien valen 00.

Además hay una tabla de datos en A20b con 5 bytes que contiene $0e,$11,$12,$14 y $2c y son acciones (drop in, put in, put on, take out of y throw through). No se modifican nunca, me parece. Ya podemos etiquetarla. Indican acciones cuyos efectos se guardan en el código del segundo objeto utilizado: drop A in B tiene el puntero al código a ejecutar en el objeto B, no en el A.

Y otra cosa. El código 0x4 en los mensajes a imprimir con PrintMsg indica que se ha guardado en la pila el puntero a la cadena a imprimir, justo debajo de la dirección de retorno. Esto se usa en 9728 para imprimir cosas como "Gandalf is carrying the curious map".

Ah, que se me olvida. Como la rutina recibe la acción a realizar en b6e7 y los objetos utilizados en b6e8 y b6e9 y parece estar así todo el tiempo, igual podríamos empezar a renombrar también variables, para mejorar la legibilidad del código. Propongo:

b6e7: CurrentAction
b6e8: CurrentObject1
b6e9: CurrentObject2

O algo similar.

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

Re: Rutinas tratamiento de acciones

Mensajepor pser1 » 27 Nov 2014 20:31

Hola Chema,

bueeno, ahora que ya hemos validado que el fichero con el que trabajamos genera el mismo binario que el original, me voy a poner con los comentarios de los scripts de los personajes
que desafortunadamente están fatal en algunos comandos.
Me bajo tu mensaje y trataré de verlo detenidamente mañana ... eso espero!
muchas gracias

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: Rutinas tratamiento de acciones

Mensajepor Chema » 28 Nov 2014 14:15

Lo prometido es deuda. Las rutinas auxiliares que se utilizan en 950f. Por cierto, me da la impresión de que b6ea creo contiene el Actor que realiza la acción. Igual también podemos ponerle ya nombre a esa variable.

Los nombres que pongo son tentativos y, a veces, horribles. Poned los que os parezcan mejor. Yo, claro, prefiero no tocar el fichero.

Código: Seleccionar todo

; IsActionDoable
; ¿Función que comprueba si una acción sobre unos objetos es válida?.
; Se llama desde 950f y, si retorna Z=1 se imprime "I cannot do that"
;
; La acción se pasa en b6e7 y los objetos en b6e8 y b6e9
; Retorna Z=0 si la acción se puede realizar y Z=1 en caso contrario
                     ; (#208# --)
L_9B44:
   ; Si el objeto primario (b6e8)es $ff ponemos Z=0 y retornamos
   LD A, (L_B6E8)       ; 9B44 3A E8 B6   ; Carga A con (L_B6E8)
   INC A          ; 9B47 3C      ; Incrementa A
   JR NZ, L_9B4C       ; 9B48 20 02      ; Si Z = 0, Salta a L_9B4C
   INC A          ; 9B4A 3C      ; Incrementa A
   RET          ; 9B4B C9      ; Retorna

L_9B4C:    
   ; Si *b6fe == 0 entonces
   LD A, (L_B6FE)       ; 9B4C 3A FE B6   ; Carga A con (L_B6FE)
   AND A          ; 9B4F A7      ; A = A AND A   ; Adecua flags
   JR NZ, L_9B5F       ; 9B50 20 0D      ; Si Z = 0, Salta a L_9B5F

   ;  Si el objeto primario (b6e8) == *b6ea retorna con Z=1
   LD HL, L_B6E8       ; 9B52 21 E8 B6   ; Carga HL con L_B6E8
   LD A, (L_B6EA)       ; 9B55 3A EA B6   ; Carga A con (L_B6EA)
   CP (HL)          ; 9B58 BE      ; Compara A con (HL)
   RET Z          ; 9B59 C8      ; Z = 1?   ; Retorna si es cero

   ;  Si el objeto secundario (b6e9) == *b6ea retorna con Z=1
   LD A, (L_B6E9)       ; 9B5A 3A E9 B6   ; Carga A con (L_B6E9)
   CP (HL)          ; 9B5D BE      ; Compara A con (HL)
   RET Z          ; 9B5E C8      ; Z = 1?   ; Retorna si es cero

L_9B5F:
   ; sino (*b6fe != 0)
   ;  si *b6ff != 0 retorna con Z=0
   LD A, (L_B6FF)       ; 9B5F 3A FF B6   ; Carga A con (L_B6FF)
   AND A          ; 9B62 A7      ; A = A AND A   ; Adecua flags
   RET NZ          ; 9B63 C0      ; Si Z = 0, Retorna

   ;  si el objeto secundario (b6e9) == *b6ea retorna Z=1
   ;  sino retorna Z=0
   LD A, (L_B6E9)       ; 9B64 3A E9 B6   ; Carga A con (L_B6E9)
   LD HL, L_B6EA       ; 9B67 21 EA B6   ; Carga HL con L_B6EA
   CP (HL)          ; 9B6A BE      ; Compara A con (HL)
   RET   



Código: Seleccionar todo


; IsObjectReachable
; Función que devuelve C=1 si el objeto primario (b6e8) no está contenido
; en otro o si lo está en el objeto *b6ea
;
; La función tiene varios puntos de entrada. El segundo en 9c7b es para
; cuando el objeto que miramos no es el primario, sino que viene pasado
; en el registro A.
; El tercero 9c7e es para cuando tanto el objeto como el posible
; contenedor se pasan desde la rutina llamadora en A y HL respectivamente.
; El cuarto en 9c8a es como el anterior, pero no preserva IX, y A queda
; conteniendo el contenedor del objeto que es igual al contenido de HL.
; En este caso si el objeto no está contenido en nada no se considera éxito
; y se devuelve C=0
                     ; (#177# --)
L_9C78:
   ; Cargamos el objeto primario (b6e8)
   LD A, (L_B6E8)       ; 9C78 3A E8 B6   ; Carga A con (L_B6E8)

   ; Apuntamos HL a b6ea                     ; (#196# --)
L_9C7B: LD HL, L_B6EA       ; 9C7B 21 EA B6   ; Carga HL con L_B6EA

   
   ; Si el objeto primario es $ff (nulo) volvemos con C=1                  ; (#178# --)
L_9C7E: CP $FF          ; 9C7E FE FF      ; Compara A con $FF
   SCF          ; 9C80 37      ; Pone a 1 el flag C
   RET Z          ; 9C81 C8      ; Z = 1?   ; Retorna si es cero

   ; Guardamos IX, llamamos a 9c8a, recuperamos IX y regresamos
   PUSH IX          ; 9C82 DD E5      ; Guarda IX
   CALL L_9C8A       ; 9C84 CD 8A 9C   ; llama rutina L_9C8A (#233# --)
   POP IX          ; 9C87 DD E1      ; Recupera IX
   RET          ; 9C89 C9      ; Retorna

L_9C8A:    
   ; Entrada principal   

   ; Tomamos el puntero al objeto en IX
   CALL GetObjPointer2IX    ; 9C8A CD CA 9B   ; llama GetObjPointer2IX devuelve puntero al objeto en IX
   PUSH AF          ; 9C8D F5      ; Guarda AF

   ; Miramos si el objeto no está contenido en nada. Si es el
   ; caso saltamos a 9c9c para salir con C=0
   LD A, (IX+$01)       ; 9C8E DD 7E 01   ; Carga A con (IX+$01)
   CP $FF          ; 9C91 FE FF      ; Compara A con $FF
   JR Z, L_9C9C       ; 9C93 28 07      ; Si Z = 1, Salta a L_9C9C

   ; Eliminamos el AF salvado en pila
   POP IX          ; 9C95 DD E1      ; Recupera IX
   ; Si Es el contenedor el buscado retorna con C=1, sino
   ; vuelve a 9c8a a buscar el contenedor del contenedor...
   CP (HL)          ; 9C97 BE      ; Compara A con (HL)
   JR NZ, L_9C8A       ; 9C98 20 F0      ; si flag Z=0, bucle atrás
   SCF          ; 9C9A 37      ; Pone a 1 el flag C
   RET          ; 9C9B C9      ; Retorna
   
L_9C9C:
   ; Recuperamos A, C=0 y volvemos
   POP AF          ; 9C9C F1      ; Recupera AF
   AND A          ; 9C9D A7      ; A = A AND A   ; Adecua flags
   RET




Código: Seleccionar todo

; Rutina que comprueba si el actor en *b6ea es Bilbo y si puede usar el objeto
; pasado en registro A o bien si dicho objeto no está contenido por nada.
; Devuelve Z=1 si el objeto está disponible para el actor y
; en otro caso se imprime (si es aplicable) "A is carrying B" y
; se retorna con Z=0.
; Se llama sólo desde 950f para comprobar que hablamos de Bilbo y
; que tiene disponibles los objetos que quiere usar el jugador.
L_9728:
   ;Si el objeto es $ff (ninguno) devuelve Z=1
   CP $FF          ; 9728 FE FF      ; Compara A con $FF
   RET Z          ; 972A C8      ; Z = 1?   ; Retorna si es cero

   ; Salva registros
   PUSH IX          ; 972B DD E5      ; Guarda IX
   PUSH IY          ; 972D FD E5      ; Guarda IY
   PUSH BC          ; 972F C5      ; Guarda BC
   ; Guardamos el objeto en B
   LD B, A          ; 9730 47      ; Carga B con A

   ; Si *b6ea (actor) NO es 00 (Bilbo)
   LD A, (L_B6EA)       ; 9731 3A EA B6   ; Carga A con (L_B6EA)
   CP $00          ; 9734 FE 00      ; Compara A con $00
   JR Z, L_973B       ; 9736 28 03      ; Si Z = 1, Salta a L_973B
   
   ; entonces ponemos Z=0
   XOR A          ; 9738 AF      ; A = A XOR A   ; A = 0, borra A, flag Z = 1
   JR L_9776       ; 9739 18 3B      ; Salta a L_9776
L_973B:
   ; sino (El actor es Bilbo)
   ;  si el objeto está contenido en algo
   LD A, B          ; 973B 78      ; Carga A con B
   CALL GetObjPointer2IX    ; 973C CD CA 9B   ; llama GetObjPointer2IX devuelve puntero al objeto en IX
   LD A, (IX+$01)       ; 973F DD 7E 01   ; Carga A con (IX+$01)
   CP $FF          ; 9742 FE FF      ; Compara A con $FF
   JR Z, L_9776       ; 9744 28 30      ; Si Z = 1, Salta a L_9776
   ;    Retomamos el objeto y hacemos IY=YX
   LD A, B          ; 9746 78      ; Carga A con B
   PUSH IX          ; 9747 DD E5      ; Guarda IX
   POP IY          ; 9749 FD E1      ; Recupera IY
   ;   Llamamos a 9c7b IsObjectReachable punto de entrada 2
   CALL L_9C7B       ; 974B CD 7B 9C   ; llama rutina L_9C7B (#196# --)
   ;   Si el objeto no es alcanzable
   JR C, L_9776       ; 974E 38 26      ; Si C = 1, Salta a L_9776
   ;    Miramos quién lo tiene (en A está el contendor)
   CALL GetObjPointer2IX    ; 9750 CD CA 9B   ; llama GetObjPointer2IX devuelve puntero al objeto en IX
   ;    Si lo contiene un animal/persona y Bilbo es visible
   BIT 6, (IX+$07)       ; 9753 DD CB 07 76   ; Esta a 1 el bit 6 de (IX+$07)?
   JR Z, L_9776       ; 9757 28 1D      ; Si Z = 1, Salta a L_9776
   LD A, (L_C11B + $07)    ; 9759 3A 22 C1   ; apunta al byte 7 (flags) del objeto $00 - Bilbo
   BIT 7, A       ; 975C CB 7F      ; Esta a 1 el bit 7 de A?
   JR Z, L_9776       ; 975E 28 16      ; Si Z = 1, Salta a L_9776
   ;      Guardamos la cadena que nombra al contenedor y al
   ;       objeto en la pila, para usarlos en el mensaje
   ;       a través del código especial 0x4
   LD L, (IY+$08)       ; 9760 FD 6E 08   ; Carga L con (IY+$08)
   LD H, (IY+$09)       ; 9763 FD 66 09   ; Carga H con (IY+$09)
   PUSH HL          ; 9766 E5      ; Guarda HL
   LD L, (IX+$08)       ; 9767 DD 6E 08   ; Carga L con (IX+$08)
   LD H, (IX+$09)       ; 976A DD 66 09   ; Carga H con (IX+$09)
   PUSH HL          ; 976D E5      ; Guarda HL
   ;      Imprimimos "A is carrying B"
   LD HL, L_AFE4       ; 976E 21 E4 AF   ; apunta a mensaje "[0x04] is carrying[0x04][0x15]"
   CALL PrintMsg       ; 9771 CD DD 72   ; llama rutina PrintMsg
   ; Pone Z=0
   OR $01          ; 9774 F6 01      ; Hace OR lógico de A con $01
   ;    fin si
   ;    fin si
   ; fin si
   ;fin si
   
   ;Recuperamos registros y retornamos
L_9776:    
   POP BC          ; 9776 C1      ; Recupera BC
   POP IY          ; 9777 FD E1      ; Recupera IY
   POP IX          ; 9779 DD E1      ; Recupera IX
   RET          ; 977B C9      ; Retorna




Código: Seleccionar todo

; Rutina que busca el código pasado en A (una acción) en la tabla de 5 entradas
; en A20b. Devuelve Z=1 si encontrado. No modifica más registros que A
; En la tabla A20b están los códigos de acción correspondientes a:
; drop _ in _, put _ in _, put _ on _, take out of _ y throw _ through _
; IsActionInTableA20b
L_A1D0:
   PUSH HL          ; A1D0 E5      ; guarda HL
   PUSH BC          ; A1D1 C5      ; guarda BC
   LD B, $05       ; A1D2 06 05      ; contador bytes a comparar (en realidad 6)
   LD HL, L_A20B       ; A1D4 21 0B A2   ; apunta al inicio de taba de datos
   LD A, (L_B6E7)       ; A1D7 3A E7 B6   ; A toma el valor de L_B6E7 (¿código de acción a ejecutar?)
L_A1DA: CP (HL)          ; A1DA BE      ; es igual al byte apuntado de la tabla?
   JR Z, L_A1E0       ; A1DB 28 03      ; si, salir
   INC HL          ; A1DD 23      ; incrementa puntero a tabla
   DJNZ L_A1DA       ; A1DE 10 FA      ; decrementa contador, si no cero sigue buscando
L_A1E0: POP BC          ; A1E0 C1      ; recupera BC
   POP HL          ; A1E1 E1      ; recupera HL
   RET          ; A1E2 C9      ; retorna



Esta ya está documentada pero no tiene nombre...

Código: Seleccionar todo

                     ; recibe puntero a objeto en IX, código en A
                     ; (#121# OK) devuelve en IX puntero a rutina a ejecutar
L_9B81:
   PUSH DE          ; 9B81 D5      ; guarda DE
   LD D, A          ; 9B82 57      ; guarda A
   LD A, (IX+$00)       ; 9B83 DD 7E 00   ; toma primer byte apuntado por IX
        ADD A, $10       ; 9B86 C6 10      ; le suma $10
   LD E, A          ; 9B88 5F      ; lo pone como byte bajo
   LD A, D          ; 9B89 7A      ; recupera A
   LD D, $00       ; 9B8A 16 00      ; byte alto a cero (DE=offset)
   ADD IX, DE       ; 9B8C DD 19      ; recalcula IX sumandole el offset
   CALL FindPointer    ; 9B8E CD BD 9D   ; busca puntero con código A e inicio tabla en IX
   POP DE          ; 9B91 D1      ; recupera DE
   RET          ; 9B92 C9      ; retorna



A ver si consigo retomar ahora 7af5, que hace cosas muy raras al final, y con ella 99c6. Otro punto interesante es ver dónde se llama a la rutina que realiza las acciones 950f y dónde se les da valor a las variables que se uan. Eso nos debería ir llevando al bucle principal del juego y a la parte que parsea la instrucción de usuario.

Ah, y a ver si puedo retomar lo de los scripts para los flecos que quedan sueltos...

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

Re: Rutinas tratamiento de acciones

Mensajepor pser1 » 28 Nov 2014 15:12

@Chema

lo prometido será deuda, pero a mi me estás atando a los remos como si estuviera en galeras -507
muchísimas gracias por tanta y tan detallada información -drinks
me bajo este mensaje para el fin de semana (si me dejan)
El anterior lo tengo ya bien leído, pero estoy corrigiendo algunos lapsus (por copiar y pegar) en los comentarios de los scripts, he diferenciado la tabla de acciones
Me falta actualizar los comentarios en la rutina monstruosa #95# y veré como ir poniendo etiquetas a las variables. Este es mi sueño, o lo que me quita el sueño -507

como siempre -thanks

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 (assembler Z80 / Spectrum)

Mensajepor pser1 » 01 Dic 2014 16:39

Hola Chema ... y demás por supuesto!!
adjunto texto creado mientras buscaba las repercusiones de la rutina $7F10 y sus colegas

De paso, empiezo a tener claro que la parte de datos formada por las 8 entradas de 25 bytes, contiene:
1 bye de Personaje
12 punteros a palabras tokenizadas posiblemente entradas por el usuario (órdenes introducidas) ya que parece que pueden meterse varias separándolas con ;
En $7B9E se accede a puntos concretos de la entrada seleccionada (4,14,6,20) de los cuales usan como mucho 2 de ellos
Nos falta encontrar donde se parsea la entrada del usuario y como la tokeniza en estos búferes largos ...
También están las llamadas a ambas entradas

Bueno, ahí va el esquema pelado de llamadas a rutinas ... anidadas
Empezaré a estudiarlas / comentarlas por orden de aparición en esta lista.
Si alguien se anima, puede empezar por abajo e ir subiendo hasta que nos encontremos ... -nb
Y si algún valiente quiere vencer al Dragón, que ose pillar directamente la $980E alias (#221# ), tiene mi bendición por adelantado -507

saludos
pere

$7F10 como entrada
llama $7EFF
es final
fin_$7F10

Y se acabó, lo que pasa es que la rutina $7F1A también llama a $7EFF y me he dejado enganchar por ella
Este es el resultado (apabullante) de querer tirar del hilo hasta el ovillo ...

$7F1A como entrada
llama $79B6
llama $79A9
es final

llama $7B9E
llama 4x $7CAC
llama $71F3
llama 5x $722E
llama $72D3
llama $96B3
llama $980E alias (#221#) monstruosamente grande ... la dejaría en pepitoria para mas adelante
contiene una llamada a $79B6 = recursividad!
fin_$7B9E

llama $7B78
es final

llama $7AA1
es final

llama $7A14
llama $7CCB
llama $7CFC
llama $7CC9
JP (IY)
llama $94D6
llama $A1D0
es final
fin_$7CFC
fin_$7CCB

llama $7ABA
llama $7ACC
es final
llama $9E95
es final

llama $7AB8
es final
fin_$7A14

llama $7A73
llama $9DD9
llama $71F3
llama 5x $722E
fin_$7A73

fin_$7B96

llama $7AED
llama ExecuteAction
es final

llama $7F60
es final
fin_$7F1A


Llamadas a estas dos entradas:
llamadas a $7F10
desde $980E punto $9874
y no hay mas, es decir depende de la siguiente!!!

llamadas a $7F1A
desde $980E punto $98A9 esto crea una referencia circular, ¿plan 'recursivo' tal vez?
desde $A8AB punto $A8B6
desde $A8F6 punto $A8FD

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: Scripts Z80 - Conversión a 6809

Mensajepor Chema » 01 Dic 2014 23:21

Bueno!... sí que es monstruosa.... He tenido poco tiempo estos días, pero a ver si puedo echar un vistazo pronto a alguna.

Genial que ya tengas una idea de cómo se usa ese buffer... Tiene lógica.

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

Re: Scripts Z80 - Conversión a 6809

Mensajepor pser1 » 02 Dic 2014 20:03

Hola,
he hecho unas pequeñas modificaciones (dos llamadas olvidadas)
He marcado las repeticiones para evitar eso mismo ...
De paso he puesto algunos nombres super-Crípticos a los párrafos que ya he revisado ... otro día los pondré aquí para que los reviséis

saludos
pere


Código: Seleccionar todo

$7F10 como entrada          = FindActorIn8x25
   llama $7EFF              = PointActorIn8x25
      es final
fin_$7F10

Y se acabó, lo que pasa es que la rutina $7F1A también llama a $7EFF y me he dejado enganchar por ella
Este es el resultado (apabullante) de querer tirar del hilo hasta el ovillo ...

$7F10 como entrada ---
   llama $79B6
      llama $79A9          = InitAreaD12Part1
         es final

      llama $7B9E            = ###ProcessUserCommand
         llama 4x $7CAC      = ###ActionWord2Buffer
         llama $71F3       = ###DoesActionMatch
            llama 5x $722E = ###Do2WordsMatch
         llama $72D3       = ###NoName01 ---> hay que averiguar que pintan L_B71B y L_B6FA
         llama $96B3         = ###ProcessBilboEvents
            llama $980E alias (#221#) monstruosamente grande ... la dejaría en pepitoria para mas adelante
         contiene una llamada a $79B6 = recursividad!
      fin_$7B9E   - - -
      
      llama $7B78            = ###TestBits
         es final      

      llama $7AA1
         llama L_7ACC
            es final
         llama condicional a L_9E95
            es final

      llama $7A14
         llama $7CCB
            llama $7CFC
               llama $7CC9
                  JP (IY)
               llama $94D6
                  llama $A1D0
                     es final
            fin_$7CFC   - - -
         fin_$7CCB   - - -
                     
         llama $7ABA
            llama $7ACC --- VISTO ANTES
               es final
            llama $9E95 --- VISTO ANTES
               es final

         llama $7AB8
            es final
      fin_$7A14   - - -
      
      llama $7A73
         llama $9DD9
            llama $71F3 --- VISTO ANTES
               llama 5x $722E  --- VISTO ANTES
      fin_$7A73   - - -
   
   fin_$7B96   - - -

   llama $7AED
      llama ExecuteAction
         es final
      
   llama $7F60
      es final

fin_$7F10   - - -


llamadas a $7F10
   desde $980E punto $9874
   y no hay mas, es decir depende de la siguiente!!!

llamadas a $7F1A
   desde $980E punto $98A9 esto es otra referencia circular, ¿plan recursivo tal vez?
   desde $A8AB punto $A8B6
   desde $A8F6 punto $A8FD



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: Scripts Z80 - Conversión a 6809

Mensajepor Chema » 02 Dic 2014 21:25

Uau eso tiene buena pinta... buen trabajo 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 5 invitados