Assembler Development Kit de Metacomco

Subforo oficial del Sinclair QL: realiza aquí las consultas relativas a tu QL.

Moderador: Sir Cilve Sinclair

Zerover
Jack The Nipper
Mensajes: 112
Registrado: Mar Abr 08, 2008 9:00 am

Assembler Development Kit de Metacomco

Mensaje por Zerover » Dom Nov 02, 2008 12:46 pm

Hay varios hilos en los que se habla del ensamblador y pienso que esto puede interesar (aunque la noticia la podía haber dado el 16 de agosto de 2007 :oops: pido perdón si esto ya se ha hablado y yo me he enterado ahora).

Los que tengáis el ensamblador de Metacomco y no tengáis el libro del kit de desarrollo podéis descargarlo en http://it.groups.yahoo.com/group/sinclair-italy/files/.

A los que no tengáis ese software también os puede venir bien como libro instructivo.

afx
Sabreman
Mensajes: 396
Registrado: Dom Feb 24, 2008 10:56 pm

Re: Assembler Development Kit de Metacomco

Mensaje por afx » Lun Nov 03, 2008 7:03 pm

Gracias Zerover por el enlace. A ver si poco a poco se va escaneando todo ese material del QL.

Con respecto al ensamblador, nunca me he atrevido a profundizar mucho. Para los que son como yo (que no van más allá del C o del Basic) no estaría mal que alguien (??) nos hiciera un pequeño tutorial del tipo "guía para torpes" (o guía para burros :) ) de todo el proceso de ensamblar, enlazar, ... en el QL un pequeño programa del tipo "Hola Mundo", empleando un ensamblador como el de Metacomco. (A ver si algunos de los expertos en ensamblador se anima a ello).

PD:
Se que es mucha cara, pero lo digo para no tener que leer medio capítulo del manual para sólo compilar algo muy simple ( ... es que habemos algunos que padecemos de "gandulería" extrema :cry: ).


Saludos.

Zerover
Jack The Nipper
Mensajes: 112
Registrado: Mar Abr 08, 2008 9:00 am

Re: Assembler Development Kit de Metacomco

Mensaje por Zerover » Vie Nov 07, 2008 10:28 am

Aquí está el HolaMundo.

Código: Seleccionar todo

MT_FRJOB EQU $05
IO_SSTRG EQU $07

         LEA.L SALUDO,A3         apuntamos a la frase a escribir con A3
         MOVE.W (A3),D2          número de octetos a mandar
         MOVEQ.L #-1,D3          periodo de espera infinito
         MOVEA.L #$00010001,A0   identificador del canal #1
         LEA.L 2(A3),A1          apuntar a la cadena de octetos
         MOVEQ.L #IO_SSTRG,D0    enviar la cadena de octetos (Send STRinG)
         TRAP #3                 Traps de E/S

         RTS                     vuelve a SuperBASIC

SALUDO   DC.W 12                 las cadenas de texto van precedidas por un número de tamaño W indicando la longitud
         DC.B 'Hola, Mundo.'

         END

Lo editáis con flp1_ed y lo grabáis en el fichero flp2_holamundo_asm, por ejemplo.

Lo compiláis con flp1_asm dándole el nombre flp2_holamundo_bin.

Este código se ejecuta con CALL desde SuperBASIC.

Código: Seleccionar todo

10 hola = RESPR(40)
20 LBYTES flp2_holamundo_bin,hola
30 CALL hola

Zerover
Jack The Nipper
Mensajes: 112
Registrado: Mar Abr 08, 2008 9:00 am

Re: Assembler Development Kit de Metacomco

Mensaje por Zerover » Vie Nov 07, 2008 10:42 am

Esta es la versión ampliada para poder ser ejecutada con EXEC.

Código: Seleccionar todo

