Categorías
Programación

Hola mundo en .com con ensamblador sdas en c con sdcc

Introducción

Sdcc nos va permitir escribir código en c o en ensamblador y generará una serie de archivos.

Sdcc tiene dentro el ensamblador sdasz80, ver http://sdcc.sourceforge.net/ que permite compilar código escrito en ensamblador.

Puedes descargarte el código fuente del proyecto pinchando aquí.

Tendremos que crear un make (mira el punto 4) porque vamos a necesitar 4 pasos y no queremos escribir mucho.

Para poder trabajar con archivos .com tenemos que conocer sus rutinas ya que el msx sustituye el espacio de la bios y se lo deja al MSX-DOS en la RAM, pincha aquí para ver las rutinas.

En resumen haremos esto:

Contenido

Introducción. 1

1.Instalando SDCC.

2.Copiar y pegar el código para estudiarlo.

3.Compilando a z80 sdcc -mz80 –no-std-crt0 –code-loc 0x100 –data-loc 0x0 nombre_archivo.c 

4.Creando nuestro binario con hex2bin -e com nombre_archivo.ihx.

5.Probando nuestro juego.

6.Creando el Make para que haga todo el proceso anterior automáticamente.

7.Mejorando nuestro make.

7.1.Haciendo que se abra solo el openMSX.

7.2 Creando una carpeta para almacenar nuestros recursos y tenerlo organizado.

1.Instalando SDCC

Vamos a la web https://sourceforge.net/projects/sdcc/ o pinchamos aquí para descargar la versión de windows 64 bits para instalarnos el compilador de c para z80, al final de la instalación te dirá que va a incluir el path de sdcc en tu sistema, lo dejamos marcado:

Lo probamos abriendo un terminal y poniendo sdcc

2.Copiar y pegar el código para estudiarlo

1.Creamos una carpeta con el nombre hola mundo y dentro un archivo con el nombre de game.c y le pegamos este código:

Dentro del código es importante ver 4 cosas:

1.En las constantes numéricas se pone #

2.Los valores hexadecimales se le pone #0x

3.Las variables es expresan con .ascii y .db

4.Aunque no aparezca los registros ix del z80, se expresan ld a, 2(ix) en luga de ld a,(ix+2)

#include 
#include 

void main() 
{
  __asm //etiqueta de c que indica el cominedo de un bloque con lenguaje ensamblador
    ;imprime Hola MSX claro pio desde com
    ld    c,#9 ; le metemos el 9 en el registro c
    ld    de,#texto ; le metemos el texto en los registros de
    call  #0x0005 ;llamamos a la turina 0005
    ret
texto:    
    .ascii  " Hola MSX claro pio desde com$"
enter:
    .db #0x0d,#0x0a,'$' ;forma utilizada simpre para decirle que ha terminado el string   
  __endasm; //Etiqueta de c que indica el final de un bloque con lenguaje ensamblador
}


3.Compilando a z80 sdcc -mz80 –no-std-crt0 –code-loc 0x100 –data-loc 0x0 nombre_archivo.c

Ponemos: sdcc -mz80 –no-std-crt0 –code-loc 0x100 –data-loc 0x0 game.c

-mz80 :para indicarle el procesador

–no-std-crt0 : es para indicar que sdcc incluya el crt suyo de arranque, el tema de crt es complejo y lo veremos más adelante

–code-loc 0x100 :para indicarle la dirección de la ram en la que queremos iniciar nuestro código

–data-loc  0xc000 :la localización en la ram de las variables que es las rom se pone en 0xc000

game.c :es el archivo que queremos pasar a z80

Esto nos genera los archivos:

game.asm que es el código en ensamblador

game.ihx que es el código hexadecimal generado para intel, es el más importante

game.map las direcciones y los tamaños donde están nuestras instrucciones

game.rel es el código objeto o máquina

game.sym es para temas de depuración

4.Creando nuestro binario con hex2bin -e com nombre_archivo.ihx

Nuestro MSX solo lee archivos binarios (o secuencias de bytes) y el código que nos genera el sdcc es intel hexadecimal.

Una vez obtenidos los archivos hay que pasar el game.ihx a binario, esto se hace con el programa hex2bin (pincha aquí para bajarlo) tienes que copiarlo y pegarlo en el directorio de tu proyecto (1):

