Retrogames.cl
Página principal Sección Atari Articulos para leer

Proyectos y modificaciones de hardware

Clases elementales RG, su gente y actividades

El foro más antiguo de Chile

Un lugar para recordar

 

DMD
ATARI

Dot Matrix Display

Por ZZT

DMD es el acrónimo de Dot Matrix Display o Display de matriz de puntos.

Es una pantalla que permite mostrar texto, imágenes o animaciones simples de una manera económica y con poca sofisticación. Es usada en muchísimas aplicaciones como radios de auto, microondas... etc. Todo lo que use una pantalla que no necesite una tipo LCD o LED. Por supuesto que el uso que más me interesa es para los flippers. Como saben, ya hize un flipper controlado con un Atari, usando unos  simples displays LED de siete segmentos. Ahora, tengo en mente fabricar otro con un aire más "moderno", que tenga una DMD para mostrar texto y puntaje. Por eso me puse en campaña a fabricar mi propia pantalla DMD, por supuesto controlada con un Atari.

 

Voy a usar 6 displays de puntos matriz de 8 x 8, una plaquita perforada, un cartridge en desuso y bastante cable.

 

CIRCUITO ESQUEMÁTICO

 

MATERIALES

1 74LS00
1 74LS245
1 74LS259
6 74LS595
6 ULN 2003
6 displays de 8 x 8
1 plaquita perforada
1 plaquita de cartridge en desuso
2 DB-9 hembra
x cable
x bases (sockets) para cada chip y display
 

 

MANOS A LA OBRA

En este caso estoy usando la línea CCTL del cartridge para controlar la exploración de las columnas y las filas con los puertos de los joysticks.

 

Bueno, ya está listo el hardware, y comienza el tema del software:

Acá hice una prueba simple, solo para testear funcionamiento.

 

Este tipo de displays se exploran por columnas en forma secuencial, lo cual significa que por cada columna se debe enviar el estado de cada uno de los 8 leds. Y eso tiene que hacerse lo suficientemente rápido como para que el ojo no distinga el "parpadeo".

 

Tiempo atrás hice un intento con solo tres displays (24 columnas) y en basic andubo bien. Sin embargo ahora la exploración es de 48 columnas y creo que no se podrá, por lo tanto estoy tipeando algo en assambler:

Prueba 1:

*=$4000

; ajustes basicos

inicio
   lda #43
   sta 54018      ; pone puerto del joy en modo escritura
   ldx #255       ; carga primer número a enviar (0)
   stx 54016      ; envía número al puerto del joy 

; ajustes a posicion de partida

setups

;reset
   lda #0
   sta 54604      ; start reset (debe ser 0 y 1 con un ck del latch entremedio)
   lda #0
   sta 54602      ; activando el ck del latch
   lda #1
   sta 54604      ; end reset 

;output_enable
   lda #0
   sta 54601      ; OE debe ser 0

;exploracion 
   lda #48
   sta 6001       ; exploración columnas (48 veces)

;joy_port
   lda #0
   sta 54016      ; envía un 0 al joy (8 datos X columna)