MT_FRJOB EQU $05
IO_SSTRG EQU $07

         LEA.L SALUDO,A3         apuntamos a la frase a escribir con A3
         MOVE.W (A3),D2          número de octetos a mandar
         MOVEQ.L #-1,D3          periodo de espera infinito
         MOVEA.L #$00010001,A0   identificador del canal #1
         LEA.L 2(A3),A1          apuntar a la cadena de octetos
         MOVEQ.L #IO_SSTRG,D0    enviar la cadena de octetos (Send STRinG)
         TRAP #3                 Traps de E/S

         MOVEQ.L #-1,D1          tarea actual
         MOVEQ.L #0,D3           ningún error
         MOVEQ.L #MT_FRJOB,D0    forzar el final de la tarea (Force Release JOB)
         TRAP #1                 Traps de gestión de procesos

         RTS                     vuelve a SuperBASIC (poniendo esta línea el programa se podrá ejecutar de las dos maneras - CALL y EXEC)

SALUDO   DC.W 12                 las cadenas de texto van precedidas por un número de tamaño W indicando la longitud
         DC.B 'Hola, Mundo.'

         END

Se compila de igual forma y se ejecuta con

Código: Seleccionar todo

EXEC_W flp2_holamundo_bin

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Assembler Development Kit de Metacomco

Mensaje por badaman » Vie Nov 07, 2008 5:29 pm

¿Que ensamblador estás usando? ¿el de GST?

El ASM de Metacomco que yo tengo tienen sólo estos archivos:

asma_ovl
asmb_ovl
asmc_ovl
asm_metacomco

El de Computer One tiene menos archivos si cabe:

c1ass

¿ed es un editor externo quizás? Yo uso qed, que supongo que sirve igual.

Con el asm de metacomco además me da un error al compilar:

Código: Seleccionar todo

****** Warning: 'END' statement missing.


¿Será alguna peculiaridad del propio ensamblador?
Sinclair QL, la respuesta profesional de los 80

Zerover
Jack The Nipper
Mensajes: 112
Registrado: Mar Abr 08, 2008 9:00 am

Re: Assembler Development Kit de Metacomco

Mensaje por Zerover » Vie Nov 07, 2008 7:16 pm

badaman escribió:¿Que ensamblador estás usando? ¿el de GST?

El ASM de Metacomco que yo tengo tienen sólo estos archivos:

asma_ovl
asmb_ovl
asmc_ovl
asm_metacomco

El de Computer One tiene menos archivos si cabe:

c1ass
Lo he hecho de cabeza mirando el libro. Según lo que he leído debería haber por lo menos cuatro ficheros: ed, asm, linker e install. Cierto es que el libro menciona algo de tres overlays, y que no caben los tres a la vez en memoria en un QL básico, pero no explica el funcionamiento, supongo que eso viene en la guía del usuario. Yo no tengo el de Metacomco, tengo el de GST y es ligeramente diferente.

badaman escribió:¿ed es un editor externo quizás? Yo uso qed, que supongo que sirve igual.
Precisamente el editor que viene con el GST es el de Metacomco y he podido comprobar que el capítulo dedicado a su uso es igual. Pero vale cualquier editor de texto plano y, por lo menos con GST, hay que guardar con extensión _asm.

badaman escribió:Con el asm de metacomco además me da un error al compilar:

Código: Seleccionar todo

****** Warning: 'END' statement missing.


¿Será alguna peculiaridad del propio ensamblador?


:oops: Olvidé poner el END al final.
EDITO: He estado revisando el código y no olvidé ponerlo. No sé por qué dio el error.
Última edición por Zerover el Vie Nov 07, 2008 11:34 pm, editado 1 vez en total.

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Assembler Development Kit de Metacomco

Mensaje por badaman » Vie Nov 07, 2008 7:41 pm

asumo que el "asm" puede ser el mismo que "asm_metacomco" renombrado, pero ed y link no los tengo. Veré como hacerme de ellos.

Respecto al END, yo lo he añadido al final, tal cual esta en el listado, y da el mismo Warning. ¿A que END se refiere entonces?
Sinclair QL, la respuesta profesional de los 80