Después ponemos en el cmd y escribimos hex2bin -e com game.ihx (2) :

Después podremos ver que se ha generado el archivo game.com (3)

5.Probando nuestro juego

Tenemos que crear una carpeta llamada dsk en la raíz del proyecto y dentro le metemos los archivos command2.com y msxdos2.sys (descárgatelos pinchando aquí), para más información acerca del MSX-DOS mira el artículo “hola mundo desde com”, después pon el archivo game.com dentro de la carpeta dsk:

Ahora ya podemos probar nuestro rom en openMSX:

1 Selecciona la extensión msxdos2.

2 Pincha en Disk a y en Browse disk for disk folder y elige la ubicación de la caprta dsk de tu proyecto:

3.Pincha en Start:

6.Creando el Make para que haga todo el proceso anterior automáticamente

Creamos un nuevo archivo y lo llamamos make.bat (estos archivos son los ejecutables del cmd de windows), dentro ponemos:

@echo off 
rem con echo off quitamos los mensajes de nuestro código que puedan salir por la consola
rem Ponemos el nombre del programa al comienzo por si queremos cambiarlo
Set nombrePrograma=game

rem 1.compilamos nuestro programa c con el ensamblador embebido
sdcc -mz80 --no-std-crt0 --code-loc 0x100 --data-loc 0x0 %nombrePrograma%.c 

rem 2. Creamos el binario para MSX con el programa hex2bin
hex2bin -e com %nombrePrograma%.ihx 

,Vamos a probar que funciona el make.bat, recuerda tener el openMSX cerrado, para probar vamos a borrar todos los archivos que tengan game.* menos game.c:

Al escribir make.bat en el terminal, haremos los pasos anteriores automáticamente:

7.Mejorando nuestro make

1.Haremos que el openMSX se abra solo.

2.Crearemos una carpeta para almacenar nuestros recursos.

7.1.Haciendo que se abra solo el openMSX

OpenMSX puede ejecutar scripts para eso tan solo tenemos que crear un archivo txt y ponerle la configuración que queramos, vamos a crear un directorio llamado openMSX y dentro creamos el archivo emul_start_config.txt, dentro ponemos este texto:

machine Philips_NMS_8255 
ext msxdos2 
ext gfx9000 
bind F12 cycle videosource
plug joyporta mouse 
plug printerport simpl 
diska dsk/ 

Ahora en el make.bat añadimos este texto al final:

rem 3.Despues de crear el archivo emul_start_config.txt abrimos el openMSX
rem en los archivos .bat se crean las constantes con set
rem Esta es mi ruta donde tengo mi openMSX, si lo has instalado lo tendrás en C:\Program Files\openMSX\openmsx.exe
Set rutaOpenMSX=C:\Users\Casa\Desktop\openmsx-0.15.0-windows-vc-x64-bin\openmsx.exe
Set rutaScriptOpenMSX=openMSX\emul_start_config.txt
Set procesoOpenMSX=openmsx.exe
rem tasklist muestra una lista de procesos que se está ejecutando en el equipo, por favor pon tasklist /? en el cmd
rem find busca una cadena ed texto en uno o más archivos, por favor pon find /? en el cmd
tasklist | find /i "%procesoOpenMSX%">nul  && (echo %procesoOpenMSX% openMSX ya esta arrancado) || start %rutaOpenMSX% -script %rutaScriptOpenMSX% 

7.2 Creando una carpeta para almacenar nuestros recursos y tenerlo organizado

Abrimos el make.bat y le ponemos esto al final:

rem 4.creando una carpeta para mover nuestros recursos
If not exist .\resources md .\resources
rem le ponemos el nombre a nuestro programa
rem lo movemos a resources, por favor pon move /? o @move /? en el cmd
move %nombrePrograma%.asm ./resources
rem move %nombrePrograma%.bin ./resources
move %nombrePrograma%.ihx ./resources
move %nombrePrograma%.lk ./resources
move %nombrePrograma%.lst ./resources
move %nombrePrograma%.map ./resources
move %nombrePrograma%.noi ./resources
move %nombrePrograma%.rel ./resources
move %nombrePrograma%.sym ./resources

Puedes descargarte el código fuente del proyecto pinchando aquí.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *