Revistas en papel
 Amiga World Nº27 - Diciembre 1991
Anterior
Menú
Logotipo

El Amiga Me Encanta ha conseguido el permiso por escrito de IDG Comunications España
para ofrecer los artículos de la revista Amiga World España.

Amiga World

Por CARLOS VILASIS

El creciente interés por las digitalizaciones se ha puesto de manifiesto en la adquisición masiva de hardware de digitalización. Pero en la mayoría de los casos, ese hardware se vende incompleto. En este artículo eminentemente práctico, se da una oportunidad a muchos usuarios con el equipo a medias.

A excepción de sistemas como Videon III, digitalizador que posee el filtro-separador RGB incorporado y automático, los digitalizadores tradicionales necesitan que se trabaje con una cámara de blanco y negro y con separador RGB adicional. Si no dispone del separador VidiRGB Splitter o tampoco tiene DigiView v4.0, los listados que acompañan este artículo pueden servirle para conocer cómo manejar un dispositivo externo desde el puerto del joystick.


Sobre el separador

Parece ser que hay muchos lectores interesados en la digitalización de imágenes en color, pero son pocos los que encuentran una solución rentable y rápida para realizar esta operación. Desde aquí quiero proporcionarle una de tantas soluciones, pero seguramente será esta la más barata y la que ofrezca unos resultados más espectaculares. No se llega a la calidad de los sistemas completos, más profesionales, pero servirá a los aficionados.

Tal vez el digitalizador de más conocido aunque ya anticuado, sea DigiView. Pero no permite la digitalización de imágenes que provengan directamente de cámaras y videoreproductores en color. Para ello es necesario la adquisición de un aparato adicional que se encargue de separar los colores provenientes de una señal compuesta a tres señales distintas, cada una de ellas con uno de los colores primarios: Rojo, Verde y Azul (RGB). A este hardware se le conoce como "separador electrónico de colores"; pero es muy difícil encontrar un separador que tenga buen precio y calidad. La mayoría de ellos son de calidad profesional y sus excepcionales cualidades sólo son apreciables con un buen congelador de imagenes, pero éstos ya se escapan a las posibilidades económicas de cualquier usuario. Por ello propongo VidiRGB Splitter de Rombo, un separador muy barato, pero al que he encontrado un fallo que aquí intentaré resolver.

Este separador tiene la posibilidad de elegir el color a digitalizar de forma manual o automática. Con Digi-View hasta ahora sólo era posible usarlo en su modalidad manual, puesto que al insertar el conector en el segundo puerto del joystick, el separador ya no responde en ninguno de sus modos. El problema es debido a que VidiRGB usa un sistema propio para comunicarse con el ordenador, y que no es compatible con el propuesto por el fabricante del digitalizador de vídeo. El resto de separadores emulan el funcionamiento de un mecanismo llamado Digi-Droid, el cual no es más que un motor que permite girar automáticamente los filtros de la rueda de colores para capturar imágenes en vivo desde cámaras en B/N.

Llegado a este punto sólo habría dos soluciones posibles: la primera modificar el hardware del Vidi-RGB, y la otra adaptar DigiView para que funcione perfectamente con el nuevo separador. Estará de acuerdo conmigo en que la más simple y económica es modificar el software ¿no?. Pues manos a ello.


Una solución ingeniosa

Primero tenemos que conocer cómo funciona el controlador del Vidi-RGB para el modo automático, siendo éste muy simple. Este filtro posee un conector como el del joystick, que se inserta en el ordenador, a través del cual el software lo puede controlar de la misma forma que utilizamos el botón superior del separador para seleccionar cualquiera de los colores, o para hacer un reset del aparato. El registro encargado de manejar este dispositivo se ubica en $BFE001, justo en el bit 7. Esta posición pertenece al mapa de direcciones de la CIA A de nuestro ordenador. El bit 7 es el encargado de controlar el estado del botón de fuego, pero en nuestro caso deseamos mandar información por dicho control; por lo que deberemos modificar $BFE201 (el controlador de dirección del port A de la CIA A) para informar que se trata de una salida/output, y con ello podemos controlar cualquier aparato conectado al puerto del joystick.