afx
Sabreman
Mensajes: 396
Registrado: Dom Feb 24, 2008 10:56 pm

Re: Assembler Development Kit de Metacomco

Mensaje por afx » Sab Nov 08, 2008 11:47 am

¡¡Yuhuuu!! .... :D ... ¡¡ Funciona !!

¡¡Gracias Zerover!!.

Fue todo bien a la primera. A mi no me da ese warning que comenta badaman.


PD:
Un buen principio para empezar a tirar del hilo. A ver si a estas alturas ahora (después de viejos) nos vamos a enganchar al ensamblador ... :roll:

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Assembler Development Kit de Metacomco

Mensaje por badaman » Sab Nov 08, 2008 6:57 pm

Salvador Merino me informa que en el volumen 2, numero 2 de la revista QLave está disponible una amplia introducción en castellano al uso del ensamblador de Metacomco que bien puede servir de manual del programa.

Descarga directa: http://www.speccy.org/sinclairql/qlave/ ... o_1986.pdf

A veces no sabemos ni lo que tenemos.
Sinclair QL, la respuesta profesional de los 80

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Assembler Development Kit de Metacomco

Mensaje por badaman » Dom Nov 09, 2008 3:49 am

Zerover escribió:Olvidé poner el END al final.
EDITO: He estado revisando el código y no olvidé ponerlo. No sé por qué dio el error.

Bueno, despues de largo rato de pruebas con el ensamblador ya he dado con el problema.

Probé inicialmente a dejar una línea detrás de END y compilarlo, pero el error obtenido era el mismo de antes, por lo que descarté este problema.

Seguidamente pedí al ensamblador que me volcase el listado de compilación, lo que me devolvió un nuevo error:

Código: Seleccionar todo

PAGE 1   QL MACRO ASSEMBLER VERSION 1.7                                           

  LOC        OBJECT          STMT             SOURCE STATEMENT

      =0005                     1 MT_FRJOB EQU $05
      =0007                     2 IO_SSTRG EQU $07
                                3
                           E    4          LEA.L SALUDO,A3         apuntamos a la frase a escribir con A3
0000'  3413                     5          MOVE.W (A3),D2          número de octetos a mandar
0002'  76FF                     6          MOVEQ.L #-1,D3          periodo de espera infinito
0004'  207C 0001 0001           7          MOVEA.L #$00010001,A0   identificador del canal #1
000A'  43EB 0002                8          LEA.L 2(A3),A1          apuntar a la cadena de octetos
000E'  7007                     9          MOVEQ.L #IO_SSTRG,D0    enviar la cadena de octetos (Send STRinG)
0010'  4E43                    10          TRAP #3                 Traps de E/S
                               11
0012'  72FF                    12          MOVEQ.L #-1,D1          tarea actual
0014'  7600                    13          MOVEQ.L #0,D3           ningún error
0016'  7005                    14          MOVEQ.L #MT_FRJOB,D0    forzar el final de la tarea (Force Release JOB)
0018'  4E41                    15          TRAP #1                 Traps de gestión de procesos
                               16
001A'                          17
PAGE 2   QL MACRO ASSEMBLER VERSION 1.7              ERROR-DIAGNOSTICS           



E097 on line    4: Undefined Symbol in Operand Field


   1 error found in this Assembly

Pensé que el problema serían los comentarios, quizás a causa de los acentos o el tipo de codificación de caracteres, así pues eliminé todos los comentarios y compiló sin problemas.

Probé entonces a sustituir los acentos y otros simbolos por letras sin acentuar, pero el error volvió.

Repasé los comentarios para ver que cosa podría dar error, y me fijé que en el listado de compilación el código se interrumpía en la línea 17:

Código: Seleccionar todo

         RTS                     vuelve a SuperBASIC (poniendo esta línea el programa se podrá ejecutar de las dos maneras - CALL y EXEC)

Descarté los paréntesis como posible causa del problema, pues ya en otras lineas los había y no daban error.

