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

Mensajepor Chema » 02 Dic 2014 21:25

Último mensaje de la página anterior:

Uau eso tiene buena pinta... buen trabajo 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: Scripts Z80 - Conversión a 6809

Mensajepor Chema » 02 Dic 2014 22:06

Por cierto, la 980e la tienes comentada un poco más atrás y es de donde saqué cómo iban los scripts. Faltan cosas, lo sé, pero por si te si te puede ayudar con ella. No recuerdo dónde estaba en su análisis ahora mismo, porque saltando de rutina a rutina acabo un poco perdido...

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 22:41

lo he visto Chema,
hay otra que ya la tenemos también, incluso con nombre.
En el detalle he puesto todas las llamadas y como ésta no tiene nombre asociado ... y es tan grande, me daba yuyu!
Pero, es cierto que está muy comentada.
Lo complicado con estos bloques tan grandes de código es ponerles un nombre descriptivo y corto!

En fin, seguiremos con ello
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: Scripts Z80 - Conversión a 6809

Mensajepor Chema » 03 Dic 2014 00:39

Ahora que me doy cuenta, no sé si terminé con esto o no... El último estado en que tenía la rutina es esta (he puesto nombres a las variables, según tu convención, pero los comentarios son antiguos, me temo).

Código: Seleccionar todo

   
                     ; (#221# --)
                     
L_980E: CALL Action_None    ; 980E CD 02 9B   ; llama rutina Action_None

   ; Inicializar   
   LD IY, HighLevel_Dirs       ; 9811 FD 21 CB CA   ; Carga IY con L_CACB
   
   ; Repetir
   ; *980b =0
   ; Si es el último registro ir a fin
L_9815: XOR A          ; 9815 AF      ; A = A XOR A   ; A = 0, borra A, flag Z = 1
   LD (L_980B), A       ; 9816 32 0B 98   ; Carga (L_980B) con A
   LD A, (IY+$00)       ; 9819 FD 7E 00   ; Carga A con (IY+$00)
   CP $FF          ; 981C FE FF      ; Compara A con $FF
   JP Z, L_9909       ; 981E CA 09 99   ; Si Z = 1, Salta a L_9909
   
   ; Si el registro tiene código 0 saltar a obtener siguiente
   CP $00          ; 9821 FE 00      ; Compara A con $00
   JP Z, L_9901       ; 9823 CA 01 99   ; Si Z = 1, Salta a L_9901
   
   ; El registro tiene un código !=0
   ; Obtener el código del actor actual
   LD (ActionActor), A       ; 9826 32 EA B6   ; Carga (L_B6EA) con A
   ; Buscar su localización usando la rutina 160
   ; Devuelve en IX el puntero al objeto y en A: Localización del objeto, si 1er byte objeto = $01 sinó devuelve $FF
   CALL L_9F82       ; 9829 CD 82 9F   ; llama rutina L_9F82 (#160# --)
   ; Almacenamos los valores retornados
   LD (L_B70C), IX       ; 982C DD 22 0C B7   ; Carga (L_B70C) con IX
   LD (L_B6F6), A       ; 9830 32 F6 B6   ; Carga (L_B6F6) con A
   ;*b702=0
   SUB A          ; 9833 97      ; Resta A de A
   LD (L_B702), A       ; 9834 32 02 B7   ; Carga (L_B702) con A
   
   ; Tomamos de nuevo el código del registro (Personaje)
   LD A, (IY+$00)       ; 9837 FD 7E 00   ; Carga A con (IY+$00)
   ; Salvamos el puntero al regisro
   PUSH IY          ; 983A FD E5      ; Guarda IY

   ; Cuando Bilbo está en la misma loc que el personaje y si no hemos entrado nunca
   ; en el si interno, se pone b702=1.
   ; No se entra en el si interno hasta que alguien no ponga 980c a 1. Luego se entra sólo una vez, para imprimir "You hear a noise".
   ; cuando se entra se pone b702=0 y 980c a 2, con lo que no vuelve a entrar en el si externo hasta que alguien lo ponga a algo distinto
   ; de 2, 980c se pone a 0 (no está oscuro) o a 1 (está oscuro) en ActionNone. No se modifica en otro sitio (aparentemente)
   ; Parece que la cosa es que si un personaje hace algo y está en la localizacion de Bilbo y está Oscuro, imprime
   ; "You hear a noise"

   
   ; Carga en IY OBJ_TABLE (Entrada 0 es Bilbo) y llama a 9e25 IX=Entrada del Personaje en la tabla de objetos
   ; 9e25 Intercambia IX e IY y llama a ObjectsSameLoc Z=0 si estan en la misma localización
   LD IY, OBJ_TABLE    ; 983C FD 21 1B C1   ; Carga IY con OBJ_TABLE
   CALL L_9E25       ; 9840 CD 25 9E   ; llama rutina L_9E25 (#161# --)
   
   ; Recuperamos IY
   ; Ahora IX apunta a OBJ_TABLE e IY a la entrada del directorio de scripts en curso
   POP IY          ; 9843 FD E1      ; Recupera IY
   
   ; Si El personaje está en la misma localización que Bilbo  y *980c!=2 entonces
   JR Z, L_9868       ; 9845 28 21      ; Si Z = 1, Salta a L_9868
   LD A, (L_980C)       ; 9847 3A 0C 98   ; Carga A con (L_980C)
   CP $02          ; 984A FE 02      ; Compara A con $02
   JR Z, L_9868       ; 984C 28 1A      ; Si Z = 1, Salta a L_9868

   ;   *b702=1
   LD A, $01       ; 984E 3E 01      ; Carga A con $01
   LD (L_B702), A       ; 9850 32 02 B7   ; Carga (L_B702) con A

   ;    Si *980c==1 (Está oscuro, puesto en ActionNone) entonces
   LD A, (L_980C)       ; 9853 3A 0C 98   ; Carga A con (L_980C)
   CP $01          ; 9856 FE 01      ; Compara A con $01
   JR NZ, L_9868       ; 9858 20 0E      ; Si Z = 0, Salta a L_9868
   ;       *980c++; Imprime ("You hear a noise"); *b702=0;
   INC A          ; 985A 3C      ; Incrementa A
   LD (L_980C), A       ; 985B 32 0C 98   ; Carga (L_980C) con A
   LD HL, L_B027       ; 985E 21 27 B0   ; apunta a mensaje "you{5} hear a noise"
   CALL PrintMsg       ; 9861 CD DD 72   ; llama rutina PrintMsg
   SUB A          ; 9864 97      ; Resta A de A
   LD (L_B702), A       ; 9865 32 02 B7   ; Carga (L_B702) con A
   ;    fin si
   ; fin si
   
   
L_9868:
   ; Si Bilbo está contenido en otro objeto
   ; Salta a L_9b16
   LD A, $FF       ; 9868 3E FF      ; Carga A con $FF
   CP (IX+$01)       ; 986A DD BE 01   ; Compara A con (IX+$01)
   JP NZ, L_9B16       ; 986D C2 16 9B   ; Si Z = 0, Salta a L_9B16
   
   ; Bilbo no está contenido en otro objeto
L_9870:
   LD IX, (L_B70C)       ; 9870 DD 2A 0C B7   ; Carga IX con (L_B70C)

   ; L7f10 llama a L_7EFF #158# pero salvando registros
   ; Recorre 8 entradas en datos en B738 de 25($19) en 25 buscando el que sea igual al ActionActor.
   ; Retorna Z=1 si lo encuentra, Z=0 sino.
   CALL L_7F10       ; 9874 CD 10 7F   ; llama rutina L_7F10 (#223# --)
   
   ; Si (encontrado) entonces *b6f4=0; sino *b6f4=1
   LD A, $00       ; 9877 3E 00      ; Carga A con $00
   JR NZ, L_987C       ; 9879 20 01   ; Si Z = 0, Salta a L_987C
   INC A          ; 987B 3C      ; Incrementa A
L_987C: LD (L_B6F4), A       ; 987C 32 F4 B6   ; Carga (L_B6F4) con A

   ; Tomamos los bytes 2 y 3 (WORD1) de la entrada en HighLevel_Dirs que estamos
   ; procesando en la tabla como un puntero
L_987F: LD L, (IY+$02)       ; 987F FD 6E 02   ; Carga L con (IY+$02)
   LD H, (IY+$03)       ; 9882 FD 66 03   ; Carga H con (IY+$03)
   
   ; si *980b==6 salta a obtener siguiente elemento (se pone a 0 al inicio de
   ; esta rutina y se incrementa en L_99AA dentro de L_9928 que procesa comandos DoAction y Call)
L_9885: LD A, (L_980B)       ; 9885 3A 0B 98   ; Carga A con (L_980B)
   CP $06          ; 9888 FE 06      ; Compara A con $06
   JR Z, L_9901       ; 988A 28 75      ; Si Z = 1, Salta a L_9901
   
   ; Miramos el contenido del puntero A=(HL), que es WORD1, DE=4 y IX=HL
   LD A, (HL)       ; 988C 7E      ; Carga A con (HL)
   LD DE, $0004       ; 988D 11 04 00   ; Carga DE con $0004
   PUSH HL          ; 9890 E5      ; Guarda HL
   POP IX          ; 9891 DD E1      ; Recupera IX
   
   ; Analizamos el comando del script (que está en A)
   ; Si (A & 0xf <= 5)
   AND $0F          ; 9893 E6 0F      ; Hace AND lógico de A con $0F
   CP $05          ; 9895 FE 05      ; Compara A con $05
   JR NC, L_98CB       ; 9897 30 32      ; Si C = 0, Salta a L_98CB

   ;  si Encontramos al ActionActor en la zona b738 antes (*b6f4==1) y el bit 6 del comando es cero (bit(6,(HL))==0 )
   LD A, (L_B6F4)       ; 9899 3A F4 B6   ; Carga A con (L_B6F4)
   CP $01          ; 989C FE 01      ; Compara A con $01
   JR NZ, L_98BF       ; 989E 20 1F      ; Si Z = 0, Salta a L_98BF
   BIT 6, (HL)       ; 98A0 CB 76      ; Esta a 1 el bit 6 de (HL)?
   JR NZ, L_98BF       ; 98A2 20 1B      ; Si Z = 0, Salta a L_98BF
   ;  entonces *b6f4=0
   SUB A          ; 98A4 97      ; Resta A de A
   LD (L_B6F4), A       ; 98A5 32 F4 B6   ; Carga (L_B6F4) con A
   
   ;       a=1, llamamos a 7f1a: Con parámetro A=1
   ;            (busca en la zona de L_B738 y devuelve Z=1 si éxito y HL apuntando ahí)
   ;       si (7f1a(1) retorna Z=0) entonces
   INC A          ; 98A8 3C      ; Incrementa A
   CALL L_7F1A       ; 98A9 CD 1A 7F   ; llama rutina L_7F1A (#224# --)
   JR Z, L_98BF       ; 98AC 28 11      ; Si Z = 1, Salta a L_98BF
   
   ;         *b6fa=*b6fb=1;
   ;         HL=9901, push HL e IX y salta a 99ce
   ;          El RET dentro de #228# vuelve a 9901, por el PUSH HL de abajo
   LD A, $01       ; 98AE 3E 01      ; Carga A con $01
   LD (L_B6FA), A       ; 98B0 32 FA B6   ; Carga (L_B6FA) con A
   LD (L_B6FB), A       ; 98B3 32 FB B6   ; Carga (L_B6FB) con A
   LD HL, L_9901       ; 98B6 21 01 99   ; Carga HL con L_9901
   PUSH HL          ; 98B9 E5      ; Guarda HL
   PUSH IX          ; 98BA DD E5      ; Guarda IX
   JP L_99CE       ; 98BC C3 CE 99   ; Salta a L_99CE
   ;      fin si
   ;  fin si
   
   ;  Comprueba los 4 bits más bajos de la entrada apuntada por HL (nibble bajo de la acción del script).
   ;  Si es ==4 salta a 9974
   ;  Si es <4 salta a 9928  (Determina dentro, mirando el bit 0 si hay que ejecutar una acción o saltar a una rutina)
   ;   es decir, comandos DoAction y JP. Parece que no existe comando con código 1)
   ;  sino (es 5) no hace nada y salta a siguiente entrada ¿Se usa esto?
L_98BF: LD A, (HL)       ; 98BF 7E      ; Carga A con (HL)
   AND $0F          ; 98C0 E6 0F      ; Hace AND lógico de A con $0F
   CP $04          ; 98C2 FE 04      ; Compara A con $04
   JP Z, L_9974       ; 98C4 CA 74 99   ; Si Z = 1, Salta a L_9974
   JR C, L_9928       ; 98C7 38 5F      ; Si C = 1, Salta a L_9928
   JR L_9901       ; 98C9 18 36      ; Salta a L_9901
   ; fin si (a & 0xf <=5)

   ; Aquí traemos    A=nibble bajo de la acción del script, IX=Dirección del script ejecutándose
   ; IY es el puntero al registro de HighLevels_Dir en curso
L_98CB:
   ; Si el comando es 15 ($0e)
   ;    Comando JUMP
   ;   Saltamos a 987f (procesa el comando)
   CP $0E          ; 98CB FE 0E      ; Compara A con $0E
   JR NZ, L_98DD       ; 98CD 20 0E      ; Si Z = 0, Salta a L_98DD
   LD E, (IX+$01)       ; 98CF DD 5E 01   ; Carga E con (IX+$01)
   LD (IY+$02), E       ; 98D2 FD 73 02   ; Carga (IY+$02) con E
   LD E, (IX+$02)       ; 98D5 DD 5E 02   ; Carga E con (IX+$02)
   LD (IY+$03), E       ; 98D8 FD 73 03   ; Carga (IY+$03) con E
   JR L_987F       ; 98DB 18 A2      ; Salta a L_987F
   ; sino
   ;   si es 12 ($0c)
   ;      comando REWIND_AND_SET_ENTRY
   ;      Llamamos a 9AA0 con B=(IX+1) parámetro y A=(IY) (Personaje)
   ;      No lo entiendo muy bien, porque busca en HighLevel_Dirs la primera entrada del personaje (reg A)
   ;      y busca en su directorio una entrada del tipo pasado en B. ¿Se usa?
   ;      Saltamos a 987f (procesa el comando)
L_98DD: CP $0C          ; 98DD FE 0C      ; Compara A con $0C
   JR NZ, L_98EC       ; 98DF 20 0B      ; Si Z = 0, Salta a L_98EC
   LD B, (IX+$01)       ; 98E1 DD 46 01   ; Carga B con (IX+$01)
   LD A, (IY+$00)       ; 98E4 FD 7E 00   ; Carga A con (IY+$00)
   CALL L_9AA0       ; 98E7 CD A0 9A   ; llama rutina L_9AA0 (#212# --)
   JR L_987F       ; 98EA 18 93      ; Salta a L_987F
   ;   sino
   ;      si es 15
   ;         Comando JUMP_RANDOM
   ;         Salta a una entrada aleatoria del directorio
   ;         Llamamos a 9a59
   ;         Saltamos a 987f (procesa el comando)
L_98EC: CP $0F          ; 98EC FE 0F      ; Compara A con $0F
   JR NZ, L_98F5       ; 98EE 20 05      ; Si Z = 0, Salta a L_98F5
   CALL L_9A59       ; 98F0 CD 59 9A   ; llama rutina L_9A59 (#225# --)
   JR L_987F       ; 98F3 18 8A      ; Salta a L_987F
   ;      sino
   ;         si es 0
   ;            Sumamos DE a HL HL+=4 y saltamos a 9885
   ;            Parecido a 987f, pero con HL ya cargado a 4 bytes más adelante
L_98F5: CP $00          ; 98F5 FE 00      ; Compara A con $00
   JR NZ, L_98FC       ; 98F7 20 03      ; Si Z = 0, Salta a L_98FC
   ADD HL, DE       ; 98F9 19      ; Adiciona DE en HL
   JR L_9885       ; 98FA 18 89      ; Salta a L_9885
   ;         fin si
   ;      fin si
   ;    fin si
   ; fin si
   
   ; Si no es ninguno de los anteriores
   ; A=E=0; Llamar a 9a68 Resetea a la primera entrada del directorio
L_98FC: SUB A          ; 98FC 97      ; Resta A de A
   LD E, A          ; 98FD 5F      ; Carga E con A
   CALL L_9A68       ; 98FE CD 68 9A   ; llama rutina L_9A68 (#226# --)
   
   ; Obtener siguiente elemento
L_9901: LD DE, $0007       ; 9901 11 07 00   ; Carga DE con $0007
        ADD IY, DE       ; 9904 FD 19      ; Adiciona DE en IY
   JP L_9815       ; 9906 C3 15 98   ; Salta a L_9815
   
   
   ; fin
   ; ActionActor=0, *b702=1,*b70c=OBJ_TABLE
   ; return
L_9909: SUB A          ; 9909 97      ; pone a 0
   LD (ActionActor), A     ; 990A 32 EA B6   ; ActionActor
   INC A          ; 990D 3C      ; Pone a 1
   LD (L_B702), A       ; 990E 32 02 B7   ; L_B702
   LD HL, OBJ_TABLE    ; 9911 21 1B C1   ; pone la dirección de Bilbo
   LD (L_B70C), HL       ; 9914 22 0C B7   ; en L_B70C
   RET          ; 9917 C9      ; Retorna


Está algo más completa que la última vez. Ya no recuerdo si puse algo de las rutinas auxiliares que se llaman desde aquí y van implementando los comandos (creo que sí). Miraré los posts anteriores a ver...

Una cosa: el código es... cómo decirlo... un poco caótico. Parece que ha sido parcheado según se fueron encontrando bugs o añadiendo cosas. Ya sé que el Hobbit es famoso por eso, pero es un auténtico caos. Juzgad vosotros mismos...

Avatar de Usuario
ron
Mensajes: 21855
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 3862 veces
Agradecimiento recibido: 4752 veces

Re: Scripts Z80 - Conversión a 6809

Mensajepor ron » 03 Dic 2014 21:39

CIertamente, si con la versión 1.2 se chapuceó tanto, igual la 1.0 es hasta menos farragosa. Ha sido mala planificación quizá haber ido directos a la 1.2 sin antes echarle un ojo a la 1.0 por si estuviera más clara o mejor programada, pero eso ahora ya no importa.
He venido leyendo todos los posts del desarrollo y ciertamente en la parte del desensamblado , gracias a vuestras explicaciones hay casos que son flagrantes ( de pepe gotera y otilio ) del todo y supongo que es una sensación así como la de Champolion cuando descifró el primer jeroglífico, a diferencia que vosotros habéis sido los que habéis creado la piedra Roseta.

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 » 03 Dic 2014 22:03

hola ron,
era una posibilidad que ni se barajó supongo que, por aquello de ir a la versión con menos bugs ....
Todos los programas grandes tienen parches para corregir errores y/o añadir funcionalidades y acaban siendo parecidos a lo que nos estamos
encontrando aquí, aunque conforme se va descifrando tampoco parece demasiado mal programado.
Enrevesado si lo es, de narices, pero seguiremos adelante implacablemente!

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 » 03 Dic 2014 22:14

Adjunto una rutina que estoy documentando ahora y le iba a poner que sirve para detectar si la acción es factible ...
Si la acción se encuentra en alguna de las dos tablas de acciones o en el interior del Objeto, devuelve A=1 (se graba en L_B6FB, un viejo conocido!)
En caso de no encontrarse en ninguno de los tres sitios, devuelve 0
Lo extraño es que en primer lugar se llama a la rutina IsActionFeasible que teóricamente devuelve flag Z=1 si se puede efectuar, y debido a ello
saldría con valor A=0 que parece indicar que NO se puede realizar.
Igual la rutina IsActionFeasible ($9B44) hay que interpretarla al revés de lo indicado ... pero es como la tenemos documentada
¿Alguien puede echarle una ojeada a este tema para tratar de aclarar el objetivo de ambas rutinas?
muchas gracias por anticipado ... -nb

saludos
pere

; (#151# --)
; devuelve A=0 si ActionFeasible o bien Action no encontrada
; devuelve A=1 si la acción está en una de las tablas o en el Objeto
L_94D6: PUSH IX ; 94D6 DD E5 ; Guarda IX
PUSH HL ; 94D8 E5 ; Guarda HL
CALL IsActionFeasible ; 94D9 CD 44 9B ; llama IsActionFeasible(MainObject, SecondObject) - devuelve Z=0 si se puede efectuar
LD A, $00 ; 94DC 3E 00 ; A=$00
JR Z, L_9508 ; 94DE 28 28 ; si se puede efectuar, sale via L_9508 con A=0
LD A, (CurrentAction) ; 94E0 3A E7 B6 ; recupera código de acción a ejecutar
LD IX, Action_Table ; 94E3 DD 21 30 C7 ; apunta a Action_Table
CALL FindPointer ; 94E7 CD BD 9D ; busca puntero con CurrentAction en Action_Table
CP $FF ; 94EA FE FF ; llegado a final de tabla? (no encontrado)
LD A, $01 ; 94EC 3E 01 ; A=$01
JR NZ, L_9508 ; 94EE 20 18 ; si encontrado, sale via L_9508 con A=1
CALL IsActionInTableA20b ; 94F0 CD D0 A1 ; llama IsActionInTableA20b (si encontrado Z=1)
LD A, $01 ; 94F3 3E 01 ; Carga A con $01
JR Z, L_9508 ; 94F5 28 11 ; si encontrado, sale via L_9508 con A=1
LD A, (MainObject) ; 94F7 3A E8 B6 ; recupera código objeto principal
CALL GetObjPointer2IX ; 94FA CD CA 9B ; llama GetObjPointer2IX devuelve puntero al objeto en IX
LD A, (CurrentAction) ; 94FD 3A E7 B6 ; recupera acción a efectuar
CALL SearchActionInObj ; 9500 CD 81 9B ; llama SearchActionInObj (encontrado implica C=1)
LD A, $01 ; 9503 3E 01 ; A=$01
JR C, L_9508 ; 9505 38 01 ; si encontrado, sale via L_9508 con A=1
SUB A ; 9507 97 ; A=$00 (NO encontrado)
L_9508: LD (L_B6FB), A ; 9508 32 FB B6 ; guarda A en L_B6FB
POP HL ; 950B E1 ; Recupera HL
POP IX ; 950C DD E1 ; Recupera IX
RET ; 950E C9 ; Retorna

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

Re: Scripts Z80 - Conversión a 6809

Mensajepor Chema » 03 Dic 2014 23:27

Según puse yo en el hilo de las acciones, esa rutina devuelve el flag Z=0 si se puede realizar, lo cual es coherente con lo que hace esta rutina. JR Z no salta y se sigue procesando. ¿Me equivoqué?

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 » 03 Dic 2014 23:53

efectivamente Chema,

este ha sido uno de éstos malditos casos en los cuales al leer que si flag Z = 0 entiendes que quiere decir que el resultado fué cero y es justo al revés.
Ya decía yo que sonaba absurdo que la primera prueba que se hace, que ni siquiera huele la acción a efectuar, pudiera retornar dando la acción como factible.
Bueno, dormiré mas tranquilo.
muchas gracias de nuevo!

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 » 04 Dic 2014 14:18

Hola,

estaba contento ya que tenía la inmensa mayoría de rutinas de este gran bloque aceptadas mas que bien comprendidas
debido a la profusión de variables / flags que se emplean en ellas.
Pero he tropezado con un escollo grande ... L_9EA0 que como veréis en los comentarios hace algo, para mi, incomprensible.

Como el fuente está, digamos que en obras, no lo subo en su hilo, sino aquí para que lo podáis consultar entero, ya que se
usan bastantes partes del mismo.
He marcado con ### todos los párrafos (rutinas) a las que les he ido añadiendo / completando comentarios.
Así es mas fácil buscarlos con el editor que utilicéis.
Asimismo os adjunto el documento que relaciona las llamadas a estas rutinas. Faltan unas pocas ... por si alguien se anima!
Los nombres los puse sobre la marcha, alguno no me gusta del todo ... se aceptan alternativas -thumbup
Vamos a ver si somos capaces de entender este bloque! Es muy importante -nb -nb

Yo ya me empané ayer, tal vez he descansado mucho y hoy voy muy relajado ... -507


saludos
pere
Adjuntos
$7F10 y relacionados.zip
Arbol de llamadas a subrutinas
(1.08 KiB) Descargado 151 veces
HOBASM_V9_08i - socorro $9EA0.asm.zip
Fuente atascado en $9EA0
(178 KiB) Descargado 135 veces

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 » 04 Dic 2014 19:09

Aquí os dejo el análisis de las rutinas implicadas en la implementación de los scripts a falta de la grande en 99c6 que volveré a ella en cuanto pueda.

Son unas cuantas... te las pongo todas seguidas en un bloque de código.

Código: Seleccionar todo


; Auxiliar que pone WORD1 a la siguiente instrucción del script
; Los bytes a saltar vienen en DE (creo que con 4 desde la rutina principal)
; Si la actual tiene el bit 4 a 1 contempla que tiene un parámetro
; extra.
; Script_SetNextInstuction
L_9918:
   ; HL+=DE
   ADD HL, DE       ; 9918 19      ; Adiciona DE en HL
   
   ; Si el bit 4 de la instrucción está a 1   
   BIT 4, (IX+$00)       ; 9919 DD CB 00 66   ; Esta a 1 el bit 4 de (IX+$00)?
   JR Z, L_9921       ; 991D 28 02      ; Si Z = 1, Salta a L_9921

   ;  Incrementa HL dos veces más, el tamaño del parámetro
   INC HL          ; 991F 23      ; Incrementa HL
   INC HL          ; 9920 23      ; Incrementa HL

   ; Carga en Word1 la dirección siguiente a ejecutar en el script
L_9921: LD (IY+$02), L       ; 9921 FD 75 02   ; Carga (IY+$02) con L
   LD (IY+$03), H       ; 9924 FD 74 03   ; Carga (IY+$03) con H
   RET          ; 9927 C9      ; Retorna


   
; Función que implementa los comandos de script DoAction (2) y Call (3)
; Se llega sólo si el comando es 1, 2 ó 3
; Script_DoActionFullCall
L_9928:
   ; Pone siguiente instrucción en WORD1 Sript_SetNextInstruction
   CALL L_9918       ; 9928 CD 18 99   ; llama rutina L_9918 (#227# --)

   ; Si la instrucción actual tiene el bit 0 a 0 entonces
   BIT 0, (IX+$00)       ; 992B DD CB 00 46   ; Esta a 1 el bit 0 de (IX+$00)?
   JR NZ, L_994A       ; 992F 20 19      ; Si Z = 0, Salta a L_994A

   ;    Es un comando 2, ponemos las variables y llamamos a ExecuteAction (99c6)
   LD A, (IX+$01)       ; 9931 DD 7E 01   ; Carga A con (IX+$01)
   LD (CurrentAction), A    ; 9934 32 E7 B6   ; guarda ID de acción
   LD A, (IX+$02)       ; 9937 DD 7E 02   ; Carga A con (IX+$02)
   LD (MainObject), A    ; 993A 32 E8 B6   ; guarda código objeto principal
   LD A, (IX+$03)       ; 993D DD 7E 03   ; Carga A con (IX+$03)
   LD (SecondObject), A    ; 9940 32 E9 B6   ; guarda código objeto secundario
   CALL L_99C6       ; 9943 CD C6 99   ; llama rutina L_99C6 (#228# --)

   ;    Si ExecuteAction (99c6) devuelve Z=1
   ;      comprueba si hay salto extra (bit 4 en instrucción a uno) llamando a 99AA
   ;    finsi
   JR Z, L_99AA       ; 9946 28 62      ; Si Z = 1, Salta a L_99AA
   JR L_9967       ; 9948 18 1D      ; Salta a L_9967

   ; sino
   ;    Llegamos aquí si la instrucción actual es 3 o 1 (Call)
L_994A:
   ;    Tomamos el puntero a la rutina a llamar
   LD L, (IX+$01)       ; 994A DD 6E 01   ; Carga L con (IX+$01)
   LD H, (IX+$02)       ; 994D DD 66 02   ; Carga H con (IX+$02)
   ;    Ponemos a 0 B6fa y b6fb
   SUB A          ; 9950 97      ; pone a 0
   LD (L_B6FA), A       ; 9951 32 FA B6   ; L_B6FA
   LD (L_B6FB), A       ; 9954 32 FB B6   ; y L_B6FB
   ;    Llamamos a la rutina
   CALL CallSubrutineHL    ; 9957 CD 6C 9B   ; llama CallSubrutineHL
   
   ; Si *b6fb==1
   ;    *b6fa=1 y volvemos a llamar
   ; finsi
   LD A, (L_B6FB)       ; 995A 3A FB B6   ; Carga A con (L_B6FB)
   CP $01          ; 995D FE 01      ; Compara A con $01
   JR NZ, L_99AA       ; 995F 20 49      ; Si Z = 0, Salta a L_99AA
   LD (L_B6FA), A       ; 9961 32 FA B6   ; Carga (L_B6FA) con A
   CALL CallSubrutineHL    ; 9964 CD 6C 9B   ; llama CallSubrutineHL

   ; finsi
   
   ; Común para ambas instrucciones
L_9967:
   ; Si el bit 5 de la instrucción está a 1 (es un RunOnce), se pone a 0 el código de instrucción
   ; Para no volver a ejecutarla.
   BIT 5, (IX+$00)       ; 9967 DD CB 00 6E   ; Esta a 1 el bit 5 de (IX+$00)?
   JP Z, L_9901       ; 996B CA 01 99   ; Si Z = 1, Salta a L_9901
   LD (IX+$00), $00    ; 996E DD 36 00 00   ; Carga (IX+$00) con $00

   ; Salta a 9901 (Obtener siguiente elemento de la rutina L_980E que procesa los scripts)
   JR L_9901       ; 9972 18 8D      ; Salta a L_9901
   
; Rutina que implementa el comando 4 (DoAction sin parámetros).
; Script_DoAction
L_9974:
   ; Prepara WORD1 con la siguiente instrucción a ejecutar (dos bytes más adelante
   ; si no tenemos el bit 4 a 1)
   LD DE, $0002       ; 9974 11 02 00   ; Carga DE con $0002
   CALL L_9918       ; 9977 CD 18 99   ; llama rutina L_9918 (#227# --)

   ; Si la instrucción a ejecutar NO es $ff
   LD A, (IX+$01)       ; 997A DD 7E 01   ; Carga A con (IX+$01)
   CP $FF          ; 997D FE FF      ; Compara A con $FF
   JR Z, L_9994       ; 997F 28 13      ; Si Z = 1, Salta a L_9994

   ;    Ponemos las variables adecuadamente (los objetos a $ff)
   LD (CurrentAction), A    ; 9981 32 E7 B6   ; guarda ID de acción
   LD A, $FF       ; 9984 3E FF      ; Carga A con $FF
   LD (MainObject), A    ; 9986 32 E8 B6   ; guarda código objeto principal
   LD (SecondObject), A    ; 9989 32 E9 B6   ; guarda código objeto secundario

   ;    Si 99c6 devuelve Z=1
   ;      comprueba si hay salto extra (bit 4 en instrucción a uno) llamando a 99AA
   ;    finsi
   CALL L_99C6       ; 998C CD C6 99   ; llama rutina L_99C6 (#228# --)
   JR Z, L_99AA       ; 998F 28 19      ; Si Z = 1, Salta a L_99AA
   
   ;    Salta a 9901 (Obtener siguiente elemento de la rutina L_980E que procesa los scripts)
   JP L_9901       ; 9991 C3 01 99   ; Salta a L_9901
   ; finsi   
   

   ; la acción era $FF, no hacemos nada, pero si tiene opción de salto, la tratamos
   ; Comprobamos el bit 4
   ; Si no es cero, ponemos WORD1 al parámetro
   ; No se hace a través de 99AA porque 98cb no se incrementa en este caso ni se
   ; continúa procesando el script actual
L_9994: BIT 4, (IX+$00)       ; 9994 DD CB 00 66   ; Esta a 1 el bit 4 de (IX+$00)?
   JP Z, L_9901       ; 9998 CA 01 99   ; Si Z = 1, Salta a L_9901
   LD L, (IX+$02)       ; 999B DD 6E 02   ; Carga L con (IX+$02)
   LD H, (IX+$03)       ; 999E DD 66 03   ; Carga H con (IX+$03)
   LD (IY+$02), L       ; 99A1 FD 75 02   ; Carga (IY+$02) con L
   LD (IY+$03), H       ; 99A4 FD 74 03   ; Carga (IY+$03) con H
   ; Saltamos a 9901 (siguiente elemento de script)
   JP L_9901       ; 99A7 C3 01 99   ; Salta a L_9901
   
; Auxiliar que comprueba si hay salto extra en una instrucción para ponerlo en WORD1
; y continuar ejecutando este script desde ese punto.
; Además incrementa 980b (aunque no haya salto). Si llega a 6 la rutina principal
; #221# para la ejecución de este script y pasa al del siguiente personaje

; Script_ExtraJump   
L_99AA:
   ; *980b++
   LD HL, L_980B       ; 99AA 21 0B 98   ; Carga HL con L_980B
   INC (HL)       ; 99AD 34      ; Incrementa (HL)

   ; Si el bit 4 de la instrucción es 0 salta a 987f (procesa la siguiente instrucción de este
   ; script).
   BIT 4, (IX+$00)       ; 99AE DD CB 00 66   ; Esta a 1 el bit 4 de (IX+$00)?
   JP Z, L_987F       ; 99B2 CA 7F 98   ; Si Z = 1, Salta a L_987F
   
   ; Si está a 1 pone el parámetro extra en WORD1 y salta a 9885, que es igual que 987f, pero
   ; se ahorra poner el registro HL, porque ya viene cargado a WORD1
   ADD IX, DE       ; 99B5 DD 19      ; Adiciona DE en IX
   LD H, (IX+$01)       ; 99B7 DD 66 01   ; Carga H con (IX+$01)
   LD L, (IX+$00)       ; 99BA DD 6E 00   ; Carga L con (IX+$00)
   LD (IY+$02), L       ; 99BD FD 75 02   ; Carga (IY+$02) con L
   LD (IY+$03), H       ; 99C0 FD 74 03   ; Carga (IY+$03) con H
   JP L_9885       ; 99C3 C3 85 98   ; Salta a L_9885



; Rutina que implementa el comando de script JumpRandom (o como se llame) comando 15 (0xf).
; Prepara un aleatorio adecuado y sigue la ejecución en la ruina 226
; Script_JumpRandom

                     ; (#225# --)
L_9A59:
   ; A=min(parametro, tamaño de directorio)
   LD A, (IX+$01)       ; 9A59 DD 7E 01   ; Carga A con (IX+$01)
   CP (IY+$01)       ; 9A5C FD BE 01   ; Compara A con (IY+$01)
   JR C, L_9A64       ; 9A5F 38 03      ; Si C = 1, Salta a L_9A64
   LD A, (IY+$01)       ; 9A61 FD 7E 01   ; Carga A con (IY+$01)
   
   ; Toma un aleatorio entre 0 y A y lo guarda en E
L_9A64: CALL GetPosRandom    ; 9A64 CD 9F 9C   ; llama rutina GetPosRandom (retorna en A y Carry a 1 si salió negativo)
   LD E, A          ; 9A67 5F      ; Carga E con A


; Esta rutina implementa la activación de un script del directorio del personaje actual. Se pasa en E el
; Número de entrada a la que se salta.
; Se llama cuando el comando es >4 pero no se reconoce
; Script_ResetToE   
                     ; (#226# --)
L_9A68:
   ; A=min(E,tamaño de directorio)
   LD A, (IY+$01)       ; 9A68 FD 7E 01   ; Carga A con (IY+$01)
   CP E          ; 9A6B BB      ; Compara A con E
   JR NC, L_9A6F       ; 9A6C 30 01      ; Si C = 0, Salta a L_9A6F
   LD E, A          ; 9A6E 5F      ; Carga E con A
   
   ; Tomamos WORD2 (dirección del directorio) en HL
   ; Y avanzamos E entradas: HL+=E*3
L_9A6F: LD L, (IY+$04)       ; 9A6F FD 6E 04   ; Carga L con (IY+$04)
   LD H, (IY+$05)       ; 9A72 FD 66 05   ; Carga H con (IY+$05)
   LD D, $00       ; 9A75 16 00      ; Carga D con $00
   ADD HL, DE       ; 9A77 19      ; Adiciona DE en HL
   ADD HL, DE       ; 9A78 19      ; Adiciona DE en HL
   ADD HL, DE       ; 9A79 19      ; Adiciona DE en HL

   ; HL++ para apuntar al puntero al script de esa entrada
   INC HL          ; 9A7A 23      ; Incrementa HL
   
   ; Tomamos la dirección y la ponemos en WORD1
   LD E, (HL)       ; 9A7B 5E      ; Carga E con (HL)
   INC HL          ; 9A7C 23      ; Incrementa HL
   LD D, (HL)       ; 9A7D 56      ; Carga D con (HL)
   LD (IY+$02), E       ; 9A7E FD 73 02   ; Carga (IY+$02) con E
   LD (IY+$03), D       ; 9A81 FD 72 03   ; Carga (IY+$03) con D
    RET          ; 9A84 C9      ; Retorna


; Auxiliar que toma la entrada en HighLevel_Dirs para un personaje determinado pasado en A
; Devuelve A=$ff si no lo encuentra, A=Personaje si lo encuentra.
; Script_GetPNJEntry
                     ; (#194# --)
L_9A85: PUSH DE          ; 9A85 D5      ; Guarda DE
   PUSH BC          ; 9A86 C5      ; Guarda BC

   ; Buscamos en HighLevel_Dirs la entrada para el personaje pasado en A
   ; mientras (*HL!=Peronaje && *HL!=$ff) HL+=7;
   LD B, A          ; 9A87 47      ; Carga B con A
   LD HL, HighLevel_Dirs    ; 9A88 21 CB CA   ; HL apunta a HighLevel_Dirs
   LD DE, $0007       ; 9A8B 11 07 00   ; offset entre bloques
L_9A8E: LD A, (HL)       ; 9A8E 7E      ; Carga A con (HL)
   CP B          ; 9A8F B8      ; Compara A con B
   JR Z, L_9A9A       ; 9A90 28 08      ; Si Z = 1, Salta a L_9A9A
   CP $FF          ; 9A92 FE FF      ; Compara A con $FF
   JR Z, L_9A9A       ; 9A94 28 04      ; Si Z = 1, Salta a L_9A9A
   ADD HL, DE       ; 9A96 19      ; Adiciona DE en HL
   JP L_9A8E       ; 9A97 C3 8E 9A   ; Salta a L_9A8E
   
   ; O bien lo encontramos, A=Personaje, o bien no, A=$ff. IY=HL y Retornamos.
L_9A9A: POP BC          ; 9A9A C1      ; Recupera BC
   POP DE          ; 9A9B D1      ; Recupera DE
   PUSH HL          ; 9A9C E5      ; Guarda HL
   POP IY          ; 9A9D FD E1      ; Recupera IY
   RET          ; 9A9F C9      ; Retorna

; Rutina que implementa el comndo REWIND_AND_SET_ENTRY (comando 12 o 0x0d)
; En B viene el parámetro y en A el código del personaje
; El parámetro es el tipo de entrada del directorio (entradas del directorio son 3 bytes <tipo><puntero>)
; Script_RewindAndSetEntry
                     ; (#212# --)
L_9AA0: PUSH IY          ; 9AA0 FD E5      ; Guarda IY
   PUSH IX          ; 9AA2 DD E5      ; Guarda IX

   ; Script_GetPNJEntry
   CALL L_9A85       ; 9AA4 CD 85 9A   ; llama rutina L_9A85 (#194# --)
   
   ; Si no encontrado salta al final y vuelve
   CP $FF          ; 9AA7 FE FF      ; Compara A con $FF
   JR Z, L_9AC8       ; 9AA9 28 1D      ; Si Z = 1, Salta a L_9AC8

   ; Tomamos WORD2 en IX
   LD L, (IY+$04)       ; 9AAB FD 6E 04   ; Carga L con (IY+$04)
   LD H, (IY+$05)       ; 9AAE FD 66 05   ; Carga H con (IY+$05)
   PUSH HL          ; 9AB1 E5      ; Guarda HL
   POP IX          ; 9AB2 DD E1      ; Recupera IX

   ; buscamos en el directorio una entrada de código B
   LD A, B          ; 9AB4 78      ; Carga A con B
   CALL FindPointer    ; 9AB5 CD BD 9D   ; busca puntero con código A e inicio tabla en IX

   ; Si no lo encontramos salimos
   CP $FF          ; 9AB8 FE FF      ; Compara A con $FF
   JR Z, L_9AC8       ; 9ABA 28 0C      ; Si Z = 1, Salta a L_9AC8

   ; Si lo encontramos guardamos el puntero en WORD1 y salimos
   LD L, (IX+$01)       ; 9ABC DD 6E 01   ; Carga L con (IX+$01)
   LD H, (IX+$02)       ; 9ABF DD 66 02   ; Carga H con (IX+$02)
   LD (IY+$02), L       ; 9AC2 FD 75 02   ; Carga (IY+$02) con L
   LD (IY+$03), H       ; 9AC5 FD 74 03   ; Carga (IY+$03) con H
L_9AC8: POP IX          ; 9AC8 DD E1      ; Recupera IX
   POP IY          ; 9ACA FD E1      ; Recupera IY
   RET          ; 9ACC C9      ; Retorna



Fijo que hay algún gazapo... espero que no muchos...

En cuanto a algunas direcciones:
980b Contador de acciones realizadas esta vez (?) en un script. Si llega a 6, el script se planifica y entra el del siguiente personaje.
980c Flag que vale 0,1 o 2 para controlar si se pone "You hear a noise" si un Personaje hace algo al lado tuyo y está a oscuras
980d Se usa en 99c6... a ver si la descifro pronto.

L_B6E6 Se pone en L_79D9 a la acción actual y sólo se consulta en L_A8AB para poner modificar la entrada del script de Bard en C9E3 modificando la acción y los objetos de esta entrada ACCION(take, wooden chest, $FF)

Una cosa. En la última versión del fichero que miré, faltaba una rutina por cambiar su etiqueta por su nombre:
L_9F82 GetObjectLocation

En cuanto quite unas cosas de delante, miro la rutina que comentas en el otro hilo.

Un saludo y ánimo que esto va tomando forma!

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 » 04 Dic 2014 19:50

Hola Chema,

todavía me queda tu post de ayer y ya atacas de nuevo ... jejeje -tatice_01
Me guardo éste también, para tratarlo a continuación del otro.
Como tengo guardados todos tus mensajes anteriores, para no tener que andar mirando en este formato insufrible de la web ...
Me los voy a tener que revisar todos por si hay mas palabras omitidas. -banghead

Por cierto, como Luis estableció al principio que la tabulación tenía que ser de 8 para encolumnar bien datos en el documento de trabajo
nos iría mejor si pudieras utilizar este mismo valor para el tabulador en los docs que pegues aquí en estos dos hilos en que trabajamos.
Cuando abro tus documentos (copiados de la web) me quedan horrorosamente mal encolumnados (los comentarios y el código en si)

Casi he acabado ya con la parrafada del otro hilo de consultas, con la salvedad de aquella bendita rutina que me escama mucho, mucho ... -beg

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

Mensajepor Chema » 04 Dic 2014 19:59

Tienes razón en que hace algo raro... De la llamada a GetNextObjAndID aprovecha el flag Z que es 1 si era la última entrada (vuelve con A=$ff de paso). La rutina busca dentro de una tabla de tres entradas, pero ¿estás seguro de que IX apunta a la tabla ObjIndexTable en ese punto? Porque si es así, no tiene sentido, como dices.

No sé... miraré más en profundidad...

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 » 04 Dic 2014 20:04

Echaré un vistazo a la configuración de mi editor a ver qué pasa con los tabuladores...

Una cosa. En la rutina anterior, si te fijas, el bit 5 en una instrucción indica que tras la ejecución se ponga dicha instrucción a 0, como para que no se ejecute más. De hecho existe una parte del código de la rutina grande que trata ese caso, pero está fuera de la parte que mira si el código de instrucción & 0f es menor o igual que 4.

O me equivoco o aquí hay algo raro, porque si es cero, entraría ahí y se trataría como un código de DoAction (tiene el bit 0 a 0) y nunca entraría en el caso externo que sí que mira si es una instrucción 0 (tras mirar si es $0d, $0f, $c...).

Podría ser un bug, o simplemente que se me escapa algo...

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 » 04 Dic 2014 20:09

buenoooooo
habrá que trazar hacia atrás para saber que es lo que se le asigna a IX
pero las tablas de 3 entradas son todas del tipo ID, puntero ...
Así que leer IX+$02 me da cierto yuyu
Espero haberme olvidado un a y que sea la que toca aquí!

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

Mensajepor luiscoco » 05 Dic 2014 15:00

Dios, no había visto este subforo, y ya lleva un mes, no entiendo como paso, y solo me descuide manos de una semana, para lo de mi plugin, valla, me tengo que poner al día, sera este fin.

Edito: Ahh ya entiendo, mucho viene del otro subforo, igual valla susto. jeje

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 » 05 Dic 2014 17:30

@Luis,

que sea leve muchacho -507
Esto de aquí, comparado con lo que habíamos estado haciendo es un super infierno -banghead
Yo puedo decirte que estoy descubriendo formas de programar que nunca antes había visto, está claro que estos estilos en el mundo empresarial serían motivo de despido inmediato!
Pero es muy interesante conocerlos porqué los podrías aplicar a otros juegos del estilo del Hobbit en máquinas con memoria escasa (como nuestros CoCo 2 y Dragón 32)

saludos
pere


Volver a “Proyecto The Hobbit 6809 por pser1”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados