;************************************************************************** ; ; Source: Bitmap.s ; Autor: Frankie Martin ; Version: 27-08-89 v1.0 ; Compilador/Ensamblador: Seka v1.60 (o superiores) ; ;**************************************************************************** ; ; Esta rutina es un ejemplo de como preparar al Amiga para que coloque en la ; pantalla un bitmap cualquiera, que nosotros le proporcionemos.....guau! ; ; Como siempre, primero definimos los offsets de las librerias que utilizare- ; mos, las mas importantes en este caso son : Inicializar Bitmap y Iniciali- ; zar un Rastport. ; ;************ OFFSETS DE LAS LIBRERIAS QUE UTILIZAREMOS ********************* execbase=4 ;Direccion base de la libreria EXEC openlibrary=-408 ;Offset de la funcion que nos abre otras libs. closelibrary=-414 ;Offset de la funcion que cierra las libs. initbitmap=-390 ;Offset de la funcion que inicializa un bitmap initrastport=-198 ;Offset de la funcion que inicializa un rasport forbid=-132 ;Offset de la funcion que para el multitasking permit=-138 ;Offset de la funcion que activa el multitask ;********************* ABRIR LIBRERIA GRAFICA ******************************** inicio: move.l execbase,a6 ; offset base jsr forbid(a6) ; paro multitasking lea gfxname,a1 ; open libreria grafica jsr openlibrary(a6) ; salto a funcion move.l d0,gfxbase ; guardo la base para cerrar luego add.l #$32,d0 ; direccion del Copperlist move.l d0,mc ; guardo direccion del copperlist para ; despues restaurarlo y quitar el nuestro ; ;******************** INICIALIZAR EL BITMAP NUESTRO ************************** mi_bitmap: move.l gfxbase,a6 ;direccion libreria grafica lea bitmap,a0 ;cargamos la estructura de nuestro bitmap move.l #5,d0 ;no. de planos del bitmap (5 planos ) move.l #320,d1 ;resolucion x (baja reso. en este caso) move.l #256,d2 ;resolucion y (PAL 256 lineas) jsr initbitmap(a6) ;salto a la funcion iniciar bitmap lea rastport,a1 ;cargamos direccion estructura rasport jsr initrastport(a6) ;saltamos a la funcion iniciar rasport move.l #bitmap,R_Bitmap ;asociamos la @bitmap al rasport ;En esta parte definimos algunas caracteristicas del bitmap que queremos ;visualizar por pantalla. Pasamos por los registros (a0,d0,d1,d2) parametros ;como la direccion donde se encuentra nuestro bitmap,el numero de planos que ;ha de tener (5 planos representan 32 colores), la resolucion X-Y de nuestro ;dibujo (pantalla normal baja resolucion en este caso). ; ;Tambien asociamos un rasport al bitmap. Un rastport no es mas que una zona ;donde almacena el sistema informacion de los modos de dibujar, de los pens ;que utilizamos, de los patterns, de los atributos de texto, de la posicion ;del cursor en la pantalla grafica, etc....Es decir mientras que un bitmap ;nos da la informacion de como organizar la pantalla (se divide en planos ;que determinan los colores de cada pixel) el rasport nos da informacion de ;como podremos modificar ese bitmap. ;Al final del fuente se suelen declarar estas estructuras, por lo tanto, alli ;comentare algo mas sobre el tema. ;***** MOVER LA DIRECCION DE LOS BITPLANOS A LOS PUNTEROS ******************* ; ;El amiga posee unos punteros donde residen las direcciones de los bitplanos ;que componen el bitmap que se visualiza en ese instante. Por lo tanto, si ;queremos modificarlo hay que inicializar esos punteros con las direcciones ;de nuestro propio bitmap, para asi despues visualizarlo por pantalla. ;A continuacion cambiamos los punteros dando la direccion de nuestros planos ;a los punteros del amiga. ;Para ello cargamos la direccion de un bitplano en D0, y la dividimos en dos ;palabras de 16 bits, una conteniendo la palabra de menos peso (lo1) y otra ;con los 16 bits de mayor peso (hi1). Esta division es obligatoria hacerla ;puesto que los punteros del amiga son de 16 bits y hay que partir una ;direccion de 32 bits en dos punteros de 16 bits para que el amiga trabaje. move.l #bitplano1,d0 ;cargamos direccion del plano 1 move.w d0,lo1 ;movemos 16 bits (.word) a lo1 swap d0 ;cambio 16 bits mas peso a menos peso move.w d0,hi1 ;y lo dejo en hi1 move.l #bitplano2,d0 ;a partir de aqui es la misma move.w d0,lo2 ;operacion con cada plano del swap d0 ;bitmap move.w d0,hi2 move.l #bitplano3,d0 move.w d0,lo3 swap d0 move.w d0,hi3 move.l #bitplano4,d0 move.w d0,lo4 swap d0 move.w d0,hi4 move.l #bitplano5,d0 move.w d0,lo5 swap d0 move.w d0,hi5 ;********************* EXTRAER COLORES DE NUESTRO GRAFICO ****************** ; ; En esta parte leemos los colores de nuestro grafico y los ponemos en los ; registros de color del amiga. 32 colores, 32 registros. ; ; Para hacer esto utilizo el copper-list (para mas informacion de los copper- ; list, mirarse el boletin Programacion del Copper I y II). Es decir creo ; una zona de memoria dentro del copper list donde copio los registros y los ; valores de los colores que se transferiran por el copper a esos mismos ; registros. colores_bitmap: move.l #colormap,a0 ;direccion de la zona donde copiare colores move.l #colormapraw,a1 ;direccion de la zona donde estan los colores move.l #$0180,d0 ;primer registro de color que muevo incre: move.w d0,(a0)+ ;muevo el registro a la copperlist add.w #$0002,d0 ;incremento la tabla de colores (colormapraw) move.w (a1)+,(a0)+ ;muevo el color al lado del registro cmp.w #$01c0,d0 ;comparo si he creado el ultimo registro (32) bne incre ;sino, pues sigo incrementando ;******************* ACTIVO MI COPPER-LIST ********************************** ;(Para mas informacion, un vistazo a los boletines del Copper I, y II) mi_copper: move.l mc,a0 ; inicializo mi copper-list move.l (a0),sc move.l #copper,(a0) ;***************** ESPERO A PULSAR EL BOTON DEL RATON Y SALGO *************** rata: btst #$6,$bfe001 ;testeo si pulsado el boton izquierdo bne rata ;si no pulsado, pues a esperar bra cerrar_libs ;si si pulsado pues salimos ;***************** CERRAR LIBRERIAS QUE HEMOS ABIERTO *********************** cerrar_libs: move.l mc,a0 ; pongo copper anterior move.l sc,(a0) move.l mc,a0 ; cierro librerias move.l sc,(a0) move.l gfxbase,a1 move.l execbase,a6 jsr closelibrary(a6) jsr permit(a6) ;permito multitasking illegal ;salgo de la rutina al sistema ;--------------- ;-mi copperlist- ;--------------- copper: dc.w $0120,$0000 ;reg -> SPR0PTH (Los 3 bits altos) dc.w $0122,$0000 ;reg -> SPR0PTL (Los 16 bajos) ;Desactiva el puntero del raton dc.w $00e0 ;punteros de los bitplanes que antes hemos actualizado hi1: dc.w $0000 ; dc.w $00e2 lo1: dc.w $0000 dc.w $00e4 hi2: dc.w $0000 dc.w $00e6 lo2: dc.w $0000 dc.w $00e8 hi3: dc.w $0000 dc.w $00ea lo3: dc.w $0000 dc.w $00ec hi4: dc.w $0000 dc.w $00ee lo4: dc.w $0000 dc.w $00f0 hi5: dc.w $0000 dc.w $00f2 lo5: dc.w $0000 ; ;valores que pasamos a registros del amiga dc.w $0100,%0101000000000000 ;indico a BPLCON0 que utilizare 5 planos dc.w $0092,$0038 ;DDFSTRT (display data fetch start) x=56 dc.w $0094,$00d0 ;DDFSTOP (display data fetch stop) x=208 dc.w $008e,$2981 ;DIWSTRT (y=41, x=129) dc.w $0090,$29d1 ;DIWSTOP (y=41, x=209) colormap: blk.l 32,0 ;espacio que reservamos para colocar los colores ;del bitmap dc.w $ffff,$fffe ;Finalizamos la copper-list con un WAIT imposible de realizar ;****** ZONA RESERVADA A LAS ESTRUCTURAS DEL BITMAP Y RASPORT *************** bitmap: bytesperrow: blk.w 1,0 bytes: blk.w 1,0 flags: blk.b 1,0 depth: blk.b 1,0 pad: blk.w 1,0 plano1: dc.l bitplano1 plano2: dc.l bitplano2 plano3: dc.l bitplano3 plano4: dc.l bitplano4 plano5: dc.l bitplano5 planes: blk.l 1,0 ; rastport: blk.l 1,0 R_Bitmap: blk.l 1,0 blk.b 102,0 bitplano1: blk.b 10240,0 ;zona donde cargamos el bitmap en bitplano2: blk.b 10240,0 ;forma RAW bitplano3: blk.b 10240,0 bitplano4: blk.b 10240,0 bitplano5: blk.b 10240,0 colormapraw: blk.b 64,0 gfxbase: dc.l 0 gfxname: dc.b "graphics.library",0 even ; mc: blk.l 1,0 sc: blk.l 1,0 ; ;********* ATENCION ATENCION ATENCION ATENCION ATENCION ATENCION ************ ; ; Una vez ensamblemos con el seka esta rutina, mediante el comando RI cargamos ; nuestro grafico en formato RAW a partir de la etiqueta BITPLANO1 es decir ; 'BEGIN>BITPLANO1 END>return', y entonces ejecutamos y ya esta!!!! yeahh! ; ; Para pasar un grafico a formato RAW necesitamos un pequeño comando llamado ; ILBM2RAW, que podeis llevaros del BBS...yo por ejemplo, los graficos los ; hago con el DPAINT, y lo grabo normalmente, despues ejecuto el ILBM2RAW ; dandole el nombre de mi grafico que esta en el disco y lo paso a formato ; RAW, es decir de IFF a RAW. Sirve cualquier grafico hecho por nosotros o ; cualquier digitalizacion en baja resolucion o en alta si modificamos el ; fuente. ; ; ; Un saludo, Frankie. ;****************************************************************************