Probé entonces a sustituir las palabras "CALL" y "EXEC" que aparecen al final de esa línea y por fin la cosa funcionó, y compiló correctamente, sin errores ni warnings.

De alguna forma el ensamblador interpreta estas palabras en el comentario (o son palabras reservadas) y produce un error.

Así pues, para que el programa compile correctamente en el emsamblador de Metacomco, almenos en la versión 1.7 que es la que yo tengo, debemos quitar esas palabras del comentario.

Por cierto, el error de la línea 4:

Código: Seleccionar todo

                           E    4          LEA.L SALUDO,A3         apuntamos a la frase a escribir con A3
..
E097 on line    4: Undefined Symbol in Operand Field

Imagino que se da porque al cortarse el programa en la línea 17 no llega a definirse "SALUDO".

Y con el warning:

Código: Seleccionar todo

****** Warning: 'END' statement missing

Tres cuartos de lo mismo.
Última edición por badaman el Dom Nov 09, 2008 4:56 am, editado 1 vez en total.
Sinclair QL, la respuesta profesional de los 80

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Assembler Development Kit de Metacomco

Mensaje por badaman » Dom Nov 09, 2008 4:48 am

Bueno, pues otro error que me aparece, esta vez al ejecutar el programa:

Zerover escribió:Este código se ejecuta con CALL desde SuperBASIC.

Código: Seleccionar todo

10 hola = RESPR(40)
20 LBYTES flp2_holamundo_bin,hola
30 CALL hola

Me dice:

Código: Seleccionar todo

En línea 30 no finalizado

Aunque el mensaje "Hola, Mundo." aparece correctamente.

Los cambios que yo he realizado al programa en las líneas 10 y 20 no alteran su funcionamiento:

Código: Seleccionar todo

10 hola = RESPR(48)
20 LBYTES holamundo_bin,hola
30 CALL hola

Reservo 48 bytes pues es el tamaño de mi ejecutable una vez compilado.

si usamos:

Código: Seleccionar todo

EXEC holamundo_bin

El programa funciona perfectamente.

El error entonces debe estar en el propio código o en su defecto en el resultado compilado.
Sinclair QL, la respuesta profesional de los 80

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Assembler Development Kit de Metacomco

Mensaje por radastan » Dom Nov 09, 2008 9:38 am

badaman escribió:El error entonces debe estar en el propio código o en su defecto en el resultado compilado.


El problema está en el propio código, hay que generar una respuesta a la llamada para que no de error en SuperBASIC al volver. Es decir, poner a cero el registro D0 con:

CLR.L D0

Hazlo justo antes del RST.

El registro D0 es usado por SuperBasic como registro de error, si no lo pones a cero antes de volver... error.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

afx
Sabreman
Mensajes: 396
Registrado: Dom Feb 24, 2008 10:56 pm

Re: Assembler Development Kit de Metacomco

Mensaje por afx » Dom Nov 09, 2008 11:11 am

badaman escribió:De alguna forma el ensamblador interpreta estas palabras en el comentario (o son palabras reservadas) y produce un error.
Efectivamente ahora recuerdo, a mi no me falló porque desde el primer momento quité esos comentarios (el editor me metió basura al copiar y pegar).

radastan escribió:CLR.L D0
Hazlo justo antes del RST.
OK, ahora ningún problema al invocar la versión "exec" desde SuperBasic. La primera versión de Zerover no da ese mensaje de error aunque no se ponga CLR,L D0 ... ¿por qué?

Una duda más. Desde el basic yo uso

Código: Seleccionar todo

10 LRESPR flp1_holamundo_bin

Con la versión original del programita SuperBasic que utiliza "LBYTES ... CALL ..." me da un error si tengo otros programas residentes (como PE, Qascade, ..). Tengo que eliminar todos esos jobs para que funcione esa versión (con LRESPR ningún problema).

En teoría, ¿no es equivalente usar "LRESPR" a "LBYTES ... CALL"? ¿Cual es la diferencia entonces?

