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

ATARI
PIA DOBLE

Por ZZT

PIA es el acrónimo de Peripheral Interfase Adaptor o Interfase Adaptadora de Periféricos.

Es un chip de entrada y salida de datos. Comunica a la CPU de un computador con el mundo exterior, pudiendo ser utilizado para entrada o salida de datos.

Por el lado interno, que se conecta directamente a la CPU, tiene 8 pines que corresponden al bus de datos más algunas líneas de control y hacia afuera tiene dos puertos, cada uno de 8 pines, obteniendo o dando un byte de cada uno, dependiendo si está leyendo o escribiendo. Un byte comprende valores entre 0 y 255, dependiendo de la combinación de unos y ceros. La versatilidad de la PIA es que se le puede programar para decidir como se desea operar sus puertos, osea, se puede decidir cuales serán entradas y cuales salidas.

La PIA del Atari es la 6520, formato DPI 40.

Consta de dos puertos de 8 bits cada uno. Se llaman Port A (PA) y Port B (PB). Puerto A y B en español.

En los Atari XL el puerto A está dedicado a los dos joysticks, cuatro patas para cada uno:

PUERTO A

STICK

JOYSTICK 1

JOYSTICK 2

PUERTO

PA0

PA1

PA2

PA3

PA4

PA5

PA6

PA7

PIA PIN

2

3

4

5

6

7

8

9

USO

UP

DOWN

LEFT

RIGHT

UP

DOWN

LEFT

RIGHT

bus datos

D0

D1

D2

D3

D4

D5

D6

D7

Como se aprecia en la tabla, el joystick 1 corresponde a la primera mitad del byte obtenido y le corresponden valores entre 0 y 15. Por otra parte al joystick 2 le corresponde la parte inferior del byte, valores entre 16 y 255. Durante la inicialización del sistema todo el puerto se configura como entradas.

El puerto B es una historia completamente distinta:

PUERTO B

PUERTO

PB0

PB1

PB2

PB3

PB4

PB5

PB6

PB7

PIA PIN

10

11

12

13

14

15

16

17

USO

MMU 9

MMU 18

MMU 6

bus datos

D0

D1

D2

D3

D4

D5

D6

D7

Solo se usan tres pines, PB0 (pin10), PB1 (pin11), PB7 (pin17).Todos van al chip MMU Memory Management Unit o unidad manejadora de memoria. El que se encarga de activar el chip que contiene el Basic, el chip del Sistema Operativo (ROM) y el Self Test. Quedan disponibles cinco pines PB2 (pin12) PB3 (pin13) PB4 (pin14) PB5 (pin15) PB6 (pin16). Durante la inicialización del sistema todo el puerto se configura como salidas, independientemente si son pines en uso o no.

¿Como conversa la PIA con la CPU?

El conexionado entre la PIA y la CPU es mucho más simple de lo que aparenta. Deglosemos parte por parte:

- Pin 1 va hacia gnd o tierra
- Pines 2 3 4 5 6 7 8 9 van hacia los joysticks
- Pines 10 y 11 van hacia al MMU

- Pines 12 13 14 15 16 no se usan
- Pin 17 va al MMU
- Pin 18 ó CB1 va al SIO(pin13) INTERRUPT
- Pin 19 ó CB2 va al SIO(PIN7) COMMAND
- Pin 20 Vcc es la alimentación +5Volts
- Pin 21 es Read Write o R/W. Va hacia la CPU pin 14
- Pin 22 es CSO o Chip Select 0, habilita en nivel alto, Va hacia Vcc en conjunto con CS1

- Pin 23 es CS2 o Chip Select 2, habilita en nivel bajo. Va hacia chip decodificador U2 74LS138 pin12

- Pin 24 es CS1 o Chip Select 1, habilita en nivel alto. Va hacia Vcc en conjunto con CS0

- Pin 25 es 02 o señal de reloj. Va hacia U18 pin 11 y desde el pin 12 de éste a la CPU pin39

- Pin 26 27 28 29 30 31 32 33 es el bus de datos. Corresponden exactamente con los de la CPU (pines 26 27 28 29 30 31 32 33)

- Pin 34 señal de Reset, activa en nivel bajo. Va hacia la CPU pin 40

- Pin 35 RS1, va hacia la CPU bus de direcciones A0 (pin 9)

- Pin 36 RS0, va hacia la CPU bus de direcciones A1 (pin 10)

- Pin 37 IRQ B, más IRQ A van hacia la CPU IRQ (pin 4)

