Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: AxelStone en 02 de Marzo de 2015, 04:34:44 pm



Título: Pensando seriamente en saltar a MSX-C / Pascal / ASM
Publicado por: AxelStone en 02 de Marzo de 2015, 04:34:44 pm
Quién me ha visto quién me ve. Hasta hace poco estaba más que contento con Turbo Basic (la curva de aprendizaje es impresionante, en poco tiempo das pasos de gigante) peeeero para el pequeño proyecto que tengo entre manos acabo de toparme con un muro de bruces: la limitación de 10Kb del Turbo Bloque. Por Dios, 10Kb limita mucho la lógica de un juego... Si bien me gustaría seguir con Turbo Basic no dejo de reconocer que si este límite me impide seguir adelante, daré el salto a otro lenguaje. Alternativas que he visto hay para MSX:

1.- MSX-C
 2.- Pascal
 3.- ASM

A ver, busco un lenguaje de propósito general (lo que buscaba con Basic vamos). Esto es, ya sé que el ASM es lo ideal para acceder a los recursos de la máquina, pero solo me apetece estudiar un lenguaje y usarlo para cualquier género (arcade, RPG, estrategia...). Imagino que en ASM implementar la lógica de un juego de estrategia debe ser muy complejo.

Partiendo de ese hecho, ¿alguien puede exponerme los pros y contras de cada uno? Gracias.

P.D.: ojalá no tenga que recurrir a ninguno, pero de verdad que los 10Kb del Turbo Basic me tienen asfixiado  :(


Título: Re:Pensando seriamente en saltar a MSX-C / Pascal / ASM
Publicado por: assembler en 15 de Marzo de 2015, 05:07:28 pm
No se si llegaré tarde, pero al menos aquí queda:



Cuando empecé con M-Tanks me hice la misma pregunta. De hecho, me emocionó ver que podría programar el MSX en Pascal.
Las primeras pruebas fueron en Pascal, pero salté pronto al C.

Tuve un par de problemas con el C, sobre todo porque no sabía donde iban colocandose los bloques de código, así que finalmente salté al ASM.

Teniendo cuidado en un par de detalles: igualar los push con los pop, por ejemplo, el ASM no es tan difícil.
Un truco que uso, y que simplifica mucho el código, teniendo en cuenta la ausencia de bloques: if (condicion) {...} else {...}, es usar diferentes etiquetas, aunque apunten al mismo sitio, y etiquetas que no se usan, pero que van dejando claro por donde vas:

Código:
  ld a,[buffer_teclado8]
   bit 5,a
   jr nz,.nopulsaarriba
.pulsaarriba:
   ld a,[estado_prota]
   and 11110000b ;7-cayendo,6-disparando,5-en escalera,4-saltando...
   jr nz,.nopuedesaltar
.puedesaltar:
   call salto ;aquí se podría hacer un call nz,salto, y quitar el jr anterior... todo depende de lo claro que lo veas y de lo justo que vayas de memoria
.nopuedesaltar:
.nopulsaarriba:
   ;continuamos con el movimiento del prota...

También es bastante sencillo implementar los "switch" de C, siempre contemplando unos valores apropiados:
Código:
  ld a,[fase]
   or a ;case a=0
   jr z,.fase 0
   dec a ;case a=1
   jr z,.fase 1
   dec a ;case a=2
   ;jr z,.fase 2 <-Estas lineas se pueden ignorar, serían como el default del switch
;.fase 2:
   call inicializa_fase_2
   jr .fin_inicializa_fases
.fase_1:
   call inicializa_fase_1
   jr .fin_inicializa_fases
.fase_0:
   call inicializa_fase_0
   ;jr .fin_inicializa_fases  <-Aunque no es necesario dejarla, la suelo dejar comentada, para ver el codigo mas claro.
.fin_inicializa_fases:
   ...