Zerover
Jack The Nipper
Mensajes: 112
Registrado: Mar Abr 08, 2008 9:00 am

Re: Assembler Development Kit de Metacomco

Mensaje por Zerover » Dom Nov 09, 2008 1:16 pm

badaman escribió:Bueno, pues otro error que me aparece, esta vez al ejecutar el programa:

Zerover escribió:Este código se ejecuta con CALL desde SuperBASIC.

Código: Seleccionar todo

10 hola = RESPR(40)
20 LBYTES flp2_holamundo_bin,hola
30 CALL hola

Me dice:

Código: Seleccionar todo

En línea 30 no finalizado

Aunque el mensaje "Hola, Mundo." aparece correctamente.

Antes de volver a SuperBASIC hay que poner en D0 el código de error, en este caso devuelve como error el error que se hubiera producido al llamar al TRAP #1. Si se llama con EXEC se ejecuta con su propio número de tarea y si se llama con CALL desde SuperBASIC es la tarea 0. La función MT.FRJOB fuerza el borrado de una tarea excepto si es la tarea 0 (SuperBASIC), por eso da error al usar el programita con CALL. Para este caso debería haber puesto D0 a 0 explícitamente:

Código: Seleccionar todo

         ...
         TRAP #1

         MOVEQ.L #0,D0
         RTS


afx escribió:La primera versión de Zerover no da ese mensaje de error aunque no se ponga CLR,L D0 ... ¿por qué?

En el primer ejemplo no he cambiado D0 para que apareciera un posible error producido al llamar a IO.SSTRG. De modo que si la llamada a IO.SSTRG ha ido bien devuelve un error de 0 y éste se transmite a la vuelta a SuperBASIC.

afx escribió:Una duda más. Desde el basic yo uso

Código: Seleccionar todo

10 LRESPR flp1_holamundo_bin

Con la versión original del programita SuperBasic que utiliza "LBYTES ... CALL ..." me da un error si tengo otros programas residentes (como PE, Qascade, ..). Tengo que eliminar todos esos jobs para que funcione esa versión (con LRESPR ningún problema).

En teoría, ¿no es equivalente usar "LRESPR" a "LBYTES ... CALL"? ¿Cual es la diferencia entonces?
Quizás no he calculado bien el número de bytes y sean más de 40. Al añadir la llamada a MT.FRJOB en el segundo ejemplo seguro que son más de 40. No pasa nada si hacéis RESPR con una cantidad mayor de la necesaria.

Avatar de Usuario
badaman
Sabreman
Mensajes: 499
Registrado: Mar Ene 29, 2008 10:58 am
Contactar:

Re: Assembler Development Kit de Metacomco

Mensaje por badaman » Dom Nov 09, 2008 2:11 pm

Ahora va perfecto. No lo he probado con el PE, pero imagino que ya no dará problemas.

¿Qué diferencia hay entre usar CLR.L D0 o usar MOVEQ.L #0,D0?

Se puede saber el tamaño del archivo compilado con el comando del TK2 WSTAT:

Código: Seleccionar todo

WSTAT holamundo_bin

lo que devuelve:

Código: Seleccionar todo

holamundo_bin
        48  2008 Nov 09 03:37:00

Asi pues, 48 es el tamaño en bytes que debemos poner en la línea 10 del programa SuperBASIC:

Código: Seleccionar todo

10 hola=RESPR(48)


Añado:

Ya sabeis que las extensiones en QDOS no van como en MS-DOS y, salvo para algunos programas que las contemplan internamente, llamar a un ejecutable "programa" o bien "programa_exe" da lo mismo (a nivel de subdirectorios, con el uso de DDOWN, la cosa cambia). En este caso, puesto que el programa se ejecuta también con EXE podíamos haber llamado igualmente al binario "holamundo_exe" para que fuese más reconocible.
Última edición por badaman el Dom Nov 09, 2008 4:59 pm, editado 2 veces en total.
Sinclair QL, la respuesta profesional de los 80

Responder

¿Quién está conectado?

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