Falta todavía conocer los tiempos necesarios para realizar el cambio de cada color y el tiempo necesario para realizar un reset que nos sitúe en el punto de partida. Estos vienen en el manual que acompaña al separador, pero creo que no son muy exactos. Según el manual hacen falta unos 2 segundos para realizar el reset y yo consigo realizar esta operación en mucho menos tiempo.

Para realizar las esperas habría sido más lógico usar los timers de las CIAs, pero de esta forma el programa consumía más memoria, y no entraba en el espacio desalojado por el controlador del Digi-Droid. Así pues, me he visto obligado a realizar las esperas mediante un bucle de retardo (NOP - DBRA), tal y como lo hace el software de NewTek. No estoy muy convencido de que así funcione bien con las tarjetas aceleradoras, pero si mi programa no funciona bien, el que nos propone Newtek tampoco debe funcionar correctamente con su separador de color en un ordenador con un procesador acelerado; pues ambos controladores usan la misma lógica para el retardo de tiempos.

También he realizado un verificador para detectar si el filtro electrónico se encuentra conectado al ordenador. Sólo se realiza el test una vez cuando se arranca DigiView, por lo que VidiRGB deberá estar conectado antes de cargar el programa de digitalizar, sino aparecerá un requester en pantalla avisándonos de ello. Recuerde realizar una copia de seguridad de DigiView, y sobre ésta arrancar DV-VIDI para que modifique el programa, volviendo a grabarlo en el mismo disco. ¡Nunca lo haga sobre el disco original!.

DV-VIDI v1.0 sólo ocupa 1052 bytes y está realizado al 100% en Ensamblador por lo que es muy rápido, sencillo, ocupa muy poca memoria. Los listados que acompañan a este artículo han sido realizados con el programa macroensamblador MasterSeka v1.6, aunque seguramente sea compilable con cualquier otro programa que utilice este mismo lenguaje.


Ejecutando el programa

Antes de ejecutar el programa recuerde hacer una copia de DigiView v4.0, siendo en la misma donde tiene que ejecutar mi programa. Una vez realizada, coloque el disco donde se encuentra DV-VIDI y ejecútelo desde CLI. Verá que le pide que coloque la copia del programa de digitalizar, y que pulse el botón izquierdo del ratón una vez esté listo para continuar. Tenga presente que se realizará una grabación del nuevo digitalizador, con lo cual tendrá que introducir el disco desprotegido, de lo contrario se producirá un error.

Como puede ver no es nada complicado y sólo es preciso realizar esta operación una sola vez.

;              DV-VIDI v1.0
;
;              (c)1991 CARLOS VILASIS
;              (c)1991 Amiga World
;
;Este programa carga Digi-View v4.0 en un buffer, lo modifica
;y lo vuelve a grabar.
;Programa principal
          MOVE.L    4,A6
          LEA       DOSName(PC),A1
          JSR       -$198(A6)        ;OPENLIBRARY.exec
          LEA       DOSBase(PC),A1
          MOVE.L    D0,(A1)
          MOVE.L    D0,A6
          JSR       -$3C(A6)         ;OUTPUT.dos
          LEA       CLI(PC),A1
          MOVE.L    D0,(A1)
          LEA       Mem0(PC),A0
          LEA       Fin(PC),A1
          BSR.I     Print            ;Imprime mensaje
