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:
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:
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:
...