;serial_data
   lda #1
   sta 54600      ; serial data =1 (poner a 0 después de comenzar exploración (inicio1)

inicio1
; comienza ciclo de exploración para activar una columna 

columnas
   lda #1
   sta 54603       ; activa ck
   lda #0
   sta 54603       ; desactiva ck
   lda #1
   sta 54602       ; activa latch
   lda #0
   sta 54602       ; desactiva latch
   lda #0
   sta 54600       ; serial data= 0. Ya se cargo un 1 al activarse los clock ahora debe ser 0 por cada paso de la exploración (si no pone 0 todas las columnas se activarían)


; lee un dato de la tabla (bytes) y lo manda a la columna activada

leetabla
   lda tabla,x      ; toma un dato de la tabla
   sta 54016        ; y lo envia al puerto del joystick
   ldx 6005
   dex
   stx 6005

   jsr tiempo      ; subrutina de tiempo (para variar velocidad lee paddle como variable)

veces
; controla la exploración (cantidad de veces=48 columnas)
   
   ldx 6001        ; 6001 esta definida en setups con valor 48
   dex             ; decrementa
   stx 6001        ; almacena 
   lda 6001        ; carga accA
   cmp #0          ; ve si llego a cero
   bne inicio1     ; si no a llegado a cero vuelve a aumentar otro paso 

; fin ciclo de exploración para activar una columna
   
   jmp setups       ; al pasar las 48 columnas vuelve al principio

; sub rutina de tiempo para poder variar la velocidad de muestreo

tiempo
; rutina de tiempo   
   lda #5
   sta 6002
paddle   
   lda 624         ; dirección paddle(0) 624
   sta 6000
loop
   ldx 6000
   dex
   stx 6000
   lda 6000
   cmp #0
   bne loop

loop2
   ldx 6002
   dex
   stx 6002
   lda 6002
   cmp #0
   bne paddle
; fin rutina de tiempo
   rts

      ; datos palabra RETROGAMES

tabla 
   .byte 155,109,109,179,255   ; S 
   .byte 189,181,181,129,255   ; E
   .byte 129,251,251,129,255   ; M
   .byte 131,221,221,131,255   ; A
   .byte 139,173,189,195,255   ; G
   .byte 195,189,189,195,255   ; O
   .byte 147,237,237,129,255   ; R
   .byte 253,129,253,255       ; T
   .byte 189,181,181,129,255   ; E
   .byte 147,237,237,129       ; R

   *=$02E0
   .word inicio

Prueba 2:

   *=$4000

inicio
   lda #43
   sta 54018   ; pone puerto del joy en modo escritura
   ldx #255   ; carga primer número a enviar (0)
   stx 54016   ; envía número al puerto del joy 

setups
   lda #0
   sta 54604   ; reset debe ser 0 y 1
   lda #0
   sta 54602   ; activando el ck del latch
   lda #1
   sta 54604   ; reset end

   lda #0
   sta 54601   ; OE debe ser 0
   
   lda #1
   sta 54600   ; data 1
   
   ldx #140   
   stx 6005   ; dirección clock 1 menos que leetabla

inicio1
   lda #255
   sta 54016
   lda #1
   sta 54603
   lda #0
   sta 54603
   lda #1
   sta 54602
   lda #0
   sta 54602
   lda #0
   sta 54600
leetabla
   ldx 6005
   lda retrogames,x
   sta 54016
   ldx 6005
   dex
   stx 6005
   cpx #0
   bne t1
   
   ldx #141   
   stx 6005
t1
   jsr tiempo
veces
   ldx 6004
   dex
   stx 6004
   lda 6004
   cmp #0
   bne t2
   
   lda #140   
   sta 6004
   lda #1
   sta 54600
t2
   jmp inicio1
   
   
tiempo
; rutina de tiempo   
   lda #5
   sta 6002
paddle   
   lda 624      
   sta 6000
loop
   ldx 6000
   dex
   stx 6000
   lda 6000
   cmp #0
   bne loop

loop2
   ldx 6002
   dex
   stx 6002
   lda 6002
   cmp #0
   bne paddle
; fin rutina de tiempo
   rts

retrogames 

   .byte 255,1,237,237,19      ; R
   .byte 255,1,109,109,125      ; E
   .byte 255,253,1,253      ; T
   .byte 255,1,237,237,19      ; R
   .byte 255,131,125,125,131   ; O
   .byte 255,131,109,109,139   ; G
   .byte 255,3,221,221,3      ; A
   .byte 255,1,251,247,251,1   ; M
   .byte 255,1,109,109,125      ; E
   .byte 255,179,109,109,155   ; S 
   .byte 255,255,255,255,255   ; espacio
   .byte 255,127,191,192,255   ; logo Atari
   .byte 0,255,192,191,127      ; logo Atari
   .byte 255,255,255      ; espacio
   .byte 255,3,221,221,3      ; A
   .byte 255,253,1,253      ; T
   .byte 255,3,221,221,3      ; A
   .byte 255,1,237,237,19      ; R
   .byte 255,255,1,255      ; I
   .byte 255,255,255      ; espacio
   .byte 255,127,191,192,255   ; logo Atari
   .byte 0,255,192,191,127      ; logo Atari
   .byte 255,255,255,255,255   ; espacio
   .byte 255,57,93,109,117,57   ; Z
   .byte 255,57,93,109,117,57   ; Z
   .byte 255,249,253,1,253,249   ; T
   .byte 255,131,125,125,131   ; O
   .byte 255,1,237,237,243      ; P
   .byte 255,255,255,255,255   ; espacio
   
   *=$02E0
   .word inicio   

 

                                    Resultado prueba 1                                                        Resultado prueba 2

 

Un interesante proyecto que puede crecer y sacar mucho más provecho de un Atari.

Si tienes alguna duda o quieres obtener más detalles, puedes consultar en el foro.