Espera:   BTST      #6,$BFE001       ;Espera disco
          BNE.s     Espera
          MOVE.L    4,A6
          MOVE.L    #$20244,D7       ;Longitud DV 131652 bytes
          MOVE.L    D7,D0
          MOVE.L    #$20001,D1
          JSR       -$C6(A6)         ;ALLOCMEM.exec
          LEA       Buff(PC),A1
          MOVE.L    D0,(A1)
          BEQ.l     Error1           ;No hay memoria
          MOVE.L    DOSBase(PC),A6
          LEA       Name(PC),A1
          MOVE.L    A1,D1
          MOVE.L    #1005,D2
          JSR       -$1E(A6)         ;OPEN.dos FOR INPUT
          LEA       Handle(PC),A1
          MOVE.L    D0,(A1)
          BEQ.l     Error2           ;No existe fichero
          MOVE.L    D0,D1
          MOVE.L    BUff(PC),D2
          MOVE.L    D7,D3
          JSR       -$2A(A6)         ;READ.dos
          MOVE.L    D0,-(SP)
          MOVE.L    Handle(PC),D1
          JSR       -$24(A6)         ;CLOSE.dos
          MOVE.L    (SP)+,D0
          CMP.L     D0,D7
          BNE.l     Error3           ;Fallo en lectura
          LEA       Chain1(PC),A0
          LEA       Chain2(PC),A1
          BSR.l     Copy
          LEA       Chain2(PC),A0
          LEA       Chain3(PC),A1
          BSR.l     Copy
          LEA       Chain3(PC),A0
          LEA       Chain4(PC),A1
          BSR.l     Copy
          LEA       Chain4(PC),A0
          LEA       Chain5(PC),A1
          BSR.l     Copy
          LEA       Chain5(PC),A0
          LEA       Chain6(PC),A1
          BSR.l     Copy
          LEA       Chain6(PC),A0
          LEA       Chain7(PC),A1
          BSR.l     Copy
          LEA       Chain7(PC),A0
          LEA       Chain8(PC),A1
          BSR.l     Copy
          LEA       Name(PC),A1
          MOVE.L    A1,D1
          MOVE.L    #1006,D2
          JSR       -$1E(A6)         ;OPEN.dos FOR OUTPUT
          LEA       Handle(PC),A1
          MOVE.L    D0,(A1)
          BEQ.l     Error4           ;No existe fichero
          MOVE.L    D0,D1
          MOVE.L    Buff(PC),D2
          MOVE.L    D7,D3
          JSR       -$30(A&)         ;WRITE.dos
F3:       MOVE.L    Handle(PC),D1
          JSR       -$24(A6)         ;CLOSE.dos
F2:       MOVEA.L   4,A6
          MOVE.L    D7,D0
          MOVE.L    Buff(PC),A1
          JSR       -$D2(A6)         ;FREEMEM.exec
F1:       MOVE.L    4,A6
          MOVE.L    DOSBase(PC),A1
          JSR       -$19E(A6)        ;CLOSELIBRARY.exec
          CLR.L     D0
          RTS
Error:    LEA       Mem4(PC),A0
          LEA       Mem3(PC),A1
          BSR.s     Print
          BRA.s     F3
Error3:   LEA       Mem3(PC),A0
          LEA       Mem2(PC),A1
          BSR.s     Print
          BRA.s     F2
Error2:   LEA       Mem2(PC),A0
          LEA       Mem1(PC),A1
          BSR.s     Print
          BRA.s     F2
Error1:   LEA       Mem1(PC),A0
          LEA       Mem0(PC),A1
          BSR.s     Print
          BRA.s     F1
;Subrutinas de apoyo para el programa principal
Print:    SUB.L     A0,A1
          MOVE.L    CLI(PC),D1
          MOVE.L    A0,D2
          MOVE.L    A1,D3
          JSR       -$30(A6)
          RTS
Copy:     MOVE.L    D0,-(SP)
          MOVE.L    A1,D0
          MOVE.L    (A0)+,A1
          ADD.L     Buff,A1
          SUBI.L    A0,D0
          LSR.L     #$1,D0
          SUBQ.L    #$1,D0
Loop:     MOVE.W    (A0)+,(A1)+
          DBRA      D0,Loop
          MOVE.L    (SP)+,D0
          RTS
CLI:      DC.L      $0
BUff:     DC.L      $300000
Handle:   DC.L      $0
DOSBase:  DC.L      $0
DOSName:  DC.B      "dos.library",0
Name:     DC.B      "DF0:DV",0
Mem4:     DC.B      "Fallo de escritura.",10
Mem3:     DC.B      "Fallo al leer el archivo.",10
Mem2:     DC.B      "No he encontrado DIGIVIEW 4.0",10
Mem1:     DC.B      "No hay memoria suficiente.",10
Mem0:     DC.B      " DV-VIDI v1.0 (c)1991 Carlos Vilasis",10,10
          DC.B      "Introduce una copia del disco DIGIVIEWv4.0_Pal"
          DC.B      " en la unidad DF0:",10
          DC.B      "Pulsa el bot�n izquierdo del rat�n cuando"
          DC.B      " est�s listo.",10,10
