[DRAGON] Toolchain para un entorno cruzado de compilación

BBC, Dragon, Sam Coupé, Oric ...
Avatar de Usuario
jltursan
Amiga 2500
Amiga 2500
Mensajes: 4028
Registrado: 13 Oct 2006, 19:45
Sistema Favorito: MSX
primer_sistema: Dragon
Ubicación: Serracines, Madrid, España
Gracias dadas: 57 veces
Gracias recibidas: 157 veces
Contactar:

[DRAGON] Toolchain para un entorno cruzado de compilación

Mensajepor jltursan » 27 Sep 2014, 18:48

Lo primero será descargar e instalar/descomprimir el software que vamos a necesitar:

1) Notepad++: http://notepad-plus-plus.org/
2) LWTOOLS: http://lwtools.projects.l-w.ca/contrib/tormod/
De este paquete sólo vamos a necesitar el ensamblador "lwasm"
3) DragonTools: http://sourceforge.net/projects/dragontools/
4) XRoar: http://www.6809.org.uk/xroar/
5) BOOTDISK.VDK: https://drive.google.com/file/d/0B-KmfO ... sp=sharing
Esta imagen de disco nos permitirá autoarrancar los programas que compilemos. Deberá guardarse siempre intacta. ¡Gracias a Zephyr y pser1 del archive.worldofdragon por el truco y echarme una manilla cuando estaba atascado! :-)

Una vez instalado el Notepad++ lo primero que haremos será configurar el resaltado de color para el ensamblador 6809. Para ello nos descargamos el siguiente archivo:
https://drive.google.com/file/d/0B-KmfO ... sp=sharing
Tras ello, iremos a "Language"->"Define your language..." y seleccionaremos "Import...". Navegamos hasta al archivo anterior y lo cargamos. Este es el momento de cambiar la extensión de los archivos que queramos tener con ensamblador 6809, yo los he definido como ".a09"; pero podéis poner lo que más os guste.
Para probarlo, podemos cargar un archivo con esa extensión y que contenga código 6809 y comprobaremos como queda resaltado. Como sugerencia, en "Settings"->"Style Configurator" he configurado lo siguiente:

Imagen

A continuación instalaremos el plugin "NppExec" desde "Plugins->Plugin Manager"->"Show Plugin Manager"

Imagen

El NPPExec nos permitirá definir macros para poder compilar y ejecutar nuestro código rápidamente. Para crear la macro, pulsamos F6 y en el diálogo que se nos abre, copiamos lo siguiente:

Código: Seleccionar todo

NPP_SAVE
set WD = $(CURRENT_DIRECTORY)
set EMUPATH = <ruta al XRoar>
cd $(WD)
cmd /c del PROG.BIN $(NAME_PART).vdk >NUL 2>&1
lwasm -f raw -o PROG.BIN $(FILE_NAME)
if $(EXITCODE) != 0 goto fin
cmd /c copy /Y BOOTDISK.VDK $(NAME_PART).vdk >NUL
DragonDos write $(NAME_PART).vdk PROG.BIN -native 24576 24576 -v
DragonDos dir $(NAME_PART).vdk
cd $(EMUPATH)
xroar -machine dragon64 -extbas d64_1.rom -altbas d64_2.rom -machine-cart dragondos -cart-rom ddos40.rom -disk-write-back -force-crc-match -joy-left 0,0:1:0 -kbd-translate -run $(WD)\$(NAME_PART).vdk
:FIN


Imagen

Unas observaciones sobre esta macro:

  • La macro deberá modificarse en función de las direcciones de carga y ejecución del ejecutable que compilemos. Ahora mismo ambas direcciones están fijadas a $6000 (24576), si las cambiamos deberemos tener en cuenta que la primera dirección es la de carga y la segunda la de ejecución. Posiblemente la macro se pueda mejorar para que capture el ORG desde nuestro codigo o a las malas nos pregunte por una dirección.
  • Los comandos lwasm y DragonDos deberán estar en el PATH. De no ser así, en la macro se deberá incluir la ruta completa incluyendo unidad.
  • La ruta que aparece como EMUPATH deberá cambiarse por la ruta en la que hatamos instalado el emulador XRoar. Incluirá la unidad de disco si es necesario.
  • El XRoar se da por configurado y deberá disponer de las roms para Dragon 64 y del DragonDos 4.0. Podemos cambiarlas a nuestro antojo.

Una vez introducida, le daremos un nombre en el combo inferior y la salvaremos.
Para convertirla en una macro completa nos iremos a "Plugins"->"NppExec"->"Advanced options...". Desplegamos el combo inferior, la seleccionamos, la añadimos a la lista de macros y salimos con "OK":

Imagen

