El morador de la crypta nos ha comentado por lo bajinis a pser1 y a mí, un cartucho para DRAGON / COCO, que dispone de adaptadores para otros sistemas.
Después de pegar un vistazo al sistema, paso a explicar un poco lo que representa y un poco como creo que funciona.
Al no disponer de esquemas ni nada que se le parezca, esto va a ser un poco hipotético, intentando acercarme un poco a la realidad.
Con permiso no explicito de Pere, me adelanto con un poco de contenido, para que él o quien quiera, pueda completar la información.
Fuentes: World of Dragon
AtariAge
Comenzamos:
El Multicart de Rolo es una cartucho para Dragon 32-64 y Coco 2 que permite lanzar programas grabados en la ROM. Con un rango de direccionamiento desde $c0000 hasta $ff00.
Es decir, 16Kbs de Juegos.
La tarjeta viene con una ROM 27c4001, que permite almacenar 64 roms de 8kbs. Tambien se pueden usar roms de 16kbs.
Unicamente hay que seleccionar un slot de memoria desde 0 hasta 63 y resetear el equipo para que se lance la rom.
La ventaja de un cartucho... Bueno, pues cero problemas en cables, no hace falta una fuente de alimentación externa, no hay tarjetas controladoras.
La tarjeta Dragon/Coco puede ser usada en otros sistemas, mediante el uso de adaptadores.
Actualmente hay disponibles tres adaptadores.
-VECTREX
-Odyssey 2 / Phillips G7000/G7200/G7400
-INTERTON ELECTRONIC VC 4000
Es decir, te compras el cartucho, un adaptador... y ya tienes para otro sistema.
Después de analizar un poco el circuito y los componentes, me atrevería a decir que aunque no sepamos lo que hay dentro del PIC, no creo que sea relevante para el funcionamiento del cartucho.
Viendo las pistas, el tipo de PIC y lo que tenemos... podría darse el caso que el PIC es únicamente para controlar el Display de 14 segmentos mediante un programa similar al que adjunto que me he encontrado por la red.
Inicio de código:
Código: Seleccionar todo
;********************************************************************************
; Filename: DecoHexa7Seg_tablas_P18F_X5X0 *
; Date: 29/10/2015 *
; Version: 01 *
; Author: Javier Soto PhD. *
; Company: Escuela Colombiana de Ingenieria Julio Garavito - Grupo SEDA *
; Description: Este programa presenta el manejo de tablas. Permite decodificar *
; un dato hexadecimal (entrada) a un display de 7 segmentos (salida). *
;********************************************************************************
; Este ejemplo se puede adaptar a otros dispositivos de la familia PIC18F
; modificando apropiadamente las siguientes lineas:
LIST P=18F2520 ;directiva que define el procesador
#include <P18F2520.INC> ;definicion de variables especificas
;********************************************************************************
;Bits de configuración
;Para PIC18F_2420_2520_4420_4520 use las siguientes directivas
CONFIG OSC = INTIO67 ;Internal oscillator block, port function on RA6 and RA7
CONFIG PBADEN = OFF ;PORTB<4:0> pins are configured as digital I/O on Reset
;Para PIC18F_2455_2550_4455_4550 use la siguiente configuración para el OSC interno
;CONFIG FOSC = INTOSCIO_EC ;Internal oscillator, port function on RA6,
;EC used by USB (INTIO)
;otras directivas comunes
CONFIG LVP = OFF ;Single-Supply ICSP disabled
CONFIG WDT = OFF ;WDT disabled (control is placed on the SWDTEN bit)
;********************************************************************************
;Definicion de variables en el bloque de "ACCESS RAM"
;********************************************************************************
hexa_temp equ 0x000 ;variable temporal para el dato hexadecimal
;********************************************************************************
;Programa
;********************************************************************************
ORG 0x0000 ;Vector de rieinicialización
movlw b'01110010' ;Registro de control del oscilador:
movwf OSCCON,A ;modo sleep con instruccion SLEEP,
;Fosc=8MHz, bloque de oscilador interno.
MOVLW 0Fh ;Configuración de los canales del módulo A/D
MOVWF ADCON1,A ;como entradas/salidas digitales PORTA y PORTB
setf TRISA,A ;Puerto A de entrada (dato hexadecimal)
clrf TRISB,A ;Puerto B de salida (display 7 segmentos)
ciclo
movf PORTA,W,A ;Leer valor hexa en PORTA(3:0)
rcall deco_hexa_7seg ;llamar rutina decodificación hexa a 7 segmentos
movwf LATB,A ;sacar valor decodificado por puerto B (display)
bra ciclo
;********************************************************************************
;SUBRUTINAS
;********************************************************************************
deco_hexa_7seg
andlw 0x0f ;enmascarar y almacenar valor en variable hexa_temp
movwf hexa_temp,A
movlw HIGH tabla_hex7seg ;asignar posición de la tabla al puntador
movwf TBLPTRH,A ;de tabla, registros: TBLPTRH y TBLPTRL,
movlw LOW tabla_hex7seg ;registro TBLPTRU por defecto en 0
movwf TBLPTRL,A ;TBLPTRU=00h, TBLPTRH=7Fh, TBLPTRL=00h
movf hexa_temp,W,A ;sumar el valor de la variable hexa_temp al apuntador
addwf TBLPTRL,F,A ;de tabla, registros: TBLPTRH y TBLPTRL
bnc $+4
incf TBLPTRH,F,A
tblrd* ;leer tabla, el dato leido queda en registro TABLAT
movf TABLAT,W,A ;leer TABLAT, dejar dato decodificado en W
return
;********************************************************************************
;Tabla decodificador
;********************************************************************************
; addr program memory | abcdefgh | hexa | # en display
; ------------------------------------------------------------------
; 0x7F00 | 11111100 | 0xFC | 0
; 0x7F01 | 01100000 | 0x60 | 1
; 0x7F02 | 11011010 | 0xDA | 2
; 0x7F03 | 11110010 | 0xF2 | 3
; 0x7F04 | 01100110 | 0x66 | 4
; 0x7F05 | 10110110 | 0xB6 | 5
; 0x7F06 | 10111110 | 0xBE | 6
; 0x7F07 | 11100000 | 0xE0 | 7
; 0x7F08 | 11111110 | 0xFE | 8
; 0x7F09 | 11110110 | 0xF6 | 9
; 0x7F0A | 11101110 | 0xEE | A
; 0x7F0B | 00111110 | 0x3E | b
; 0x7F0C | 10011100 | 0x9C | C
; 0x7F0D | 01111010 | 0x7A | d
; 0x7F0E | 10011110 | 0x9E | E
; 0x7F0F | 10001110 | 0x8E | F
;********************************************************************************
org 0x7F00 ;tabla ubicada en la posicion 0x7F00
tabla_hex7seg ;de la memoria de programa
DE 0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0 ;datos en posiciones 0x7F00...0x7F07
DE 0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E ;datos en posiciones 0x7F08...0x7F0F
END ; directiva 'fin de programa'
Fin de codigo
Los potes digitales, van conectados a al PIC y también a la EPROM y valen para seleccionar el banco de la ROM
Por lo que se puede ver en la tabla de verdad del pote, cada posición, es una salida binaria de 4 bits.
Así que vamos a ver que pasa en la EPROM
Tenemos una EPROM 27C4001 de 4Mbits o 512Kbs (8Kbs x 64 posiciones)
Esta memoria disponemos de las patitas desde la A0 a la A18 para direccionar esos 512Kbs (Bus de direcciones).
Y luego disponemos del bus de datos (por donde van los datos), que son las patitas Q0 a Q7 (8bits)
Como el Dragón solo puede direccionar a través de su puerto supongo que 16kbs, pues estarán redireccionadas las conexiones del cartucho a las patillas de la EPROM de la A0 a la A13 (Que forman un total de 16Kbs)
Por cierto... El dragon tiene por su salida del A0 al A15 (16bits)
Sigamos:
Nos sobran desde la A14 a la A18, un total de 5 bits. En verdad deberían de ser 6 bits, para poder elegir esos 64 bancos. Aquí debe de haber un truco con el conmutador de ROMS de 8Kbs y 16Kbs, que debe de deshabilitar la salida A13 del dragón y mandarla al selector.
Esto se trata de saber ordenar las ROMS en el cartucho y seleccionarlo con las señales que nos quedan libres del bus de Direcciones del ordenador para cambiar los bancos de memoria en la EPROM.
Y el Bus de datos... siempre conectado al puerto del ordenador...
Recapitulando:
Una EPROM conectada al puerto del cartucho, en el que podemos elejir un banco de memoria para seleccionar la ROM
Lista de material:
Resistencias (unas cuantas)
Memoria: 27C4001
PIC 16F1826 (1,5€) aunque seguro que existen otras opciones sin necesidad de PIC.
Display 14 segmentos
Dos potes decodificadores HEX Digital
Dos interruptores/selectores. Para selección de tipo de ROM (8kb o 16kb) o Arranque Auto ¿?