asMSX, un listado de ejemplo no me funciona...

By friguron

Expert (82)

friguron's picture

14-03-2017, 16:23

Buenas, me ha entrado el gusanillo de programar cosas para MSX en ensamblador, ahora que tengo un cartucho GR8NET. Nunca lo hice en el pasado, hace decenios, y ahora me parece super entretenido...

Hasta ahora he ido mirando por internet algún tipo de cross compiler para MSX/z80 y el que mejor pinta parecería que tiene es el asMSX de robsy. Aparentemente no está muy vivo el proyecto a día de hoy y/o he visto varios forks del mismo.
Sea como sea, el caso es que me he bajado una versión desde code.google.com y aparentemente vienen dos binarios, uno para linux y otro para windows.

Estoy probando en entorno linux (un entorno con el que me siento cómodo). He cogido el binario asmsx y lo he puesto en un directorio del path (con lo que en principio debería valer para compilar, no?). Yo escribo "asmsx" y sale el típico mensaje de "dame un fichero de entrada para compilar". Hasta ahora todo bien, entiendo pues.

El caso es que usando como ejemplo sencillo el programa hola.asm que viene en el primer pdf del tutorial de Pepe Vila "iniciación a la programación en ensamblador", el ensamblador asmsx se atraganta, y se queja de "unknown identifier en la línea 12".

La versión simplificada (que estoy usando) de este programa, es esta:

;--------------------------------------------------------- 
; Nombre de nuestro programa
; Hola Mundo 
;--------------------------------------------------------- 
; DEFINIR CONSTANTES 
;---------------------------------------------------------
; no definimos ninguna constante

; Variables de sistema

       FORCLR equ F3E9h ; Foreground colour   <- EL ERROR SALTA AQUÍ

;---------------------------------------------------------
; DIRECTIVAS PARA EL ENSAMBLADOR ( asMSX ) 
;---------------------------------------------------------

        .bios         ; Definir Nombres de las llamadas a la BIOS
        .page 2       ; Definir la dirección del código irá en 8000h
        .rom          ; esto es para indicar que crearemos una ROM
        .start INICIO ; Inicio del Código de nuestro Programa


;---------------------------------------------------------

INICIO: 
; INICIO DEL PROGRAMA 

;---------------------------------------------------------

        call INIT_MODE_SC0  ; iniciar el mode de pantalla
        ;call IMPRI_MENSAJE  ; imprimir el mensaje en pantalla
FIN: 
        jp FIN              ; esto es como 100 goto 100

;---------------------------------------------------------

INIT_MODE_SC0:
; INICIALIZA EL MODO DE PANTALLA 

;---------------------------------------------------------
; BASIC: COLOR 15,0,0
; Establecer el fondo de color Negro

        ld hl,FORCLR
        ld [hl],15  ; Color del primer plano
        inc hl      ; blanco
        ld [hl],1   ; Color de fondo
        inc hl      ; negro
        ld [hl],1   ; Color de borde
                    ; negro

        call INITXT
        ret

La línea 12 es en la que se define una constante FORCLR.
Bien el caso es que compilando desde línea de comando con "asmsx hola.asm" el error es el que comentaba antes:

-------------------------------------------------------------------------------
 asMSX v.0.16 WIP. MSX cross-assembler. Eduardo A. Robsy Petrus [01/06/2010]
-------------------------------------------------------------------------------
Parsing file hola.asm
Expanding system macros
Assembling source file hola.asm
Assembling labels, calls and jumps
hola.asm, line 12: undefined identifier

El fichero .asm que estoy probando tiene algo mal? Debo añadir algún tipo de parámetro al ensamblador en la línea de comando? En principio no veo nada raro yo...

Saludos.

Login or register to post comments

By friguron

Expert (82)

friguron's picture

14-03-2017, 17:28

A todo esto, si voy al directorio "code" de la distribución de asmsx que me he bajado, aparecen varios ejemplos sencillos (pero ya mucho más complejos que el que colgué). Sea como sea, estos ejemplos compilan sin problema.

Quizás voy a tirar de ellos, y simplificarlos en vez del .pdf de Pepe Vila para fabricarme esqueletos vacíos de listados .asm con los que empezar.

En cualquier caso, el programa de ejemplo que colgué, no veo por qué no compila (seguramente por novato). Si alguien ve el error y me lo indica, le estaré agradecido.

Saludos.

EDIT: Lo encontré! Era un typo error (o no, no lo sé, en el PDF venía como yo lo puse en el post nº 1). El caso es que en la definición de la constante FORCLR, donde a la derecha vemos el f3e9h, resulta que debe ser precedido por un 0. Si no lo es, no compila... Una vez añadido todo va como la seda:

