Consultas Técnicas (ensamblador Z80 / Spectrum)

Avatar de Usuario
pser1
Mensajes: 2101
Registrado: 08 Dic 2012 18:34
Agradecido : 220 veces
Agradecimiento recibido: 227 veces

Consultas Técnicas (ensamblador Z80 / Spectrum)

Mensajepor pser1 » 04 Nov 2014 16:50

Hola,

Nos hemos encontrado a lo largo del programa dos puntos (por lo menos) en los cuales se modifican 2 bytes que forman parte de un mensaje.
Inicialmente teníamos declarado el mensaje dentro del área de mensajes así:

Código: Seleccionar todo

L_AFFC: DB $10,$83,$78,$16            ;You are in [0x16]


Actualmente ha sido descompuesto en tres partes ya que la parte central (2 bytes) es modificada por código, quedando sí

Código: Seleccionar todo

L_AFFC: DB $10                     ;You
L_AFFD: DB $83,$78                  ;are in
L_AFFF: DB $16                     ;[0x16]


Las partes de código que realizan estas modificaciones son las siguientes
Lo complicado es averiguar que diablos va a poner en lugar del texto inicial "are in", determinado por los dos bytes. Cada uno de ellos corresponde a una palabra del tipo "common words"
Si alguien puede echarle un poco de luz ... se agradecerá -nb
En caso de necesitar observar mas parte de código, utilizad, por favor, el fichero del hilo "Fuente The Hobbit V1.2 ASM Z80 ZX Spectrum 48K." en la página 39 casi al final versión 8C

Código: Seleccionar todo

Action_Look:                  ; (-07-):   ;
   CALL L_9D44       ; 8C4B CD 44 9D   ; llama a (-08-); Chequeo del byte L_B6FA
   LD IX, (L_B70C)       ; 8C4E DD 2A 0C B7   ; IX = (L_B70C)   ; Dirección de OBJ_TABLE
