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:

Scripts Z-80 en The Hobbit

Mensajepor Chema » 05 Nov 2014 23:50

A mi no me parece tan raro que se usen tablas de saltos. Es algo complicado, pero a base de ir encontrando rutinas que tengan medio sentido (como las de Gollum de antes) se puede ir desentrañando la cosa. Siempre será más fácil si las rutinas imprimen mensajes conocidos. Yo empezaría por ahí.

Y eso si no utiliza algún sistema de scripts, que todo es posible. Es la manera más compacta y portable de implementar la lógica de algunas cosas.

Edito: para ilustrar esto imagínate que en un script el código 13 significase JSR y saltase a la si rutina indicada por los dos bytes siguientes y el código 00 fuese fin de script. En el trozo de datos que pones en dos ocasiones tienes ese esquema para saltar a las rutinas localizadas. La tercera tiene 10 CA 43 dirección 00. no sigue el patrón, pero el 43 podría se un salto condicional o algo similar...

No digo que sea así, es solo un ejemplo de lo que podéis encontrar... Por suerte eso significa que tiene que haber una tabla con rutinas que implementen cada código del script y una rutina que se puede identificar que toma el código y si no es cero lo interpreta.

Fácil no es, pero eso lo hace interesante... -grin

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 » 06 Nov 2014 00:21

@Chema

esta ya parece como utilizar un intérprete de comandos ... como el de Basic sin ir mas lejos, que toma un token de memoria, lo decodifica y llama una rutina tras buscar en la tabla de tokens el lugar de despacho que le tiene asignado. Y luego a por el siguiente.
Pero estamos hablando de ensamblador, no es necesario darle tres vueltas de rosca a la cabeza para mirar atrás -507
Me imaginaba que en este lenguaje se procuraba ser lo mas lineal posible para obtener el máximo de velocidad. Así lo usaba antes y sigo ahora con el mismo criterio. Simple y estructurado mientras se pueda.
Nota: Solo he usado 6809-6309, lo del Z-80 ... es casi una novedad para mí, nunca he tenido un ordenador con esta CPU
En cuanto a este programa, me parece rocambolesco el método empleado para codificar los mensajes y no digamos ya el de las palabras ... solo nos faltaría una exhibición de código automodificable y de scripts -banghead

En fin, mañana será otro día
Ya comentaremos lo que se vaya descubriendo ...

muchas gracias, una vez mas, por tus ayudas

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

Mensajepor Chema » 06 Nov 2014 00:26

Uy no es nada fuera de lo común, no creas... Skooldaze hace eso precisamente. Toda la IA de los personajes se implementa a base de scripts que se ejecutan como multitarea cooperativa. Es muy eficiente desde el punto de vista del uso de memoria y muy rápido al ejecutar también.

Pero bueno, igual no hace nada de eso... Poco a poco.

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 » 06 Nov 2014 12:24

Vale. Casi seguro que puedes olvidarte del tema de los scripts. Mire en el archivo de la versión de Oric y no encuentro coincidencias que hagan pensar que se han empleado.

A ver si tengo tiempo y me descargo tu versión y echo un vistazo a las rutinas.

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 » 11 Nov 2014 16:03

Hola Chema,

muchas gracias!
Yo os pediría, a los que seguís este hilo, como ya he hecho hace poco a race8086, que intentárais mirar el documento con los párrafos huérfanos que subí días atrás.

Teníamos 62 y parece que hemos encontrado ya 56, todo un éxito si es correcto -drinks
A pesar de ello, no quedan tres cuestiones peliagudas:

- ¿Como podemos solventar las 6 que faltan por encontrar?
- ¿Desde dónde deben llamarse los 4 mensajes aparentemente huérfanos?
- El bloque de datos (no los objetos que ya sabemos como están estructurados, por fin) contiene apuntadores a muchos de los párrafos
antes huérfanos, pero no entendemos como están estructurados ... así es imposible pasar la información al documento desensamblado
con el que nos estamos peleando. -please -nb -thanks

saludos y gracias por vuestra colaboración
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 (assembler Z80 / Spectrum)

Mensajepor Chema » 22 Nov 2014 21:09

Vale chicos, creo que se va confirmando. Tenía que haber alguna manera de poner scripts para que los PNJs hiciesen cosas por su cuenta (cosa por la que el juego es famoso) y creo que los tenemos. Y están en la zona donde encontrásteis los punteros a las huérfanas.