Fin:      EVEN
;Estos procedimientos son las modificaciones para Digi-View
;v4.0_Pal
Chain1:   DC.L      $00015026
          DC.B      "Operaci�n Fallida",0
          DC.B      "VIDI-RGB Splitter ",0
          DC.B      "No Conectado.     ",0
Chain2:   DC.L      $000122DA
          NOP
          NOP
          NOP
          NOP
Chain3:   DC.L      $0001230A
          NOP
          NOP
          NOP
          NOP
Chain4:   DC.L      $000120D0
          BSR.s     Test
          DC.W      $6748
          BSET      #7,$BFE001
          BSR.s     Test
          DC.W      $663C
          BRA.S     OK
Test:     MOVE.B    $DFF00C,D1
          MOVE.B    D1,D0
          LSR.B     #1,D1
          EOR.B     D0,D1
          BTST      #0,D1
          RTS
          NOP
          NOP
          NOP
OK:       DC.W      $33FC,$0003,$0000,$5CAA
          NOP
          NOP
          NOP
          NOP
; D0=Color (0=Rojo/1=Verde/2=Azul/3=BN)
Chain5:   DC.L      $00012D9E
          BSET.B    #$07,$BFE201
          MOVE.W    #$0130,D1
          BSR.s     Set
          MOVE.W    #$000E,D1
          BSR.s     Wait
          MOVE.W    #$C000,$DFF09A
          MOVE.W    #$8100,$DFF096
JMP1:     ANDI.W    #3,D0
          CLR.W     D1
          BSR.s     sET
          CLR.W     D1
          BSR.s     Wait
          DBF       D0,JMP1
          NOP
          NOP
          RTS
Set:      BCLR.B    #$07,$BFE001
          BSR.s     Wait
          BSET.B    #$07,$BFE001
          RTS
Wait:     MOVE.W    D1,-(SP)
          MOVE.W    #$0700,D1
Loop1:    NOP
          DBF       D1,Loop1
          MOVE.W    (SP)+,D1
          DBF       D1,Wait
          NOP
          RTS
Chain6:   DC.L      $000135BA
          OR.B      #$80,$BFE001
Chain7:   DC.L      $000135A8
          BSET      #$07,$BFE001
Chain8:

VIDI-TEST

(c)1991 CARLOS VILASIS
(c)1991 Amiga World

;Esta rutina pertenece al listado general del programa y solo muestra
;como funciona el test de comprobacion sobre la conexion del VIDI-
;RGB.
Test:   BSET.B   #$07,$BFE201
        BCLR.B   #$07,$BFE001
        BSR.S    Joy
        BEQ.S    Error
        BSET.B   #$07,$BFE001
        BSR.S    Joy
        BNE.S    Error
Error:  RTS
Joy:    MOVE.B   $DFF00C,D1
        MOVE.B   D1,D0
        LSR.B    #1,D1
        EOR.B    D0,D1
        BTST     #0,D1
        RTS

VIDI-RGB

(c)1991 CARLOS VILASIS
(c)1991 Amiga World

;Esta rutina pertenece al listado general del programa y solo muestra
;como funciona el cambio de cada uno de los colores del separador
;VIDI-RGB.
;
; D0=Color (0=Rojo/1=Verde/2=Azul/3=BN)
          MOVE.W   #0,D0           ;Coloca en color Rojo VIDI-RGB
Select:   BSET.B   #$07,$BFE201
          MOVE.W   #$0130,D1
          BSR.s    Set
          MOVE.W   #$000e,D1
          BSR.s    Wait
JMP1:     ANDI.W   #3,D0
          CLR.W    D1
          BSR.s    Set
          CLR.W    D1
          BSR.s    Wait
          DBF      D0,JMP1
          RTS
Set:      BCLR.B   #$07,$BFE001
          BSR.s    Wait
          BSET.B   #$07,$BFE001
          RTS
Wait:     MOVE.W   D1,-(SP)
          MOVE.W   #$0700,D1
Loop1:    NOP
          DBF      D1,Loop1
          MOVE.W   (SP)+,D1
          DBF      D1,Wait
          RTS

Envía esta página web a un amigo:
Esta opción está desactivada temporalmente, rogamos disculpen las molestias

Volver a la página anterior

Al menú principal