FORCLR equ F3E9h ; Foreground colour (esto da error)
FORCLR equ 0F3E9h ; Foreground colour (esto compila)

Saludos igualmente.

By friguron

Expert (82)

friguron's picture

14-03-2017, 18:27

Por cierto, dando vueltas y probando de todo, y por si acaso la versión del sistema operativo donde lo probaba tenía que ver, he acabado cogiendo el código fuente de asmsx, he corregido unos errores de compilación que aparecían en un fichero '.y' (en el que gcc se atragantaba), y finalmente he conseguido compilarlo con éxito (aparente) para macOS / OSX (Sierra). En el rato que llevo usándolo no parece dar ningún problema.
Bueno vale, a la hora de compilarlo han salido (literalmente) unos 150 warnings (de casts de punteros y así), pero en prinicpio no parecen estar interfiriendo.

Sea como sea, en estos momentos el binario 'asmsx' se me está ejecutando desde la línea de comandos de mi macOS / OSX, y aparentemente va de lujo.

Si alguien quiere el código fuente de asmsx adaptado para macOS / OSX (o el binario compilado), se lo paso sin problema.

Saludos.

By pitpan

Prophet (3131)

pitpan's picture

15-03-2017, 09:47

Hola,

Te dirán, seguramente, que hay mejores opciones que el asMSX y no lo niego.

En cualquier caso, el problema que tienes es que el código responde a una versión antigua de asMSX y se cambiaron algunas normas de formato. Basta con sustituir la línea

FORCLR equ F3E9h ; Foreground colour <- EL ERROR SALTA AQUÍ

Por esta otra:

FORCLR equ 0F3E9h ; Foreground colour

Los números hexadecimales pueden indicarse:
- Con prefijo: $XXXX
- Con sufijo: XXXXh, pero en este caso, el primer dígito hexadecimal tiene que ser un número (0-9). Si el hexadecimal empieza por un dígito que es una letra, habría que añadir un cero adicional, como te propongo en la corrección.

Espero que te sirva el apunte.

By friguron

Expert (82)

friguron's picture

15-03-2017, 13:34

Gracias, ya lo descubrí...

La verdad, de momento (y sorprendentemente), por facilidad de setup y de creación de ficheros .rom, asMSX es el ensamblador que más me está gustando, desde mac, con un Makefile es lo más cómodo de largo.

Me llama la atención que la sintaxis para leer de memoria en los ficheros .asm para asMSX es con corchete en vez de con paréntesis... Hay un standard para ensamblador Z80 ?

(ej: ld a,[hl] VS ld a,(hl) que es lo que había visto yo toda la vida)

Anyway, de momento los primeros pinitos los haré con asMSX, que para pillarle el qué al z80 y las limitaciones que surgen para programarlo en ASM, ya me valdrá. Si alguien me dice que use alguna otra combinación de progamas para meterme en el ajo, seré todo oidos.

Gracias igualmente.

By pitpan

Prophet (3131)

pitpan's picture

16-03-2017, 19:56

No, si yo soy el creador de asMSX, así que me lo hice a medida de mis necesidades y a mí siempre me ha ido bien Wink

La notación estándar de Zilog usa el paréntesis para las indirecciones en lugar de los corchetes. Sin embargo, para poder implementar aritmética compleja y funciones adicionales, opté por mantener reservar los paréntesis para funciones y operaciones matemáticas, y los corchetes para las indirecciones. Aprendí primero ensamblador para x86, que usaba esta sintaxis... Como te decía, me lo hice a medida de mis gustos y de acuerdo con mis preferencias.

Estoy contento de que te sirva. Además, como ahora es opensource, todo el mundo puede toquetearlo a su gusto metiéndole mano al código fuente. Necesitas saber un poco de C y ayuda bastante saber algo de Flex y Bison (herramientas GNU típicas: léxico y sintaxis).

En cualquier caso, lo importante es aprender lo mucho que se multiplican las capacidades de nuestros MSX cuando damos el salto del BASIC al ensamblador.

By pitpan

Prophet (3131)

pitpan's picture

16-03-2017, 20:03

Por cierto: creo que había una directiva por ahí para hacer que las indirecciones fueran paréntesis y no corchetes. Algo así como "zilog". A partir de esa pseudoinstrucción, se aplica la sintaxis tradicional del Z80, con los paréntesis para las indirecciones y, por lo tanto, los corchetes para las operaciones matemáticas. Lo incluí para ensamblar código escrito en otros programas de forma fácil.