Si hemos marcado la opción "Place to Macros submenu", nos podremos ir al menu "Macros" y encontraremos nuestra macro al final. Ya podemos seleccionarla y sin más debería ejecutarse compilando nuestra fuente y lanzando el resultado en el XRoar.
Para acabar, le vamos a asignar un atajo de teclado para que sea aún más cómoda de usar. Nos vamos a "Macro"->"Modify Shortcut/Delete Macro..." y en la categoria de "Plugin commands" buscamos nuestra macro (que suele andar por el final) y la modificamos para añadirle el atajo que queramos (en mi caso Ctrl+F9):

Imagen

Y ya hemos acabado, la macro se ejecutará al pulsar el atajo y en pocos segundos tendremos en ejecución el programa que estuviesemos editando.

Añadiendo filtros de consola

En la consola veremos como cuando compilamos aparecen todos los mensajes relativos a dicha compilación; eso incluye los errores que pueda encontrar el LWASM en nuestro código. Si queremos hacer más amigable la salida y depuración de los mismos, podremos definir "filtros de consola" en el NppExec. Más concretamente vamos a definir unos "Highlight Console Filters":

Pulsamos Shift + F6 y rellenamos las entradas tal como figuran en la captura:

Imagen

Importante: En la segunda de las entradas veremos que tras el tag %LINE% hay una zona en blanco antes del caracter '*'. Se trata de un blanco y un tabulador. Para poder generar eso lo más práctico es teclearlos en el modo edición con el propio NPP, copiarlos y luego pegarlos en la entrada correspondiente.

Estos filtros nos proporcionarán dos ventajas:

  • Los errores aparecerán resaltados en rojo en la consola.
  • Podremos navegar hasta el error directamente esté donde esté en nuestro código.

Para esto último, sólo tendremos que hacer doble clic con el ratón sobre la línea de la consola que contiene el número de línea con el código erróneo. Con los colores que se han definido como ejemplo, eso se haría clicando en la línea de color rojo intenso.

Si encontráis algún error, me lo váis indicando y ya se va corrigiendo el tuto ;-)
Última edición por jltursan el 29 Sep 2014, 19:37, editado 1 vez en total.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 53 veces
Contactar:

Re: [DRAGON] Toolchain para un entorno cruzado de compilació

Mensajepor mcleod_ideafix » 27 Sep 2014, 20:16

Ostras, ¡qué bueno! Y... una vez que tenemos esto, ¿cuál sería el "esqueleto" de un programa para el Dragon? Es decir:
- ¿Debemos reubicar el stack, o lo dejamos donde el sistema lo tenga?
- ¿Dónde se ubica el programa, es decir, qué valores se puede dar a ORG?
- ¿Cómo sería el esqueleto de un programa que instala un gestor para la interrupción enmascarable?
- ¿Es habitual llamar a la ROM para usar sus rutinas? En tal caso, ¿existe una lista de las llamadas más usuales, sus parámetros y lo que devuelven?
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
jltursan
Amiga 2500
Amiga 2500
Mensajes: 4028
Registrado: 13 Oct 2006, 19:45
Sistema Favorito: MSX
primer_sistema: Dragon
Ubicación: Serracines, Madrid, España
Gracias dadas: 57 veces
Gracias recibidas: 157 veces
Contactar:

Re: [DRAGON] Toolchain para un entorno cruzado de compilació

Mensajepor jltursan » 28 Sep 2014, 10:04

Jeje, en eso estamos. Mi primer paso ha sido crearme un entorno que me permita probar rápido cualquier experimento que vaya haciendo; luego ya iré viendo...
Tengo por casa un libro que me gusta bastante ya que toca la mayoría de los palos y resuelve prácticamente todas las dudas que expones: Inside the Dragon. Muy recomendable y sencillo de leer.

Hasta donde yo se, el Dragon no tiene BIOS y las rutinas del BASIC no se emplean frecuentemente. Los programas de CoCo suelen funcionar (excepto diferencias en el teclado y tal) en el Dragon y sus BASIC ROM son diferentes; así que no debe de ser habitual. El mapa de memoria del Dragon es el siguiente: http://dragon32.info/info/memmap.txt

Dejo aquí para que sirva de ejemplo el programa que he venido utilizando para probar, cortesía de Habi:

Código: Seleccionar todo

   Org   $6000   ;24576

Color   Equ   $AA10
Modo   Equ   $A938
Poll   Equ   $852B
Reset   Equ   $B3B4
Tmp   Equ   0   ;p.ej.

   ;Inicializamos; no toco DP=0

   ;PMode 4
   LdA   #4
   StA   $B6

   ;Modo gráfico
   ;DecA   ;No hace falta, Z=0
   Jsr   Modo

   ;Paleta 1
   IncB   ;LdB   #1
   Jsr   Color

   ;Fuera Int y FInt (por velocidad)
   OrCc   #%01010000

   ;Limpiar memoria de vídeo
   LdD   $Ba   ;Dirección de inicio del video,compatible con DOS
   Tfr   D,X
   AddA   #((6*1024)/256)   ;D+=6KB
   StD   Tmp
   DecB   ;LdB   #$FF