- Pin 38 IRQ A, más IRQ B van hacia la CPU IRQ (pin 4)

- CA1 (pin40) va al SIO (pin 9) PROCEED
- CA2 (pin39) va al SIO (pin 8) y controla el motor de la casetera

¿A que hay que prestarle atención? Pues... a todo! Pero lo más importante es como la CPU "habla" con la PIA. Esto se realiza basicamente entre RS1-A0 RS0-A1 y el bus de datos. Dependiendo del valor de A0 y A1 afecta a RS0 y RS1 y eso es lo que permite programar y acceder a ciertas funciones de la PIA.
La señal de reset es para poner todo a cero (partida). La señal CK02 es la señal de reloj. Y la más importante, aunque no se conecta a la CPU, es CS2 el cual se conecta a un chip decodificador, al cual activa la PIA siempre que se haga un POKE entre un rango de direcciones que abarca desde 54016 (D300) hasta 54271 (D3FF).

La configuración de la PIA puede parecer un poco enredada, pero no lo es. Al encender el computador el sistema operativo configura automáticamente, y según las necesidades del Atari, el puerto A todo como entrada y el puerto B todo como salida. Esto quiere decir que del puerto A fluyen datos desde los joysticks hacia la CPU y el puerto B a la inversa, desde la CPU hacia el puerto y desde éste al MMU. Esto se mantiene así, a menos que sea modificado por el usuario (nosotros).

Utilizando el PUERTO A

El puerto A es el que más utilidad presta, ya que los enchufes de los joystick nos permiten conectar ahí mismo enchufes DB9 y usarlo a nuestro antojo. En cambio, hacer cualquier modificacion al puerto B sin saber lo que se esta haciendo, causará que el Atari se bloquee.

Para poder configurar el puerto A de la PIA como uno lo desee, solo hay que poner tres pokes:

PUERTO A COMO ENTRADA

PUERTO A COMO SALIDA

POKE 54018,56

POKE 54018,56

POKE 54016,0

POKE 54016,255

POKE 54018,60

POKE 54018,60


Resumiendo, unas simples instrucciones en Basic modifican el comportamiento de la PIA. Un valor de 0 en la posición de memoria 54016 envía ocho ceros al registro PACTL y setea todo el puerto A como entrada de datos y un valor de 255 en 54016 envía ocho unos causando que todo sea salida de datos. PACTL significa Port A ControL o control del puerto A.

Acá se muestra el orden en cuanto a la PIA y el bus de datos que le corresponde a cada pin de ambos joysticks en un 800XL.

Hoy en día existen muchos dispositivos que puede hacer lo mismo que un Atari y con más velocidad y muchas más prestaciones, pero quizas no es tan fácil como usar un Atari, para aprender. Por eso la intención mia al dar a conocer ésto es simplemente a modo didáctico, demostrando que aun un microcomputador tan básico como un Atari es capaz de controlar dispositivos externos con relativa facilidad entre programación y poco hardware.

¿Para que podríamos usar esto?

La respuesta no es una sola, ya que tal como viene de fábrica, el puerto A del Atari seteado todo como entradas, puedes:

- Conectar 8 switchs, por ejemplo desde algún tipo de máquina. Incluso usando optoacopladores o LDRs a modo de detección de posición.

- Hacer un joystick especial como el de Track and Field

- Usar un joystick como palanca (PA0 PA1 PA2 PA3) y PA4 PA5 PA6 PA7 como 4 botones extras.

Mitad entrada, mitad salida

Acá hay un buen ejemplo de usar 4 bits como salida y 4 bits como entrada, eso se puede hacer con la siguiente formula:

PUERTO A / MITAD IN - MITAD OUT

POKE 54018,52

POKE 54016,16

D7> 00001111<D0

POKE 54018,60

En este ejemplo, D0(PA0) D1(PA1) D2(PA2) D3(PA3) están a nivel 1, por lo tanto serán salidas. Y D4(PA4) D5(PA5) D6(PA7) D7(PA7) están a nivel 0, por lo tanto serán entradas. Gracias éste arreglo el joystick 1 será entrada y el joy dos salidas. Esta configuración se usa para, mediante un chip, multiplexar y conectar hasta 8 joysticks:


http://raster.atariportal.cz/hw/mj8_2007.gif

Salida

Juego de luces:

Entrada y salida

Grabador y lector de eproms:

-

Segunda PIA

