Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previaÚltima revisiónAmbos lados, revisión siguiente | ||
cursos:ensamblador:introduccion [06-01-2024 14:37] – [Enlaces] sromero | cursos:ensamblador:introduccion [19-01-2024 14:37] – [Los límites de BASIC] sromero | ||
---|---|---|---|
Línea 15: | Línea 15: | ||
\\ | \\ | ||
- | {{ cursos: | + | {{ cursos: |
\\ | \\ | ||
;#; | ;#; | ||
Línea 24: | Línea 24: | ||
Para muchos, el BASIC del Spectrum es un comienzo prácticamente obligado para programar, pero si queremos realizar programas con la calidad del software comercial no puede ser la herramienta a utilizar. Dejando de lado que sigue siendo una herramienta muy útil para programar en el Spectrum, para muchos llega la hora de dar el siguiente paso. | Para muchos, el BASIC del Spectrum es un comienzo prácticamente obligado para programar, pero si queremos realizar programas con la calidad del software comercial no puede ser la herramienta a utilizar. Dejando de lado que sigue siendo una herramienta muy útil para programar en el Spectrum, para muchos llega la hora de dar el siguiente paso. | ||
- | Para hacer juegos o programas de calidad comercial en el Spectrum, podemos obviar totalmente el lenguaje BASIC excepto por una serie de comandos que nos serán necesarios para cargar en memoria nuestros programas: comandos como **CLEAR**, **LOAD "" | + | Para hacer juegos o programas de calidad comercial en el Spectrum, podemos obviar totalmente el lenguaje BASIC excepto por una serie de comandos que nos serán necesarios para cargar en memoria nuestros programas: comandos como '' |
- | El cargador BASIC es el pequeño programa en BASIC que el Spectrum y autoejecuta cuando tecleamos | + | El cargador BASIC es el pequeño programa en BASIC que el Spectrum y autoejecuta cuando tecleamos |
- | < | + | < |
- | 10 REM Cargador BASIC de un juego | + | 10 REM Cargador BASIC de un juego. |
15 REM Carga la pantalla del juego desde cinta | 15 REM Carga la pantalla del juego desde cinta | ||
20 REM luego con un POKE oculta el mensaje " | 20 REM luego con un POKE oculta el mensaje " | ||
Línea 62: | Línea 62: | ||
Ahora tenemos 2 opciones para utilizar ese " | Ahora tenemos 2 opciones para utilizar ese " | ||
- | 1.- Si el código máquina resultante es pequeño, porque por ejemplo sólo hemos desarrollado una rutina y apenas ocupa unos pocos bytes, podemos introducir los valores del binario obtenido en nuestro programa BASIC con DATA y POKEarlos en memoria en la dirección deseada. Pongamos por ejemplo que pokeamos esta rutina a partir de la dirección de memoria 40000 (desde 40000 hasta 40000+N siendo N el tamaño del bloque código máquina resultante). Ahora, cuando necesitemos llamar a la rutina en medio de nuestro programa BASIC, lo podremos hacer con un **RANDOMIZE USR 40000**. | + | 1.- Si el código máquina resultante es pequeño, porque por ejemplo sólo hemos desarrollado una rutina y apenas ocupa unos pocos bytes, podemos introducir los valores del binario obtenido en nuestro programa BASIC con DATA y POKEarlos en memoria en la dirección deseada. Pongamos por ejemplo que pokeamos esta rutina a partir de la dirección de memoria 40000 (desde 40000 hasta 40000+N siendo N el tamaño del bloque código máquina resultante). Ahora, cuando necesitemos llamar a la rutina en medio de nuestro programa BASIC, lo podremos hacer con un '' |
- | 2.- Si por contra el código máquina resultante es grande, porque hemos desarrollado muchas rutinas, pasar estos datos a DATA para POKEarlos es inviable. En ese caso, lo que haríamos sería guardar el bloque de código máquina en cinta justo después de nuestro programa en BASIC. Después, al principio de nuestro programa BASIC cargamos en memoria el bloque de datos de código máquina que va después del mismo en cinta mediante un (por ejemplo) | + | 2.- Si por contra el código máquina resultante es grande, porque hemos desarrollado muchas rutinas, pasar estos datos a DATA para POKEarlos es inviable. En ese caso, lo que haríamos sería guardar el bloque de código máquina en cinta justo después de nuestro programa en BASIC. Después, al principio de nuestro programa BASIC cargamos en memoria el bloque de datos de código máquina que va después del mismo en cinta mediante un (por ejemplo) |
- | Es decir: en ambos casos realizamos una rutina o un conjunto de rutinas en ensamblador y mediante un //programa ensamblador//, | + | Es decir: en ambos casos realizamos una rutina o un conjunto de rutinas en ensamblador y mediante un //programa ensamblador//, |
- | Esto permite realizar rutinas importantes y críticas en lenguaje ensamblador, | + | Esto permite realizar rutinas importantes y críticas en lenguaje ensamblador, |
Más adelante en este capítulo veremos un ejemplo de cómo realizar el ensamblado de una rutina en ensamblador, | Más adelante en este capítulo veremos un ejemplo de cómo realizar el ensamblado de una rutina en ensamblador, | ||
Línea 96: | Línea 96: | ||
\\ | \\ | ||
- | * Programamos nuestro juego en lenguaje BASIC (siguiendo las reglas especiales que lo diferencien del BASIC estándar del Spectrum) escribiendo el programa en un editor de textos estándar de nuestra plataforma de desarrollo. | + | * Programamos nuestro juego en lenguaje BASIC (siguiendo las reglas especiales que lo diferencien del BASIC estándar del Spectrum) escribiendo el programa en un editor de textos estándar de nuestra plataforma de desarrollo. |
- | + | ||
- | * Grabamos el código de nuestro programa como uno o varios | + | |
* Mediante el compilador cruzado, compilamos los ficheros .BAS y obtenemos un fichero binario de código máquina, normalmente con un cargador BASIC incluído al principio del mismo. | * Mediante el compilador cruzado, compilamos los ficheros .BAS y obtenemos un fichero binario de código máquina, normalmente con un cargador BASIC incluído al principio del mismo. | ||
- | * Cargamos ese código máquina en nuestro Spectrum o emulador con un simple LOAD "" | + | * Cargamos ese código máquina en nuestro Spectrum o emulador con un simple |
\\ | \\ | ||
- | Es una opción muy interesante para quien quiera seguir programando en BASIC y obtener la potencia que el intérprete de BASIC le resta. | + | Es una opción muy interesante para quien quiera seguir programando en BASIC y obtener la potencia que el intérprete de BASIC del Spectrum |
\\ | \\ | ||
Línea 119: | Línea 117: | ||
\\ | \\ | ||
- | * Programamos nuestro juego en lenguaje C escribiendo el programa en un editor de textos estándar de nuestra plataforma de desarrollo. | + | * Programamos nuestro juego en lenguaje C escribiendo el programa en un editor de textos estándar de nuestra plataforma de desarrollo. Escribiermos por tanto el código de nuestro programa como uno o varios ficheros '' |
- | | + | |
- | * Mediante el compilador cruzado, compilamos los ficheros .C y obtenemos un fichero binario de código máquina, normalmente con un cargador BASIC incluído al principio del mismo. | + | * Cargamos ese código máquina en nuestro Spectrum o emulador con un simple |
- | + | ||
- | * Cargamos ese código máquina en nuestro Spectrum o emulador con un simple LOAD "" | + | |
\\ | \\ | ||
Línea 137: | Línea 133: | ||
| | ||
- | Con la opción que hemos elegido, escribiremos el código del programa íntegramente en **lenguaje ensamblador** (// | + | Con la opción que hemos elegido, escribiremos el código del programa íntegramente en **lenguaje ensamblador** (// |
Con BASIC compilado y con C, es el compilador quien transforma cada comando en múltiples instrucciones en código máquina. En el lenguaje ensamblador, | Con BASIC compilado y con C, es el compilador quien transforma cada comando en múltiples instrucciones en código máquina. En el lenguaje ensamblador, | ||
Línea 144: | Línea 140: | ||
\\ | \\ | ||
- | * Programamos nuestro juego en lenguaje ensamblador escribiendo el programa en un editor de textos estándar de nuestra plataforma de desarrollo. | + | * Programamos nuestro juego en lenguaje ensamblador escribiendo el programa en un editor de textos estándar de nuestra plataforma de desarrollo. Escribiremos por tanto el código de nuestro programa como uno o varios ficheros '' |
- | | + | |
- | * Mediante el ensamblador cruzado, ensamblamos los ficheros .ASM y obtenemos un fichero binario de código máquina, normalmente con un cargador BASIC incluído al principio del mismo. | + | * Cargamos ese código máquina en nuestro Spectrum o emulador con un simple |
- | + | ||
- | * Cargamos ese código máquina en nuestro Spectrum o emulador con un simple LOAD "" | + | |
\\ | \\ | ||
Línea 157: | Línea 151: | ||
En ensamblador no tenemos funciones de alto nivel que realicen determinadas tareas por nosotros: no existe PRINT para imprimir cosas por pantalla, si queremos imprimir texto tenemos que imprimir una a una las letras, calculando posiciones, píxeles, colores, y escribiendo en la videomemoria nosotros mismos. Podemos apoyarnos en una serie de rutinas que hay en la ROM del Spectrum (que son las que utiliza BASIC), pero en general, para la mayoría de las tareas, lo tendremos que hacer todo manualmente. | En ensamblador no tenemos funciones de alto nivel que realicen determinadas tareas por nosotros: no existe PRINT para imprimir cosas por pantalla, si queremos imprimir texto tenemos que imprimir una a una las letras, calculando posiciones, píxeles, colores, y escribiendo en la videomemoria nosotros mismos. Podemos apoyarnos en una serie de rutinas que hay en la ROM del Spectrum (que son las que utiliza BASIC), pero en general, para la mayoría de las tareas, lo tendremos que hacer todo manualmente. | ||
- | Un ejemplo muy sencillo: en BASIC podemos multiplicar 2 números de forma muy simple con el operador | + | Un ejemplo muy sencillo: en BASIC podemos multiplicar 2 números de forma muy simple con el operador |
<code z80> | <code z80> | ||
; Rutina de multiplicación en lenguaje ensamblador: | ; Rutina de multiplicación en lenguaje ensamblador: | ||
; | ; | ||
- | ; MULTIPLICA: Multiplica DE*BC | + | ; Mult_HL_DE: Multiplica DE*BC |
- | ; | + | ; Entrada: |
- | ; | + | ; BC: Multiplicador |
- | ; | + | ; Salida: |
+ | ; Modifica: | ||
+ | |||
+ | Mult_HL_DE: | ||
+ | ld hl, 0 ; HL = 0 | ||
- | MULTIPLICA: | + | multhlde_loop: |
- | LD HL, 0 ; HL = 0 | + | add hl, de |
- | MULTI01: | + | dec bc |
- | ADD HL, DE | + | ld a, b |
- | DEC BC | + | or c |
- | LD A, B | + | jr nz, multhlde_loop |
- | OR C | + | |
- | JR NZ, MULTI01 | + | |
- | | + | |
</ | </ | ||
Línea 248: | Línea 244: | ||
Por ejemplo, (por citar sólo dos de ellos) tanto **FUSE -Free UNIX Spectrum Emulator-** (en Linux, Windows y Mac), como **ZX Spin** (en Windows) tienen integrado un **debugger** o **depurador** que nos permitirá ejecutar nuestros programas paso a paso. | Por ejemplo, (por citar sólo dos de ellos) tanto **FUSE -Free UNIX Spectrum Emulator-** (en Linux, Windows y Mac), como **ZX Spin** (en Windows) tienen integrado un **debugger** o **depurador** que nos permitirá ejecutar nuestros programas paso a paso. | ||
- | Un debugger es una herramienta que nos permite ver el contenido de los registros del Z80, la posición del " | + | Un debugger es una herramienta que nos permite ver el contenido de los registros del Z80, la posición del " |
\\ | \\ | ||
Línea 296: | Línea 292: | ||
\\ | \\ | ||
- | **[ [[.: | + | **[ [[.:indice|⬉]] | [[.: |