L_8C52: LD A, (IX+$01)       ; 8C52 DD 7E 01   ; A = (IX+$01)   ; A se carga con el primer byte de OBJ_TABLE
   CP $FF          ; 8C55 FE FF      ; A = $FF?   ; Lo compara con el final de tabla
   JR Z, L_8C95       ; 8C57 28 3C      ; Z = 1?   ; Si, salta a L_8C95
   LD HL, $0080       ; 8C59 21 80 00   ; HL = $0080   ;
   LD (L_AFFD), HL       ; 8C5C 22 FD AF   ; ($AFFD), HL   ; ($AFFD), HL   ; modifica 2 bytes del mensaje en L_AFFC con valor en HL
   LD HL, L_AFFC       ; 8C5F 21 FC AF   ; HL = L_AFFC   ; Apunta a mensaje "You are in[0x16]" ya modificado
   CALL PRT_TEXT       ; 8C62 CD DD 72         ; llama rutina PRT_TEXT (047# OK)

Esta parte parece meterle a piñón $0080, no se en que orden, quedaría. "You - 0080 ó 8000 - [0x16]. En el caso de $0080 podría tomarse como puntero a palabra $6080 = BARD,
en el caso de 8000 no sale nada coherente ...

Código: Seleccionar todo

L_9630: PUSH AF          ; 9630 F5
   CALL L_9BB1       ; 9631 CD B1 9B   ; llama rutina L_9BB1 (#22# OK)
   LD A, (IX+$00)       ; 9634 DD 7E 00
   AND $0E          ; 9637 E6 0E
   LD E, A          ; 9639 5F
   LD D, $00       ; 963A 16 00
   LD HL, L_BA80       ; 963C 21 80 BA
   ADD HL, DE       ; 963F 19
   LD E, (HL)       ; 9640 5E
   INC HL          ; 9641 23
   LD D, (HL)       ; 9642 56
   LD HL, L_AFFD       ; 9643 21 FD AF   ; modificará 2 bytes del mensaje en L_AFFC poniendo el contenido de DE
   LD (HL), D       ; 9646 72
   INC HL          ; 9647 23
   LD (HL), E       ; 9648 73
   POP AF          ; 9649 F1
   LD HL, L_AFFC       ; 964A 21 FC AF   ; apunta al mensaje "You are in[0x16]"   

Esta parece que quiera sustituir los dos bytes por un puntero a palabra de la tabla "Preposition table"(L_Ba80), pero entonces perdemos el verbo : "You - inside - [0x16], rarillo, ¿no?

saludos
pere

Avatar de Usuario
pser1
Mensajes: 2101
Registrado: 08 Dic 2012 18:34
Agradecido : 220 veces
Agradecimiento recibido: 227 veces

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

Mensajepor pser1 » 04 Nov 2014 16:55

Segundo trauma:

Hay una serie de no menos de 16 mensajes que, pese a estar etiquetados, no son llamados directamente ni con valores hexadecimales en el programa -banghead
No parece razonable que haya mensajes sobrantes ...

¿alguien se anima a descubrir donde son utilizados? -nb
Os indico 16 que están uno a continuación del otro
Al ser muy largas las líneas quedan de pena en el recuadro de code, pero es lo que hay.

Código: Seleccionar todo

L_AE49: DB $0C,$20,$56,$49,$4F,$4C,$45,$4E,$54,$80,$73,$87,$D9,$C3,$A8,$06,$15            ### ¿donde se usa? ;[0x0c] violent attack almost kill(s|d|ing|es)You[0x15]
L_AE5A: DB $06,$82,$D4,$07,$60,$87,$41,$D1,$78,$70,$78,$85,$39,$2D,$0E,$8B,$2E,$71,$89,$02,$B2,$53   ### ¿donde se usa? ;You give[0x07] a vicious{5} cut in the ribs-[0x0e] strength is failing fast
L_AE70: DB $60,$84,$6A,$85,$CF,$CA,$25,$0E,$B3,$22                     ### ¿donde se usa? ;a nasty slice miss(s|d|ing|es)[0x0e] heart
L_AE7A: DB $06,$85,$CF,$0E,$2D,$83,$12,$80,$B3,$88,$CA,$85,$DB,$7B,$78,$B9,$65            ### ¿donde se usa? ;You slice[0x0e]- hand blood drips slowly to the ground
L_AE8B: DB $06,$82,$D4,$07,$60,$84,$6A,$D5,$C3,$70,$78,$B3,$C9                  ### ¿donde se usa? ;You give[0x07] a nasty{5} slash in the leg
L_AE98: DB $06,$83,$47,$07,$83,$16,$75,$78,$85,$9E,$2D,$07,$9B,$03,$61,$87,$D9,$92,$4F,$15      ### ¿donde se usa? ;You hit[0x07] hard on the shoulder-[0x07] stagger(s) and almost fall(s)[0x15]
L_AEAC: DB $60,$82,$53,$65,$89,$BF,$78,$8B,$DA,$84,$BF,$74,$07,$15               ### ¿donde se usa? ;a fast blow knocks the wind out of[0x07][0x15]
L_AEBA: DB $60,$82,$53,$86,$5E,$8B,$40,$07,$84,$9F,$0E,$82,$5D,$2C,$66,$11,$75,$89,$6F,$70,$60,$BA,$29   ### ¿donde se usa? ;a fast stroke sweeps[0x07] off[0x0e] feet, but[0x11] on guard in a moment
L_AED1: DB $06,$83,$47,$07,$7E,$60,$89,$4C,$65,$61,$83,$C4,$07,$8A,$2F,$B6,$70            ### ¿donde se usa? ;You hit[0x07] with a glancing blow and leave[0x07] momentarily stunned
L_AEE2: DB $06,$8B,$81,$07,$80,$7C,$2D,$07,$99,$E8,$0E,$89,$35,$66,$9A,$A4,$B5,$0C         ### ¿donde se usa? ;You thrust[0x07] back-[0x07] lose(s)[0x0e] footing but recover(s) quickly
L_AEF4: DB $06,$8B,$4B,$88,$4B,$63,$0E,$80,$BF,$66,$63,$78,$89,$C9,$8A,$29,$07,$93,$A1,$B8,$08      ### ¿donde se usa? ;You swing broadside at[0x0e] body but at the last moment[0x07] jump(s) aside
L_AF09: DB $0C,$03,$8B,$40,$8A,$7A,$81,$34,$7B,$0E,$B1,$FB                  ### ¿donde se usa? ;[0x0c][0x03] sweeps past close to[0x0e] ear
L_AF15: DB $06,$85,$C3,$63,$07,$66,$78,$65,$71,$B9,$A0                     ### ¿donde se usa? ;You slash at[0x07] but the blow is ineffective
L_AF20: DB $06,$88,$3E,$0C,$03,$2C,$66,$11,$75,$B9,$6F                     ### ¿donde se usa? ;You brandish[0x0c][0x03], but[0x11] on guard
L_AF2B: DB $06,$8B,$4B,$82,$57,$63,$07,$66,$8A,$25,$88,$5B,$60,$87,$7D,$B9,$FD            ### ¿donde se usa? ;You swing feebly at[0x07] but miss by a wide margin
L_AF3C: DB $06,$8A,$B2,$8B,$8B,$2D,$06,$8B,$03,$66,$87,$28,$4C,$59,$88,$13,$80,$5E,$B0,$AF      ### ¿donde se usa? ;You seem tired-you stagger but valiantly attempt another blow


saludos
pere

FloppySoftware

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

Mensajepor FloppySoftware » 04 Nov 2014 17:13

pser1 escribió:

Código: Seleccionar todo

Action_Look:                  ; (-07-):   ;
   CALL L_9D44       ; 8C4B CD 44 9D   ; llama a (-08-); Chequeo del byte L_B6FA
   LD IX, (L_B70C)       ; 8C4E DD 2A 0C B7   ; IX = (L_B70C)   ; Dirección de OBJ_TABLE
L_8C52: LD A, (IX+$01)       ; 8C52 DD 7E 01   ; A = (IX+$01)   ; A se carga con el primer byte de OBJ_TABLE
   CP $FF          ; 8C55 FE FF      ; A = $FF?   ; Lo compara con el final de tabla
   JR Z, L_8C95       ; 8C57 28 3C      ; Z = 1?   ; Si, salta a L_8C95
   LD HL, $0080       ; 8C59 21 80 00   ; HL = $0080   ;
   LD (L_AFFD), HL       ; 8C5C 22 FD AF   ; ($AFFD), HL   ; ($AFFD), HL   ; modifica 2 bytes del mensaje en L_AFFC con valor en HL
   LD HL, L_AFFC       ; 8C5F 21 FC AF   ; HL = L_AFFC   ; Apunta a mensaje "You are in[0x16]" ya modificado
   CALL PRT_TEXT       ; 8C62 CD DD 72         ; llama rutina PRT_TEXT (047# OK)

Esta parte parece meterle a piñón $0080, no se en que orden, quedaría. "You - 0080 ó 8000 - [0x16]. En el caso de $0080 podría tomarse como puntero a palabra $6080 = BARD,
en el caso de 8000 no sale nada coherente ...


Hola,

Primero se almacena L ($80), y en la dirección siguiente H ($00).

Siempre es asi con las instrucciones LD de 16 bits.

Es decir, siempre 1º byte bajo, 2 byte alto, de tal forma que quedaría así:

LD HL, $0080; H = $00, L = $80
LD (L_AFFD), HL

AFFD : $80
AFFE : $00

Al hacer esto después:

LD HL,(L_AFFD)

Tendríamos H = $00, L = $80

Avatar de Usuario
Chema
Mensajes: 1808
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 805 veces
Agradecimiento recibido: 289 veces
Contactar:

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

Mensajepor Chema » 04 Nov 2014 17:27

Igual estoy equivocado, pero según lo que dice aquí http://www.icemark.com/dataformats/hobbit/index.html el código 0x10 significa "you are" lo que hace todo más lógico, porque la segunda rutina pondría in, on o at... La primera rutina no se para que piede servir, excepto para el mensaje you are dead?

Avatar de Usuario
Chema
Mensajes: 1808
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 805 veces
Agradecimiento recibido: 289 veces
Contactar:

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

Mensajepor Chema » 04 Nov 2014 18:28

Primero perdón por el mensaje duplicado. No se qué pasó. Segundo, siguiendo la rutina de la página anterior a mi me sale:
0x10 <0x20 así que caso especial. En esta ocasión "You are" (siempre empieza así la descripción completa)
0x83 0x78 como el bit 7 del primer byte esta a uno es un puntero, el 0x378, sumando 0x6000 apunta justo a "in"

Seguro que la segunda rutina cambia la preposición consultando una tabla o algo así para las localizaciones que llevan "at" u "on", no sé decirlo. La primera parece que pone 0x8000 que es la entrada 0 del diccionario en 0x6000 y corresponde a algo que no puedo interpretar, si no lo he mirado mal.

edito apuesto a que es para dejarlo vacío

Al final un 0x16 que según esa página significa fin del mensaje, pero eso no lo entiendo al no ser que justo detrás se pegue la descripción de la localidad o que ella misma signifique "pon aquí la descripción de la localidad y termina" no queda claro en el enlace.
Eso parece que tiene más sentido...

Avatar de Usuario
pser1
Mensajes: 2101
Registrado: 08 Dic 2012 18:34
Agradecido : 220 veces
Agradecimiento recibido: 227 veces

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

Mensajepor pser1 » 04 Nov 2014 18:57

muchas gracias a todos!!!

Efectivamente, una de ellas pone una preposición que toma de la tabla de preposiciones, valga la redundancia.
Es cierto que la rutina [0x10] tiene como título You are, pero el trozo comentado como podéis ver muestra tanto el verbo is como are así que me ha fintado un poco!
Queda totalmente aclarado este punto.

No así el caso en el que le mete a piñón $8000 ya que $6000 apunta al índice alfabético y la primera posición, para código 0 devuelve un $0000
No recuerdo bien, pero creo que si la dirección se resuelve como $0000, no imprime nada y sigue con el próximo byte del mensaje

No he encontrado el tejemaneje de guardar en memoria y luego recuperarlo, tras guardar $8000 en L_AFFD lo que hace es
LD HL, L_AFFC apuntando al principio del mensaje (para mostrar You are .... )
Aunque HL acabara con $0080, esto daría el equivalente de la palabra $6080 que existe y es "BARD"
no se si ésto tendría mucho sentido en el juego en sí : You are bard in ... suena chungo en la parte llamada Action_Look, ¿no?

saludos
pere

Avatar de Usuario
Chema
Mensajes: 1808
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 805 veces
Agradecimiento recibido: 289 veces
Contactar:

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

Mensajepor Chema » 04 Nov 2014 19:27

No entiendo muy bien. A mi me parece que pone 8000 así que resuelve como 0000 y no pone nada, es decir, no pone preposición. Hay alguna localización que no lleve preposición o la lleve en la propia descripción? A parte de un hipotético you are dead no lo sé...

Parece que comprueba algo de un objeto pero no tengo los datos de las tablas para ver qué es. Si es ff hace esto y si no salta a un sitio que no veo en el código que posteas. Así que solo puedo elucubrar, pero si hace esto de parchear el mensaje en algún sitio tiene que ponerse de nuevo al valor que tenía.

Por cierto, según he entendido (aunque ya voy perdido en este hilo) si pusiese 0080 no se resolvería a un puntero porque el primer byte no tiene el bit 7 a 1. Se interpretaría a 00 (it) y luego los dos bytes siguientes si serian un puntero, pero usando el byte 16 que es el fin del mensaje... Me parece demasiado enrevesado. No creo que haga eso.

jltursan
Mensajes: 2100
Registrado: 20 Sep 2011 13:59
Agradecido : 87 veces
Agradecimiento recibido: 187 veces

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

Mensajepor jltursan » 04 Nov 2014 19:53

Mmm, en el caso de los 16 mensajes, parecen sermensajes genéricos de combate que serán seleccionados aleatoriamente a la par que con el uso de determinados adverbios.
Me da a mí que no va a haber ninguna referencia directa o indirecta, su dirección se compondrá por código.

Avatar de Usuario
pser1
Mensajes: 2101
Registrado: 08 Dic 2012 18:34
Agradecido : 220 veces
Agradecimiento recibido: 227 veces

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

Mensajepor pser1 » 04 Nov 2014 20:03

muchas gracias,

me temo que vas a tener razón, Jose Luis, tiene pinta de ser montado sobre la marcha y efectivamente los 16 pertenecen al mismo tipo de acción.
Habrá que esperar a que lleguemos a este punto y veremos lo que somos capaces de descifrar.

Ya para cerrar el tema de mensajes perdidos, huérfanos o como quieras llamarles, voy a incluir el resto (solo 4 mas)
El mas monstruo hasta da la impresión de contener varios mensajes...
Lo dicho, cualquier interpretación será super bien recibida! -nb

saludos
pere


Código: Seleccionar todo

L_ADDA: DB $14                           ### ¿donde se usa? ;[0x14]
L_ADDB: DB $6F,$76,$8A,$5D,$A6,$D1                  ### ¿donde se usa? ; i see nothing to.
L_B1EE: DB $72,$67,$64,$76,$4E,$2C,$67,$64,$89,$15,$0D,$F0,$EE,$64,$C9,$85
   DB $2C,$67,$64,$8A,$DE,$2E,$0D,$F3,$9E,$C9,$DB,$88,$25,$CB,$0F,$61
   DB $8B,$9B,$83,$42,$2C,$0D,$F0,$5B,$D2,$28,$83,$5D,$53,$72,$C2,$61
   DB $2E,$0D,$F3,$9E,$C8,$71,$89,$1C,$61,$C2,$85,$80,$49,$2C,$0D,$C8
   DB $D5,$89,$DF,$2C,$C3,$A8,$89,$D3,$2E,$16                     ### ¿donde se usa? ;it cannot be seen, cannot be felt[0x0d] Cannot be hear(s|d|ing|es), cannot be smelt.[0x0d] It lie(s|d|ing|es) behind star(s|d|ing|es) and under hills,[0x0d] And{5} empty holes it fill(s|d|ing|es).[0x0d] It come(s|d|ing|es) first and follow(s|d|ing|es) after,[0x0d] end(s|d|ing|es) life, kill(s|d|ing|es) laughter.[0x16]
L_B2B7: DB $8B,$D1,$71,$78,$87,$E4,$86,$9B,$89,$7B,$89,$3C,$82,$5D,$70,$78
   DB $CA,$3A,$2C,$8B,$98,$63,$8A,$1F,$61,$8B,$76,$70,$78,$88,$EA,$20
   DB $3F,$16                                 ### ¿donde se usa? ;which is the animal that has four feet in the morn(s|d|ing|es), two at midday and three in the evening ?[0x16]

Avatar de Usuario
pser1
Mensajes: 2101
Registrado: 08 Dic 2012 18:34
Agradecido : 220 veces
Agradecimiento recibido: 227 veces

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

Mensajepor pser1 » 04 Nov 2014 20:23

una alegría, chicos

he empezado a rebuscar en la zona de Action_attack y casi al final he encontrado una parte código absurdo, que mirando mas arriba ha resultado ser un area de datos (apuntada por IY)
Al ir tirando del hilo, ved lo que ha salido:
Ya tenemos entendido como se llama a estos malditos 16 mensajes de guerra!!
Los substituiré por etiquetas aquí, así lo veremos mejor!
muchísimas gracias por vuestras ideas -thumbup

saludos
pere


Código: Seleccionar todo

                                     ; esta es otra área de datos (32 bytes). Apuntada desde: $91D8 - LD IY, L_9226
L_9226: DW $3CAF       ; 9226 3C AF      ; puntero a L_AF3C, apunta a los 16 mensajes que no estaban referenciados!!!
   DW $2BAF       ; 9228 2B AF
   DW $20AF       ; 922A 20 AF
   DW $15AF       ; 922C 15 AF
   DW $09AF       ; 922E 09 AF
   DW $F4AE       ; 9230 F4 AE
   DW $E2AE       ; 9233 E2 AE
   DW $D1AE            ; 9234 D1 AE
   DW $BAAE            ; 9236 BA AE
   DW $ACAE            ; 9238 AC AE
   DW $98AE            ; 923A 98 AE
   DW $8BAE            ; 923C 8B AE
   DW $7AAE            ; 923E 7A AE
   DW $70AE            ; 9240 70 AE
   DW $5AAE            ; 9242 5A AE
   DW $49AE            ; 9244 49 AE

jltursan
Mensajes: 2100
Registrado: 20 Sep 2011 13:59
Agradecido : 87 veces
Agradecimiento recibido: 187 veces

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

Mensajepor jltursan » 04 Nov 2014 21:38

¡Estupendo!

Los otros mensajes corresponden a los acertijos de Gollum :-).
Deben de invocarse cuando este personaje está presente en la sala.

Avatar de Usuario
pser1
Mensajes: 2101
Registrado: 08 Dic 2012 18:34
Agradecido : 220 veces
Agradecimiento recibido: 227 veces

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

Mensajepor pser1 » 04 Nov 2014 22:33

perfecto,

una buena pista, ahora a hurgar hasta encontrar algo parecido u olvidarlo tras unas pocas horas ... -507

El mensaje con la preposición sobre-escrita, ha quedado perfecto.
muchísimas gracias por vuestra ayuda!

saludos
pere

Avatar de Usuario
pser1
Mensajes: 2101
Registrado: 08 Dic 2012 18:34
Agradecido : 220 veces
Agradecimiento recibido: 227 veces

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

Mensajepor pser1 » 05 Nov 2014 11:21

Sigamos con el tema del Gollum.
Lo mas que he conseguido (fácil) has sido averiguar el código o ID del personaje (está en la tabla de objetos) y es el $44
Rastreando por el código, solamente aparece una vez utilizado abiertamente:
LDA $44 (marcado con @@@)

os adjunto una parte de dicho código, no he sabido ver como se llamaría a sus mensajes ya que en pocas instrucciones pasa
a una rutina para mostrar texto en pantalla.
Tema1: ¿Cómo se llama a los mensajes de Gollum?

Otra curiosidad que muestra esta zona de código es que la secuencia inicial queda forzosamente interrumpida debido al JP L_90D2
que muestra el mensaje "You are dead" que debe implicar final de partida.
Esto hace que el código que sigue al JP, que he separado con un espacio, no sea llamado desde ningún sitio del programa.
De hecho no tiene asociada etiqueta alguna.
Ya tenemos otra cosa para investigar ...
Tema2: ¿Cómo se accede a esta parte de código?

muchas gracias por anticipado
saludos
pere


Código: Seleccionar todo

L_A915: CALL L_9D44       ; A915 CD 44 9D   ; llama rutina L_9D44 (#81# OK)
   LD A, $01       ; A918 3E 01
   LD (L_B702), A       ; A91A 32 02 B7
   LD HL, L_B1DB       ; A91D 21 DB B1   ; apunta a mensaje "someone strangle(s|d|ing|es) you from behind"
   CALL PRT_TEXT       ; A920 CD DD 72   ; llama rutina PRT_TEXT (047# OK)
   JP L_90D2       ; A923 C3 D2 90

   LD A, (L_C4C1)       ; A926 3A C1 C4
   LD HL, L_B6F5       ; A929 21 F5 B6
   CP (HL)          ; A92C BE
   RET NZ          ; A92D C0
   CALL L_9D44       ; A92E CD 44 9D   ; llama rutina L_9D44 (#81# OK)
   LD HL, L_B2D9       ; A931 21 D9 B2   ; apunta a mensaje "what has it got in its pocket(s|d|ing|es) ?[0x16]"
   LD A, $08       ; A934 3E 08
   CALL L_9C9F       ; A936 CD 9F 9C
   JP NC, L_A1E3       ; A939 D2 E3 A1
   LD IX, L_C31A       ; A93C DD 21 1A C3
@@@   LD A, $44       ; A940 3E 44      ; carga el código de objeto de Gollum
   CP (IX+$01)       ; A942 DD BE 01   ; compara con el byte 1 del objeto (objeto actual ¿contenido dentro de Gollum?, ¿lo lleva encima?)
   JP Z, L_A1E3       ; A945 CA E3 A1   ; si son iguales, salta a L_A1E3
   LD HL, L_B2E7       ; A948 21 E7 B2   ; apunta a mensaje "my birthday present " how did we lose it.[0x0d] my precious "[0x16]"
   JP L_A1E3       ; A94B C3 E3 A1

Avatar de Usuario
Chema
Mensajes: 1808
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 805 veces
Agradecimiento recibido: 289 veces
Contactar:

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

Mensajepor Chema » 05 Nov 2014 14:51

¿Hay algún momento en el juego en que Gollum mira en tus bolsillos y, si tienes el anillo, lo encuentra y dice el mensaje sobre su "precious"? Parece que es lo que hace.

Mira un byte en L_C4C1 que es la tabla de objetos (creo que ponéis que la entrada de Gollum y el byte es la localización). Esto lo compara con lo que hay en L_B6F5 (¿podrá contener la localización actual del jugador?). Si no son iguales retorna y no hace más.

La siguiente porción llama a la rutina L_9D44 que no sé qué hace y carga el mensaje de "what has it got..".

Luego parece que llama al generador de aleatorios y en un caso salta a L_A1E3 que es la que imprime "You say..." (imagino que debería decir "He says..." o algo similar) seguido del "what has it got...". Comprobad si no ha modificado algún código en el mensaje para pasar de you a he.

En el otro caso mira los datos del objeto en L_C31A (el anillo) y supongo que comprobará si lo llevas encima; aunque en tu comentario dices que carga el objeto de Gollum. Si no lo llevas encima salta a L_A1E3 que hace lo de antes... imprime "what has it got..." Si lo llevas encima lo que imprime es "my birthday present...".

A mí me parece que sólo es para ese caso, no para el resto de mensajes de Gollum. Y tampoco entiendo del todo la secuencia... ¿alguien que haya jugado conoce cómo va?

Avatar de Usuario
pser1
Mensajes: 2101
Registrado: 08 Dic 2012 18:34
Agradecido : 220 veces
Agradecimiento recibido: 227 veces

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

Mensajepor pser1 » 05 Nov 2014 15:05

Hola,

muchas gracias, creo has dado en el clavo!

esta es la situación actual de los comentarios de esta parte de programa. He encontrado algunas cosas, en el sentido en que tu lo describes ...
A ver si con esto lo acabamos de cerrar.
Lo que sigue siendo raro es que esta parte de código no sea llamada desde ningún sitio aparentemente. Además no tiene etiqueta asociada

saludos
pere


Código: Seleccionar todo

   LD A, (L_C4C1)       ; A926 3A C1 C4   ; a se carga con valor de L_C4C1. Dirección rara, Gollum empieza en $C4B1
                     ; en $C4C1 está el byte que indica la ubicación en que se encuentra Gollum
                     ; pero no la tenemos etiquetada
   LD HL, L_B6F5       ; A929 21 F5 B6   ; apunta a una area de datos (supongamos que contiene la ubicación actual de Bilbo)
   CP (HL)          ; A92C BE      ; está en la misma ubicación que Gollum?   
   RET NZ          ; A92D C0      ; no, salir de la subrutina
   CALL L_9D44       ; A92E CD 44 9D   ; si está, llama rutina L_9D44 (#81# OK)
   LD HL, L_B2D9       ; A931 21 D9 B2   ; apunta a mensaje "what has it got in its pocket(s|d|ing|es) ?[0x16]"
   LD A, $08       ; A934 3E 08      ; toma valor 8 para A (para el generador aleatotio)
   CALL L_9C9F       ; A936 CD 9F 9C   ; genera un numero aleatorio (devuelve flag carry a 0 ó a 1 si es menor de 128 o mayor)
   JP NC, L_A1E3       ; A939 D2 E3 A1   ; si flag C=0, salta a L_A1E3 - imprime "You say" + mensaje apuntado por HL + "."
   LD IX, L_C31A       ; A93C DD 21 1A C3   ; apunta al obtejo anillo ID=$10 (valuable golden ring)
@@@   LD A, $44       ; A940 3E 44      ; carga el código de objeto de Gollum
   CP (IX+$01)       ; A942 DD BE 01   ; compara con el byte 1 del objeto (anillo ¿contenido dentro de Gollum?, ¿lo lleva encima?)
   JP Z, L_A1E3       ; A945 CA E3 A1   ; si son iguales, salta a L_A1E3 - imprime "You say" + mensaje apuntado por HL + "."
   LD HL, L_B2E7       ; A948 21 E7 B2   ; apunta a mensaje "my birthday present " how did we lose it.[0x0d] my precious "[0x16]"
   JP L_A1E3       ; A94B C3 E3 A1   ; salta a L_A1E3 - imprime "You say" + mensaje apuntado por HL + "."

Avatar de Usuario
pser1
Mensajes: 2101
Registrado: 08 Dic 2012 18:34
Agradecido : 220 veces
Agradecimiento recibido: 227 veces

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

Mensajepor pser1 » 05 Nov 2014 15:39

he encontrado otra parte de código que también está relacionada con el Gollum.
Desafortunadamente, es una parte que empieza sin etiqueta, quien sabe desde donde se llama!
Además, debajo suyo empieza otro cacho de código de igual manera, sin etiqueta ...
Esto ya requiere un master en investigación

De todas formas veo que en L_B6EE-EF hay un puntero que se utiliza sumándole dos para recuperar otro puntero que se pasa a HL por lo que puede ser que aquí se
esté decidiendo cual de los mensajes de Gollum se va a utilizar en L_A1E3 (?)

Se agradecerá cualquier ayuda -nb

saludos
pere

Código: Seleccionar todo

   RET          ; A8D1 C9
   
                     ; Esta parte también está relacionada con Gollum ...
                     ; para variar NO tiene etiqueta, será llamada desde ¿dónde?
@@@    LD A, (L_C4C1)       ; A8D2 3A C1 C4   ; carga en A la ubicación en que se encuentra Gollum
   LD HL, L_B6F5       ; A8D5 21 F5 B6   ; apunta a una área de datos (supongamos que contiene la ubicación actual de Bilbo)
   CP (HL)          ; A8D8 BE      ; es la misma ubicación ?
   RET NZ          ; A8D9 C0      ; no, salir de la subrutina
   LD HL, L_C122       ; A8DA 21 22 C1   ; apunta al byte 7 (various flags) del objeto $00
   BIT 7, (HL)       ; A8DD CB 7E      ; tiene el bit7 a 1?
   RET Z          ; A8DF C8      ; no, retorna
   CALL L_9D44       ; A8E0 CD 44 9D   ; llama rutina L_9D44 (#81# OK)
   LD HL, (L_B6EE)       ; A8E3 2A EE B6   ; HL recibe el valor del área de datos L_B6EE-B6EF
   INC HL          ; A8E6 23      ; le suma
   INC HL          ; A8E7 23      ; dos
   LD E, (HL)       ; A8E8 5E      ; byte bajo en E
   INC HL          ; A8E9 23      ; incrementa puntero
   LD D, (HL)       ; A8EA 56      ; byte alto en D
   PUSH DE          ; A8EB D5      ; pasa este valor
   POP HL          ; A8EC E1      ; a HL
   CALL L_A1E3       ; A8ED CD E3 A1   ; llama la subrutina L_A1E3 - imprime "You say" + mensaje apuntado por HL + "."
   LD A, $01       ; A8F0 3E 01      ; pone un 1
   LD (L_B6F9), A       ; A8F2 32 F9 B6   ; en L_B6F9
   RET          ; A8F5 C9      ; retorna
   
   CALL L_9D44       ; A8F6 CD 44 9D   ; llama rutina L_9D44 (#81# OK)
   SUB A          ; A8F9 97


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