Ahora, un puerto de salida es más que nada para proyectos grandes. A pesar que un puerto de 8 bits se puede "agrandar" multiplexando, hace más complejo su manejo en cuanto a software y hardware. Una segunda PIA, con ambos puertos desocupados, soluciona este problema.

Agregar una segunda PIA es super fácil.  En el siguiente esquemático se puede apreciar como se conecta:

Todas las lineas que la unen al Atari se comparten, excepto CS2 (pin 23), que debe unirse al pin 10 del chip U2 (74LS138). CB1 (pin 18), CA1 (pin 40) quedan sin uso y se unen a Vcc con una resistencia de 4.7K. Y aca otra cosa buena, CB2 (pin 19) es otra salida, así como también CA2 (pin 39). Entonces son dos puertos de 8 bits, más dos salidas extras.
La linea punteada permite elegir entre D500 y D100,

La PIA del Atari se ubica en la posición de memoria D300. La segunda puede estar direccionada en D500 o D100. Con un pequeño detalle que analizaremos.

Veamos la siguiente tabla de comparación entre la direcciones de la PIA del Atari y la segunda:

PIA 1 D3XX
Esta es la PIA normal, la que viene de fábrica en los Atari.

PIA 1 PUERTO A

PIA 1 PUERTO B

D300 54016 D301 54017
D302 54018 D303 54019

PIA 2 D5XX
La segunda PIA se puede seleccionar en D5XX, pero ésta dirección también la usa el cartridge. Por lo que no se pueden usar al mismo tiempo. Claro, si no va a usar cartridge, no hay problema. O puede ponerse un interruptor que desabilite la PIA cuando se quiera usar el cartridge.

PIA 2 PUERTO A

PIA 2 PUERTO B

D500 54528 D501 54529
D502 54530 D503 54531


PIA 1 D1XX
Y tambien puede conectarse en D1XX, pero en los primero Atari ésta dirección controla el chip ANTIC, por lo que creo, y no lo he comprobado, podría haber conflictos con ciertos programas o juegos. Hasta ahora las pruebas que he hecho no me han causado problema.

PIA 2 PUERTO A

PIA 2 PUERTO B

D100

53504

D101

53505

D102

53506

D103

53507

Y ahora la programación.

PIA 2 Puerto A en D500

PUERTO A COMO ENTRADA

PUERTO A COMO SALIDA

POKE 54530,56

POKE 54530,56

POKE 54528,0

POKE 54528,255

POKE 54530,60

POKE 54530,60

PIA 2 Puerto B en D500

PUERTO B COMO ENTRADA

PUERTO B COMO SALIDA

POKE 54531,56

POKE 54531,56

POKE 54529,0

POKE 54529,255

POKE 54531,60

POKE 54531,60

PIA 2 Puerto A en D100

PUERTO A COMO ENTRADA

PUERTO A COMO SALIDA

POKE 53506,56

POKE 53506,56

POKE 53504,0

POKE 53504,255

POKE 53506,60

POKE 53506,60

PIA 2 Puerto B en D100

PUERTO A COMO ENTRADA

PUERTO A COMO SALIDA

POKE 53507,56

POKE 53507,56

POKE 53505,0

POKE 53505,255

POKE 53507,60

POKE 53507,60

Resumiendo

Para primero hay que preparar la PIA2:

Usando D5XX

Para que el Atari reciba datos, tal como la PIA normal

Puerto A

BASIC

ASSEMBLY

10 POKE 54530,56
20 POKE 54528,0
30 POKE 54530,60

Con eso queda programada
Ahora los datos se leen así:

40 A=PEEK(54530)

LDA 56
STA 54530
LDA 0
STA 54528
LDA 60
STA 54530

LDA 54530

Puerto B

BASIC

ASSEMBLY

10 POKE 54531,56
20 POKE 54529,0
30 POKE 54531,60

Con eso queda programada
Ahora los datos se leen así:

40 A=PEEK(54531)

LDA 56
STA 54531
LDA 0
STA 54529
LDA 60
STA 54531

LDA 54529

Usando D5XX

Para que el Atari envíe datos:

Puerto A

BASIC

ASSEMBLY

10 POKE 54530,56
20 POKE 54528,255
30 POKE 54530,60

Con eso queda programada
Ahora los datos se envían así:

40 POKE 54530,DATO A ENVIAR

LDA 56
STA 54530
LDA 255
STA 54528
LDA 60
STA 54530

LDA DATO A ENVIAR
STA 54530

Puerto B

BASIC

ASSEMBLY

10 POKE 54531,56
20 POKE 54529,255
30 POKE 54531,60