Bucle:
   StB   ,X+
   CmpX   Tmp
   Bne   Bucle

   ;Dibujamos
   LdY   #Tabla
   LdX   #((116-128*0)*256+(128*1+72))   ;Coordenada original
   LdA   #15   ;Nivel de recursión, para pixelado total: 1+2*Log2(128)
   PshS   X,A
   Bsr   Dibuja
   ;PulS   A,X   ;No hace falta, hay reseteo

   ;Esperamos tecla y reiniciamos
   Jsr   Poll
   Jmp   Reset

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;  Este algoritmo es una variación propia de un sistema IFS; en vez de iterar
;;un paseo aleatorio, calculo recursivamente todos los valores.
;;  Para ir rápido, utilizo el sistema de coordenadas final, es decir, centrado
;;en (72, 116) y con factor de escala de 128 (ya aplicado al centro).
;;  Al elegir la escala como potencia de 2 no cometemos errores de redondeo en
;;los píxeles ya que como veremos simplemente dividimos por dos. Por supuesto,
;;la coordenada Y va negada.
;;  El sistema empieza en (1, 0), desplazamiento en f2 (que pertenece a la
;;órbita). Sabiendo que Sen 45=Cos 45=Sen 135=-Cos 135=1/raiz(2), y que usamos
;;una escala de 1/raiz(2), se simplica todo en 1/2, como adelantamos.
;;  Por último, el algoritmo elimina la recursión final en una de sus llamadas,
;;por temas de optimización, y por todo lo dicho anteriormente puede utilizar
;;aritmética de 8 bits.

Dibuja:

pX   Equ   4   ;Posiciones en la pila
pY   Equ   3   ;Si cargamos D en Y, tenemos A=Y, B=X
pN   Equ   2

   ;1) Ploteo
   LdD   pY,S   ;Y, X
   LsrA
   RorB
   LsrA
   RorB
   LsrA
   RorB      ;/8
   AddD   $Ba   ;+Vídeo
   Tfr   D,X

   LdA   pX,S
   AndA   #7
   LdA   A,Y   ;1<<(7-X%8)

   BitA   ,X
   Beq   Salida   ;Ya estaba, generaría el mismo patrón
   EorA   ,X   ;Blanco <-> Negro
   StA   ,X   ;Ploteo

   ;2) Mirar / ajustar nivel
   Dec   pN,S
   Beq   Salida   ;Último nivel alcanzado

   ;3) Calcular (directamente el primer valor)
   LdB   pY,S   ;(Y+X-(116-72))/2
   AddB   pX,S
   RorB
   SubB   #((116-72)/2)   ;Es par, sale fuera y así opero en 8 bits + C

   LdA   pY,S   ;(Y-X+(116+72))/2   ;¿Más rápido que Tfr B,A ^?
   SubA   pX,S
   RorA
   AddA   #((116+72)/2)   ;idem arriba

   StD   pY,S

   ;4) Recursión

   ;Primera llamada, no final :/

   ;Creamos el marco de pila
   Tfr   D,X
   LdA   pN,S
   PshS   X,A

   Bsr   Dibuja

   ;Lo eliminamos
   PulS   A,X

   ;Segunda llamada

   ;Ajuste (a partir del valor previo)
   LdB   #(1*128-116+72)
   AddB   pY,S

   LdA   #(116+72)
   SubA   pX,S

   StD   pY,S

   ;Recursión final eliminada
   Bra   Dibuja

   ;Fin
Salida   Rts

Tabla   Fcb   $80,$40,$20,$10,$08,$04,$02,$01   ;Potencias de 2 al revés


Habiendo instalado el anterior entorno, sólo es cuestión de copiar, pegar y ejecutar. La dirección de arranque es la que se ha empleado de ejemplo en la macro: $6000. No es la más óptima. si el programa crece se puede bajar mucho más :-)

Avatar de Usuario
jltursan
Amiga 2500
Amiga 2500
Mensajes: 4028
Registrado: 13 Oct 2006, 19:45
Sistema Favorito: MSX
primer_sistema: Dragon
Ubicación: Serracines, Madrid, España
Gracias dadas: 57 veces
Gracias recibidas: 157 veces
Contactar:

Re: [DRAGON] Toolchain para un entorno cruzado de compilació

Mensajepor jltursan » 29 Sep 2014, 19:38

He añadido más información acerca de como definir filtros de resaltado en la consola del NPP :-)


Volver a “Otros microordenadores”

¿Quién está conectado?

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