Como ya dije (creo) la tabla en CACB tiene entradas con este formato (lo que he ido viendo hasta ahora tirando del hilo de la rutina #221#)

Código: Seleccionar todo

BYTE 0: Código de entrada, 0=inactiva, ff=fin de tabla, otra cosa ID de un objeto (los PNJs del juego tienen entradas)
BYTE 1: Tamaño de una serie de entradas apuntadas por WORD2 (como si fuese el "script")
WORD1: Apunta a la entrada dentro del "script" que se está "ejecutando" en este momento
WORD2: Puntero a a serie de entradas o "script"
BYTE2: desconocido por ahora


El problema es que las entradas en la zona de huérfanas C82D no son todas iguales... y ahí hay que empezar a descifrar... Por ahora creo que tengo algunas... Todas empiezan por un código:

Entradas con códgo cero: $00 direccion byte direccion... $ff. Todas las direcciones son dentro de esta zona de memoria, ejemplos:

Código: Seleccionar todo

; C82D 00   
; C82E C842
; C830 0F
; C831 C89E
; C833 FF

; C834 00
; C835 C871
; C837 0F
; C838 C89E      
; C83A FF

; C83B 00
; C83C C895
; C83E 0F      
; C83F C89E
; C841 FF


Pero hay más tipos:
$xE word : copia word en el WORD1 de la entrada de la tabla de CACB, algo así como un jump
$xF byte : Saca un aleatorio entre 0 y byte (si byte es menor que el máximo) y copia la direccion contenida esas entradas más adelante en WORD1. Considera las entradas de 3 bytes (ID, dirección)
$04 objeto: Actualiza punteros de WORD1 para que apunte tras esta entrada y hace algo con el objeto que no he descifrado, pero pasa por hacerlo aparecer y eso...
$05 ???? : Salta a rutinas que no he descifrado, pero acaban haciendo el CallSubroutineHL
$14 objeto dirección: Hace como la $04 con el objeto, pero además pone WORD1 a dirección.

Algunos ejemplos de entradas:

Código: Seleccionar todo

; C871 04
; C872 06

; C873 14
; C874 30
; C875 7A      
; C876 C8

; C877 0E
; C878 73
; C879 C8

; C87A 04      
; C87B 01
; C87C 14
; C87D 30
; C87E 83
; C87F C8

; C880 0E
; C881 7C      
; C882 C8

; C883 04
; C884 08

; C885 14
; C886 30
; C887 8C      
; C888 C8

; C889 0E
; C88A 85
; C88B C8

; C88C 04      
; C88D 09


Queda mucho por hacer, como véis... pero poco a poco a ver si descubrimos cómo es esto, porque creo que es importante.

Se me olvidaba. La acción principal está en los 4 bits más bajos del código de la entrada, los 4 más altos marcan variantes (como $14 y $04 antes). Los que tienen punteros a las funciones huérfanas son las variantes $x3, y tienen todas un byte a 0 detrás (no sé si todas ni por qué):

Código: Seleccionar todo


; C8D6 03
; C8D7 FE A4      ; apunta a huérfana $A4FE
; C8D9 00

; C8C8 03      
; C8C9 F5 A4      ; apunta a huérfana $A4F5
; C8CB 00

; C8FB 23
; C8FC 1C A5      ; apunta a huérfana $A51C
; C8FE 00      

; C8FF 13
; C900 40 A6      ; apunta a huérfana $A640
; C902 00



El código es difícil de seguir... a ver si puedo ir averiguando más..

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 00:23

Pude descifrar algunas cosas más, pero poco... Esta parte es complicada de narices. Da la impresión de estár hecha a base de ir parcheando según fue haciendo falta :/

En la zona de huérfanas están los scripts (como dije) y en la zona que empieza en CACB se tienen los datos de los scripts en ejecución. Me da la impresión de que los personajes no jugadores tienen (o pueden tener) una entrada en CACB asociada a ellos que les indica cómo actuar.

Los comandos del script (1er byte) tienen en el nibble alto flags que indican:
bit 4= 1: Existe un parámetro word adicional a poner en cacb.w1 (donde se guarda la dirección del punto de ejecución actual)-> JUMP(SCRIPT_INST)
bit 5= 1: Reset tras ejecutar o ejecutar sólo una vez (Pone 0 en el byte 0)
bit 6= 0: Si *b6f4==1 procesa a través de la rutina L_7F1A (sin descifrar).

Las entradas que llevo descifradas son:

Código: Seleccionar todo

0010 HAZALGO(OBJETO,BYTE,BYTE)
$02 byte byte byte
Llama a la ruitina que hace algo con el objeto en L_99C6.
Se usan L_B6E7/8/9 para pasar los tres parámetros tipo byte

0011 EJECUTA_RUTINA(dirección)
$03 word
Hace un CALL a la rutina especificada en el parámetro


0100 HAZALGO(objeto,$ff,$ff)
$x4 byte
Llama a la ruitina que hace algo con el objeto en L_99C6.
Se usan L_B6E7/8/9 para pasar los tres parámetros tipo byte


1100 REWIND_AND_SET_ENTRY(CODIGO)
$0c byte
Busca la primera entrada de la tabla CACB para este objeto (cacb.b0)
Toma el script asociado cacb.w2 y busca una entrada ahí con código pasado como
parámetro. Pone a esa entrada el punto de ejecución (cacb.w1).

1110 JUMP(SCRIPT_INST)
$0e   WORD
Salta al punto indicado por el parámetro dentro del script. Pone allí el punto de ejecución
(cacb.w1)

1111 JUMP_RANDOM(MAX_JUMP)
$0f byte
Avanza un número aleatorio (de 0 a parámetro) de entradas de 3 bytes en el script actual
(cacb.w2) sin pasarse del máximo (cacb.b1) y pone el punto actual de ejecución (cacb.w1) allí


Los datos de la zona de huérfanas coinciden con esto y tienen sentido. Me faltan varias cosas por mirar, por ejemplo qué se hace en L_99C6. Además tengo que seguir la traza de algunos códigos que faltan, sobre todo el 00. Las entradas 00 son del tipo 00 puntero byte puntero byte puntero... FF y no tengo pillado dónde se interpretan ni cómo se tratan.

Si alguien puede ayudar con la rutina que hace todo el trabajo (#221#) L_980E a ver qué averigua sería genial. Tengo casi todas las rutinas auxiliares pilladas, pero me faltan algunas cosas.

Por ejemplo esta parte:

Código: Seleccionar todo

L_9868:
   ; Si el objeto que estamos analizando está contenido en otro
   ; Salta a L_9b16
   ; Lo que se hace es: *b6e9=ff, *b6e8=(IX+1) Contenedor
   ; IX=GetObjPointer2IX((IX+1));
   ; Mira sus flags:
   ; Si (!broken y !animal y !closed) entonces
   ;  *be67=$37
   ;  llama a 99c6 (procesa si hay que poner xxx enters o xxx appears y mucho más)
   ; Salta a procesar siguiente registro
   ; finsi


Sobre todo la subrutina 99c6

Y hay una parte que llama a rutinas como la 7f10 que llama a L_7EFF #158# pero salvando registros. Parece que recorre 8 entradas en datos en B738 de 25($19) en 25 buscando el que sea igual a *b6ea. Retorna Z=1 si lo encuentra, Z=0 sino. HL Acaba apuntando al sitio, si lo ha encontrado o no se modifica si no. Y también se salta a 7f1a. Toda esta parte no la entiendo, por ejemplo.

Además también estaría bien ir poniendo las entradas de los scripts de un modo que fuese más fácil de seguir (nombres de objetos en vez de su código, nombres de rutinas que ayudasen a entender qué se quiere hacer en vez de punteros, nombres a las diferentes acciones del script...).

Cuando tenga algo de tiempo sigo con ello... si no me estalla la cabeza :)

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 » 25 Nov 2014 12:50

Hola Chema

y tu atacando de nuevo, no te cansas, ¿eh? -drinks
Muchísimas gracias por tan valiosas aportaciones ... la parte "dura" es que me vuelvo majara para ir actualizando el fichero de trabajo.
Voy a subirlo de nuevo en el hilo grande para que vayáis viendo vuestros descubrimientos incorporados.
Verás que el Area $CACB tiene este comentario previo:
17 Bloques de datos de 7 bytes de longitud, para los PERSONAJES
Y cada uno de ellos tiene su personaje asociado
Echadle una ojeada, no sea que me exceda yo, llevado por el entusiasmo, a poner comentarios no verificados ...
Estoy peleándome con las estructiuras de datos DATABLK3 (#D46#), L_CACB (#D47#) y L_C82D (#D45#)
tratando de separar bloques lógicos, pero se funde la lógica o tal vez aplico lógica borrosa, no se como decirlo ... hay muchos bloques que no están nada claros -banghead
En fin sigo un rato mas y a las 14h subiré la versión de fichero tal como esté.
Seguimos en contacto

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

Mensajepor Chema » 25 Nov 2014 15:25

A ver, que intento ser algo más claro ahora que he visto un par de cosas más.

Efectivamente el área de CACB contiene entradas de 7 bytes una por personaje. Te pego aquí:

Código: Seleccionar todo

L_CACB:
   DB $3E           ; Gandalf     
   DB $07             
   DW $C8BA            
   DW $C8A1           
   DB $05               

   DB $3F           ; Thorin       
   DB $02           
   DB $C8EC             
   DB $C8E2          
   DB $06         
   
   DB $40            ; Elf Wood     
   DB $02               
   DB $C91D               
   DB $C913
   DB $01
   
   DB $43         ; Vicious Warg
   DB $00     
   DW $C928         
   DW $C924               
   DB $00               

L_CAE7:
   DB $00            ; Set to $42 Butler in #49#
   DB $02               
   DB $C950               
   DB $C946               
   DB $01
   
   DB $41         ; Elrond
   DB $02     
   DW $C99A               
   DB $C990               
   DB $05
   
   DB $44           ; Gollum       
   DB $01,
   DW $C9F7
   DB $C9F0               
   DB $03               

L_CAFC:
   DB $00            ; Set to $46 Bard in #52#
   DB $01
   DW $C9DE
   DB $C9D7               
   DB $03               

L_CB03:          ; Set to $3c Dragon in #52#
   DB $00            
   DB $01
   DB $C9B8     
   DB $C9B1               
   DB $00               

   DB $47            ; Hideous Troll   
   DB $01
   DB $CA3B     
   DB $CA34               
   DB $01
   
   DB $48         ; Vicious Troll
   DB $01
   DB $CA3B
   DB $CA34               
   DB $01
   
   DB $3D         ; Nasty Goblin
   DB $01
   DB $C842     
   DB $C82D               
   DB $00               

   DB $45            ; Hideous Goblin
   DB $01
   DB $C842     
   DB $C82D               
   DB $00               

   DB $4B          ; Vicious Goblin        
   DB $01
   DB $C871
   DB $C834               
   DB $00               

   DB $49         ; Horrible Goblin            
   DB $01
   DB $C895     
   DB $C83B               
   DB $00               

   DB $4A            ; Mean Goblin   
   DB $01
   DB $C895
   DB $C83B               
   DB $00               

   DB $4C         ; Disgusting Goblin      
   DB $01
   DB $C895
   DB $C83B               
   DB $00               

   DB $FF               


La estructura es la siguiente:

Código: Seleccionar todo

   DB $3E      ; b0 Gandalf     
   DB $07              ; b1 Tamaño del directorio -1 (entradas de 3 bytes, o sea un total de (7+1)*3=24 bytes)
   DW $C8BA         ; w1 Puntero a entrada de script actual (siguiente comando de script a ejecutar)   
   DW $C8A1        ; w2 Puntero al directorio
   DB $05              ; b2 Aún sin descifrar


El "directorio" es una entrada en la zona de huérfanas como la siguiente :

Código: Seleccionar todo

;======= Directorio de Gandalf ==========
; C8A1 00
; C8A2 C2
; C8A3 C8
; C8A4 00      
; C8A5 D0
; C8A6 C8
; C8A7 00
; C8A8 D4 C8
; C8AA 00      
; C8AB DA C8 00
; C8AE DE C8
; C8B0 1D      
; C8B1 7F
; C8B2 CA 30 73
; C8B5 CA
; C8B6 0F 5E      
; C8B8 CA FF


Cada entrada tiene 3 bytes (código, puntero) acabado en $ff y el directorio se usa en las instrucciones de script que tienen el nibble bajo a $c o a $f que comenté en mi post anterior.

Tras el directorio de cada personaje están sus scripts (aunque pueden compartirse, como con los Trolls). Si te fijas en el la entrada en CACB de Gandalf inicialmente w1 vale $C8BA, que es:
; C8BA 02
; C8BB 1D
; C8BC 03
; C8BD 00

Un comando 02 con tres parámetros, 1D, 03 y 00. Cada iteración del bucle se ejecuta un comando y se pasa al siguiente al no ser que dicho comando incluya un salto. El siguiente se apunta en W1 para ejecutar la próxima vez. Entre todos los comandos están las llamadas a las huérfanas.

He estado separando todo ese bloque en comandos (te lo pego aquí como código). Quería ir viendo qué parámetros son punteros dentro de esta área (otro comando) o a huérfanas porque tendréis que ponerles etiquetas. Todo va teniendo sentido excepto alguna entrada que tengo sin descifrar aún (código 0x7 que no lleva parámetros). También he mirado algunas de las huérfanas que contienen mensajes para verificar que corresponden a los personajes.

Mira una entrada del "Vicious warg" que ejecuta una rutina huérfana:
; C933 03
; C934 D1 A5 ; 050 - apunta a huérfana $A5D1 (the vicious warg run around)
; C936 00

; C937 0E
; C938 28
; C939 C9

Comando 03, ejecutar. Llama a $a5d1 que entre otras cosas se encarga de imprimir el mensaje "The vicious warg runs around" o algo así. El 0 en c936 aparece siempre en este tipo de entradas y no sé para qué se utiliza (creo que simplemente sobra). La siguiente entrada es un comando $0e (JUMP), luego, tras ejecutar este comando $0e (la huérfana) pone el puntero W1 a c928 para que se ejecute la siguiente vez. Deberían sustituirse por etiquetas.

También quería sustituir o comentar las entradas poniendo el comando y lo que son los parámetros, sobre todo si son punteros, pero no he tenido tiempo.

Todo parece correcto, pero queda trabajo por hacer... a ver cuándo tengo un rato.

Código: Seleccionar todo

; ============ Directorio de los Goblins Vicious y Horrible ==============
; C82D 00   
; C82E C842
; C830 0F
; C831 C89E
; C833 FF

; C834 00
; C835 C871
; C837 0F
; C838 C89E      
; C83A FF

; ============ Directorio de los Trolls Mean y Disgusting ==============
; C83B 00
; C83C C895
; C83E 0F      
; C83F C89E
; C841 FF

; C842 02
; C843 10
; C844 06      
; C845 FF

; C846 14
; C847 30
; C848 4D
; C849 C8

; C84A 0E
; C84B 46      
; C84C C8

; C84D 04
; C84E 09

; C84F 14
; C850 30
; C851 56      
; C852 C8

; C853 0E
; C854 4F
; C855 C8

; C856 04      
; C857 0A

; C858 14
; C859 30
; C85A 5F
; C85B C8

; C85C 0E
; C85D 58
; C85E C8

; C85F 02
; C860 0C
; C861 06
; C862 FF      

; C863 04
; C864 02

; C865 14
; C866 30
; C867 6C
; C868 C8      

; C869 0E
; C86A 65
; C86B C8

; C86C 04
; C86D 01

; C86E 0E
; C86F 42      
; C870 C8

; C871 04
; C872 06

; C873 14
; C874 30
; C875 7A      
; C876 C8

; C877 0E
; C878 73
; C879 C8

; C87A 04      
; C87B 01

; C87C 14
; C87D 30
; C87E 83
; C87F C8

; C880 0E
; C881 7C      
; C882 C8

; C883 04
; C884 08

; C885 14
; C886 30
; C887 8C      
; C888 C8

; C889 0E
; C88A 85
; C88B C8

; C88C 04      
; C88D 09

; C88E 14
; C88F 30
; C890 71
; C891 C8

; C892 0E
; C893 8E      
; C894 C8

; C895 04
; C896 24

; C897 04
; C898 0F      

; C899 04
; C89A 30

; C89B 0E
; C89C 95
; C89D C8
;?
; C89E 04      
; C89F 30

; C8A0 07

;======= Directorio de Gandalf ==========
; C8A1 00
; C8A2 C2
; C8A3 C8
; C8A4 00      
; C8A5 D0
; C8A6 C8
; C8A7 00
; C8A8 D4 C8
; C8AA 00      
; C8AB DA C8 00
; C8AE DE C8
; C8B0 1D      
; C8B1 7F
; C8B2 CA 30 73
; C8B5 CA
; C8B6 0F 5E      
; C8B8 CA FF

; C8BA 02
; C8BB 1D
; C8BC 03      
; C8BD 00

; C8BE 02
; C8BF 10
; C8C0 05
; C8C1 FF

; C8C2 04      
; C8C3 24

; C8C4 14
; C8C5 13
; C8C6 D0
; C8C7 C8

; C8C8 03      
; C8C9 F5 A4      ; apunta a huérfana $A4F5 (Whats this?)
; C8CB 00

; C8CC 04
; C8CD 0C

; C8CE 04      
; C8CF 1D

; C8D0 04
; C8D1 24

; C8D2 04
; C8D3 0D

; C8D4 04      
; C8D5 24

; C8D6 03
; C8D7 FE A4      ; apunta a huérfana $A4FE
; C8D9 00

; C8DA 04      
; C8DB 24

; C8DC 04
; C8DD 1D

; C8DE 04
; C9DF 10

; C8E0 0F      
; C8E1 04

;======= Directorio de Thorin ==========
; C8E2 00
; C8E3 EC C8
; C8E5 1D
; C8E6 7F      
; C8E7 CA 0F 5E   
; C8EA CA FF

; C8EC 12      
; C8ED 27
; C8EE 00
; C8EF FF
; C8F0 F5
; C8F1 C8

; C8F2 0E
; C8F3 EC      
; C8F4 C8

; C8F5 12
; C8F6 13
; C8F7 02
; C8F8 FF      
; C8F9 FF
; C8FA C8

; C8FB 23
; C8FC 1C A5      ; apunta a huérfana $A51C
; C8FE 00      

; C8FF 13
; C900 40 A6      ; apunta a huérfana $A640 (Wheres the thief?)
; C902 00
; C903 0C
; C904 C9      

; C905 04
; C906 FF

; C907 04
; C908 24

; C909 0E
; C90A EC      
; C90B C8

; C90C 03
; C90D 57 A6      ; apunta a huérfana $A657 (Waits, get us out of this one thief! and sing about gold)
; C90F 00

; C910 0E EC      
; C912 C8

;======= Directorio de Elf Wood ==========
; C913 00
; C914 1D
; C915 C9
; C916 0F      
; C917 1D
; C918 C9
; C919 1D
; C91A 7F CA
; C91C FF
 
; C91D 04      
; C91E 30

; C91F 04
; C920 24

; C921 0E
; C922 1D      
; C923 C9

;======= Directorio de Vicious Warg ==========
; C924 00
; C925 28 C9
; C927 FF

; C928 14      
; C929 0F
; C92A 2F
; C92B C9

; C92C 0E
; C92D 28
; C92E C9      

; C92F 14
; C930 27
; C931 3A
; C932 C9

; C933 03
; C934 D1 A5      ; 050 - apunta a huérfana $A5 (the vicious warg run around)
; C936 00

; C937 0E 28
; C939 C9

; C93A 14      
; C93B 24
; C93C 41
; C93D C9

; C93E 0E
; C93F 28
; C940 C9      

; C941 04
; C942 FF

; C943 0E 28
; C945 C9

; ============ Directorio de Butler ==============
; C946 00      
; C947 C950
; C949 0F
; C94A 60
; C94B C9
; C94C 1D      
; C94D 7F
; C94E CA
; C94F FF


; C950 02
; C951 26
; C952 08
; C953 0F      

; C954 02
; C955 10 08
; C957 FF

; C958 02      
; C959 0C
; C95A 08
; C95B FF

; C95C 02
; C95D 25
; C95E 08      
; C95F 0F

; C960 14
; C961 30 67
; C963 C9

; C964 0E 60      
; C966 C9

; C967 02
; C968 10
; C969 13
; C96A FF      

; C96B 02
; C96C 21 14 FF

; C96F 04
; C970 30

; C971 02
; C972 0C
; C973 13
; C974 FF

; C975 02
; C976 10 0C      
; C978 FF

; C979 04
; C97A 30

; C97B 02
; C97C 13      
; C97D 13
; C97E FF

; C97F 02
; C980 2C
; C981 13
; C982 0C      

; C983 04
; C984 30

; C985 02
; C986 0C
; C987 0C
; C988 FF      

; C989 14
; C98A 30 50
; C98C C9

; C98D 0E
; C98E 50      
; C98F C9

; ============ Directorio de Elrond ==============
; C990 00
; C991 C9A0
; C993 0F
; C994 AA      
; C995 C9
; C996 1D
; C997 7F
; C998 CA FF

; C99A 13       
; C99B 25 A5      ; apunta a huérfana $A525
; C99D 00
; C99E A4
; C99F C9

; C9A0 03      
; C9A1 E5 A9      ; apunta a huérfana $A9E5
; C9A2 A9

; C9A3 00
; C9A4 04
; C9A5 FF

; C9A6 14      
; C9A7 FF
; C9A8 9A
; C9A9 C9

; C9AA 14
; C9AB 0F
; C9AC 9A      
; C9AD C9

; C9AE 0E AA
; C9B0 C9

; ============ Directorio de Dragon ==============
; C9B1 00
; C9B2 B8      
; C9B3 C9
; C9B4 0F
; C9B5 CD C9 FF

; C9B8 13      
; C9B9 DC A6       ; apunta a huérfana $A6DC (In the distance you see... the dragon descends...)
; C9BB 00
; C9BC C1
; C9BD C9

; C9BE 0E      
; C9BF B8
; C9C0 C9

; C9C1 13
; C9C2 98 A6      ; apunta a huérfana $A698
; C9C4 00      
; C9C5 D2 C9

; C9C6 13
; C9C8 C2 A6      ; apunta a huérfana $A6C2
; C9CA 00      
; C9CB D2 C9

; C9CD 04
; C9CE 2D

; C9CF 0E
; C9D0 B8 C9      

; C9D2 04
; C9D3 24

; C9D4 0E B8
; C9D6 C9      

; ============ Directorio de bard ==============
; C9D7 00
; C9D8 DE C9
; C9DA 0F
; C9DB E9
; C9DC C9      
; C9DD FF

; C9DE 43
; C9DF AB A8      ; apunta a huérfana $A8AB
; C9E1 00

; C9E2 42      
; C9E3 13
; C9E4 25
; C9E5 FF

; C9E6 0E DE
; C9E8 C9      

; C9E9 54
; C9EA 3A 5E CA

; C9ED 0E
; C9EE E9 C9      

; ============ Directorio de Gollum ==============
; C9F0 00
; C9F1 F7
; C9F2 C9
; C9F3 0F
; C9F4 2B      
; C9F5 CA
; C9F6 FF

; C9F7 13
; C9F8 D2 A8      ; apunta a huérfana $A8D2 (Mensajes de Gollum)
; C9FA 00 10 CA   

; C9FD 43
; C9FE F6 A8      ; apunta a huérfana $A8F6
; CA00 00      

; CA01 02
; CA02 0D
; CA03 10 FF

; CA05 14
; CA06 01       
; CA07 21 CA

; CA09 02
; CA0A 13
; CA0B 10
; CA0C FF
; CA0D 0E F7   
; CA0F C9

; CA10 14
; CA11 01
; CA12 26 CA      

; CA14 13
; CA15 26 A9      ; apunta a huérfana $A926
; CA17 00
; CA18 F7      
; CA19 C9

; CA1A 02
; CA1B 13
; CA1C 10 FF

; CA1E 0E       
; CA1F F7
; CA20 C9

; CA21 04
; CA22 08

; CA23 0E
; CA24 09      
; CA25 CA
 
; CA26 04 08

; CA28 0E 14
; CA2A CA       

; CA2B 02 28
; CA2D 10 FF

; CA2F 04
; CA30 24      

; CA31 0E F7
; CA33 C9

; ============ Directorio de los Trolls ==============
; CA34 00
; CA35 41
; CA36 CA       
; CA37 0F 5E
; CA39 CA FF

; CA3A 13
; CA3C BD A9      ; apunta a huérfana $A9BD (blimey, look...)
; CA3E 00
; CA3F 3B
; CA40 CA

; CA41 03
; CA42 4E A9      ; apunta a huérfana $A94E
; CA44 00

; CA45 04
; CA46 FF

; CA47 03
; CA48 4E A9      ; apunta a huérfana $A94E
; CA4A 00

; CA4B 04
; CA4C FF

; CA4D 03
; CA4E 4E A9      ; apunta a huérfana $A94E

; CA50 00
; CA51 04
; CA52 FF

; CA53 03
; CA54 4E A9      ; apunta a huérfana $A94E
; CA56 00

; CA57 03
; CA58 71 A9      ; apunta a huérfana $A971
; CA5A 00      

; CA5B 0E 41
; CA5D CA
 
; CA5E 54 0F
; CA60 6B      
; CA61 CA

; CA62 54 0F
; CA64 72
; CA65 CA

; CA66 44 24      

; CA68 0E 5E
; CA6A CA

; CA6B 54
; CA6C 27 72      
; CA6E CA

; CA6F 0E 5E
; CA71 CA
 
; CA72 07

; CA73 14      
; CA74 1E
; CA75 7A
; CA76 CA

; CA77 04
; CA78 24

; CA79 07      

; CA7A 04
; CA7B FF

; CA7C 0E 73
; CA7E CA
       
; CA7F 03
; CA80 DF A4      ; apunta a huérfana $A4DF
; CA82 00

; CA83 07


En fin... Supongo que la lógica basta con traducirla, pero las tablas hay que descifrarlas... y en ello estoy.

Creo que sería interesante que alguien se pusiese con la rutina 7f10, que usa un espacio enorme en b738 para buscar cosas ahí y que desconocemos cómo funciona.

A ver si vamos viendo la luz...

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 » 25 Nov 2014 17:39

@Chema,

debemos hablarnos por telepatía ...
Estos personajes ya forman parte de la documentación en versión actual.
No sé si lo has escrito antes de que yo subiera la última versión de documento de trabajo, pero ya estaba documentado este detalle.

me bajo tu post y lo analizo con mas calma.
muchas gracias -thumbup

Ahora voy a pegar un documento que he ido llenando conforme iba troceando la parte de los scripts ... high voltage -507

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 » 25 Nov 2014 17:42

Este es el bloc de notas donde iba guardando observaciones mientras separaba zonas de scripts ...
====================================================================================================================================
Veréis que en $CACB hay 17 bloques de 7 bytes que contienen 2 words
que curiosamente todos apuntan al área de huérfanas, estas 'entradas' ya están etiquetadas con su dirección.
Propuesta (no de ley) se podrían REnombrar así, por ejemplo:
L_C8BA: --> Gandalf_S1 en plan script 1 de Gandalf
L_C8A1: --> Gandalf_S2 en plan script 2 de Gandalf
L_C99A: --> Elrond_S1 en plan script 1 de Elrond
L_C990: --> Elrond_S2 en plan script 2 de Elrond,
pero ¿Qué hacemos con los bloques que tienen como objeto el $00? (en teoría deshabilita el bloque)
y por tanto no sabemos que personaje puede usar estas rutinas ...
Hay tres párrafos deshabilitados (de entrada):
L_CAE7 que apunta a: L_C950, L_C946
L_CAFC que apunta a: L_C9DE, L_C9D7
L_CB03 que apunta a: L_C9B8, L_C9B1
Rebuscando entre mis papeles he visto que hay TRES personajes que no tienen entrada aquí (deben ser alguna de las deshabilitadas)
y son estos tres:
- objeto $3C = red golden Dragon
- objeto $42 = Butler
- objeto $46 = Bard
A lo mejor esto nos da alguna pista para etiquetar los tres párrafos deshabilitados ... con estos tres personajes 'huérfanos'
Con ésto quedaría liquidado totalmente DATABLK3 en sus dos sub-bloques

------------------------------------------------------------------------------------------------------------------------------------

Y ahora la parte de scripts / huérfanas que resulta mas infumable de lo deseado ...
Bien, voy a seguir tratando de separar los bloques identificados con cabecera:

¿Pueden considerarse las $14, $24, $54 como formadas por:
operación - objeto - direccion? unos ejemplos:
DB $ ; C846 14
DB $ ; C847 30 ; OBJETO INEXISTENTE!
DB $ ; C848 4D C8

DB $ ; C88E 14
DB $ ; C88F 30 ; OBJETO INEXISTENTE!
DB $ ; C890 71 C8

DB $ ; C8C4 14
DB $ ; C8C5 13
DB $ ; C8C6 D0 C8

L_CA5E: DB $ ; CA5E 54
DB $ ; CA5F 0F
DB $ ; CA60 6B CA

DB $ ; CA62 54
DB $ ; CA63 0F
DB $ ; CA64 72 CA

DB $ ; CA67 24
DB $ ; CA68 0E
DB $ ; CA69 5E CA
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Las operaciones $13, $43 parece que solo viene con una dirección:
L_C9B8: DB $ ; C9B8 13
DB $ ; C9B9 DC A6 ; apunta a huérfana $A6DC

DB $ ; CA14 13
DB $ ; CA15 26 A9 ; apunta a huérfana $A926

L_C9DE: DB $ ; C9DE 43
DB $ ; C9DF AB A8 ; apunta a huérfana $A8AB
Y aquí salen las dos mezcladas con una operación $00???
L_C9F7: DB $ ; C9F7 13
DB $ ; C9F8 D2 A8 ; apunta a huérfana $A8D2
DB $ ; C9FA 00
DB $ ; C9FB 10 CA
DB $ ; C9FD 43
DB $ ; C9FE F6 A8 ; apunta a huérfana $A8F6
DB $ ; CA00 00


Bueno, paro antes de que nos caigamos mareados!
Espero vuestros comentarios, sugerencias, lo que sea al respecto.
Con tanto ajetreo, habrá que subir versión cada dos horas, jejeje

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

Mensajepor Chema » 25 Nov 2014 17:52

No, no había leído tu documento :) va a ser verdad que nos hablamos por telepatía... Un par de cosas. Las entradas de DATABLK3 que tiene entrada 0 se ponen a su personaje en código. Tienes las rutinas apuntadas en comentarios en lo que posteé antes.

La estructura de los scripts la tengo ya casi toda descifrada. ¿Espero a que leas lo que puse o te apunto aquí como va en resumen? De hecho lo que te puse antes incluye esa zona ya separada comando a comando...

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 » 25 Nov 2014 18:03

@Chema,

aunque no lo parezca, va a ser verdad!

Déjame hasta mañana para pasar todo lo que has indicado al fichero de trabajo.
Si puedes, te agradeceré que, de todas formas, me digas algo sobre los $14, $24, $54, $13 y $43 que te preguntaba en el mensaje anterior ...
Una vez tengamos todo, todo en limpio en la zona de scripts, subiré otra versión del fichero y seguimos a partir de ahí.
Tendremos que sincronizar a menudo con la cantidad de información que manejamos casi a diario ...

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

Mensajepor Chema » 25 Nov 2014 18:29

Te cuento (tienes todos los detalles un par de posts más arriba). El comando viene en los cuatro bits más bajos. Todos los que acaban en 4 hacen lo mismo llaman a una rutina a la que se le pasa 1 parámetro de tipo byte y que no tengo descifrada aun. Los que acaban en 3 llaman a la subrutina cuya dirección de memoria viene después (aunque llevan un byte adicional a 0 que no se para qué sirve).

Los cuatro bits altos indican cosas adicionales tras ejecutar el comando. Los que tienen el bit de menor peso a 1, por ejemplo, indican que sigue tras los parámetros una dirección de script a la que saltar (ponerla en WORD1). O sea que, por ejemplo el código $14 lleva 1 byte de parámetros y un word, total 4 bytes.


En tu ejemplo en c9f7 tienes un comando 13 (ejecuta) a8d2 (rutina huérfana) 0 (siempre ahí) ca10 (dos bytes más, porque lleva un 1 el comando en el nibble alto) Como el comando es 13 y no 3, tras llamar a la rutina pone el punto de ejecución de scripts a ca10.

El siguiente comando empieza por 43, otro ejecutar, pero con opciones extra diferentes. Ejecuta la rutina a8f6. Este no lleva bytes extra, excepto el cero de todos los "ejecutar", creo recordar.

Mira primero lo que te puse en código en mi post de hoy, porque ya vienen separados los comandos y a veces con comentarios. Igual te ahorra trabajo.

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 » 25 Nov 2014 22:20

@Chema
estoy organizando los scripts como tu indicas en tu último post indicando comandos, direcciones y creando etiquetas donde hace falta
Espero poder subirlo completado mañana por la mañana

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

Mensajepor Chema » 25 Nov 2014 23:23

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"?


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 4 invitados