Con eso queda programada
Ahora los datos se envían así:

40 POKE 54531,DATO A ENVIAR

LDA 56
STA 54531
LDA 255
STA 54529
LDA 60
STA 54531

LDA DATO A ENVIAR
STA 54529

Ejemplos prácticos

Podemos usar la PIA para escanear un puerto como entrada, por ejemplo, para un tercer joystick:

PIA2 D5XX - Puerto A

10 POKE 54530,56
20 POKE 54528,0
30 POKE 54530,60

40 A=PEEK(54530)
41 IF A=254 THEN GOSUB 100
42 IF A=253 THEN GOSUB 200
43 IF A=251 THEN GOSUB 300
44 IF A=247 THEN GOSUB 400
50 GOTO 40

100 REM RUTINA UP A SIDO PRESIONADO
101 PRINT "JOY3 UP"
102 RETURN
200 REM RUTINA UP A SIDO PRESIONADO
201 PRINT "JOY3 DOWN"
202 RETURN
300 REM RUTINA UP A SIDO PRESIONADO
301 PRINT "JOY3 LEFT"
302 RETURN
400 REM RUTINA UP A SIDO PRESIONADO
401 PRINT "JOY3 RIGHT"
402 RETURN

10 ABRE REGISTRO DE DIRECCIÓN
20 INDICA TODO EL PUERTO A COMO ENTRADA
30 CIERRA REGISTRO DE DIRECCION

40 A es igual al valor del puerto
41 si A es igual a 254 vaya a subrutina 100
42 si A es igual a 253 vaya a subrutina 200
43 si A es igual a 251 vaya a subrutina 300
44 si A es igual a 247 vaya a subrutina 400
50 (si no se encontraron cohincidencias) vuelva a leer el puerto en la línea 40
100 REM
101 IMPRIMA EN PANTALLA "JOY3 UP"
102 regrese a rutina principal, desde línea donde saltó
100 REM
201 IMPRIMA EN PANTALLA "JOY3 DOWN"
202 regrese a rutina principal, desde línea donde saltó
300 REM
301 IMPRIMA EN PANTALLA "JOY3 LEFT"
302 regrese a rutina principal, desde línea donde saltó
400 REM
401 IMPRIMA EN PANTALLA "JOY3 RIGHT"
402 regrese a rutina principal, desde línea donde saltó

¿Por que los valores del joystick se leen como 254, 253, 251, 247?
Por que, en este caso, cada una de las ocho entradas del puerto deben tener conectada una resistencia de 4.7K hacía Vcc. Esto causa que todos los bits sean leidos como 1. Y estando todos a 1, en posición de reposo del joystick, el valor del puerto es 255. Al presionar hacia abajo se resta 1 a 255, hacia abajo se resta 2, hacia la izquierda 4 y hacia la derecha 8.

PIA2 D5XX - Puerto A

COMBINACIONES POSIBLES

PA3-D3 PA2-D2 PA1-D1 PA0-D0

 

8

4

2

1

RESTA

1

1

1

1

REPOSO=255

1

1

1

0

UP 255-1=254

1

1

0

1

DOWN 255-2=253

1

0

0

0

 

1

0

1

1

LEFT=255-4=251

1

0

1

0

 

1

0

0

1

 

1

0

0

0

 

0

1

1

1

RIGHT=255-8=247

0

1

1

0

 

0

1

0

1

 

0

1

0

0

 

0

0

1

1

 

0

0

1

0

 

0

0

0

1

 

0

0

0

0

 

¿Que pasa con las otras combinaciones? Pues corresponden a las diagonales del joystick, que pueden ser UP-Left Up-Right Down-Left Down-Right. No esperaran que les enseñe todo... ¿o si? Piensen un poco y determinen cuales serían los valores para detectarlas. :-)

Más a fondo:

54016 (W / R) lee o escribe datos desde terminales de controlador uno y dos si el bit2 de PACTL (ubicación 54018) es uno. La escritura en el control de dirección si el bit 2 del PACTL es cero.

Bien, todo lo aquí descrito a sido realizado paso a paso teniendo los conocimientos sobre lo que se está haciendo. Tenga en cuenta que un mal conexionado puede dañar su Atari, por lo que tenga cuidado y hagalo a su propio riesgo.

Warning: Attempts to modify your Atari without the proper knowledge, and skills, can result in a serious damage to your atari. Do it at your own risk.

Esta sección, con otros ejemplos, CONTINUARÁ......