|
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 |
|