Funcionamiento de la Famicom Disk System
Introducción
Aquí tengo información, que para muchos sera vital y a otros les sonará a chino, de como funcionaba la FDS. Disfrútenlo.
Fecha: 1998/05/17 por Goroh. Traducido por sgt. bowhack a inglés. Traducido a Español por KAISER-77.
Esto se explicará en este documento:
- Configuración de cada bloque del disco
- Errores de la BIOS
- Puertos
- Como emularla
Configuración del Disco
Este sistema esta formado por un grupo de bloques y llamadas a datos. Cada ID de cada bloque ocupa 1 byte en el principio de cada bloque que lo describe.
Bloque de cabecera del DISK Header Block (BlockID=1)
Este bloque guarda un atributo:

Configuración de bytes
- (Tamaño 1byte) #$01 BloqueID
- (Tamaño 14byte) *NINTENDO-HVC* reconoce los datos para la Famicom Disk
- (Tamaño 1byte) Creación de reconocimiento
- (Tamaño 4byte) Reconocimiento del ID del juego
- (Tamaño 1byte) Número de versión del juego
- (Tamaño 1byte) Número de la cara del disco (0:Cara-A 1:Cara-B)
- (Tamaño 1byte) Disco adicional #1
- (Tamaño 1byte) Disco adicional #2
- (Tamaño 1byte) Disco adicional #3
- (Tamaño 1byte) $08 Almacenamiento
- (Tamaño 30byte) Espacio reservado (La DiskBIOS no lo usa)
Bloque de la cantidad del archivo (BlockID=2)
El bloque almacena el número de archivos que esta en el disco
Ejemplo:

Configuración del byte
- (Tamaño 1byte) #$02 BlockID
- (Tamaño 1byte) guarda $06 varias veces
Bloque de cabecera del archivo (BlockID=3)
El bloque almacena atributos del archivo.
Ejemplo:

Configuración del byte
- (Tamaño 1byte) #$03 BlockID
- (Tamaño 1byte) Número archivos (DiskBIOS no usa este dato)
- (Tamaño 1byte) Número archivos 2 (DiskBIOS no usa este dato)
- (Tamaño 8byte) Nombre del archivo (DiskBIOS no usa este dato)
- (Tamaño 2byte) Lugar de almacenamiento del archivo
- (Tamaño 2byte) Tamaño del archivo
- (Tamaño 1byte) Tipo del archivo (0:Dato 1:Datos caracter 2:Dato de la tabla del nombre) (DiskBIOS no distingue entre 1 y 2)
Bloque de dato del archivo (BlockID=4)
El bloque almacena datos de un archivo
- (Tamaño 1byte) #$04 BlockID
- (Tamaño -----) Datos del archivo
Configuración del posicionamiento
- Bloque de cabecera del disco
- Varios archivos del bloque + Bloque (Varias veces...)
- Bloque de cabecera del archivo
- Bloque de datos del archivo
Disk Errors
Ver aquí.
Controles del sistemas de discos
- 4020 -W Timer IRQ Registro de control 0
- 4021 -W Timer IRQ Registro de control 1
- 4022 -W Timer IRQ Registro de control 2
- 4023 -W Timer IRQ Registro de control 3
Actualmente en análisis
- 4024 -W Port Output
- 4025 -W Control Register Input
- 4bit eye(look?): Espejo (VRAM A10) 0:LHLH 1:LLHH
Figura de sincronización
- < Incluye un caso de leer >
- A Inicializar
- B Impulsor encendido
- C Leer y marcar
- D IRQ_Activada
- E Leer y marcar
- 1. Datoleido, 4030's 6bit = 0
- 2. Datoleido, 4030's 5bit = 0
| A | B | C | D || E | 8bit |___|______|___|---||------___| 7bit |___|______|---|---||------___| 6bit |---|------|---|---||---------| 5bit |___|______|___|___||___---___| 3bit |---|------|---|---||---------| 2bit |---|---___|___|___||_________| 1bit |___|------|---|---||------___| Note | | | | || 1 2 |>
- < Si escribe y es un vacio>
- A Inicializar
- B Impulsor encendido
- C Escribir_comienzo_marca & empezar a escribir
- D IRQ_Activada
- E Escribir final de marca
- 1. latencia, EscrbirDato #$00
- 2. EscrbirDato #$80
- 3. EscrbirDato, 4030's 6bit = 0
- 4. Latencia
| A | B | C | D || E | 8bit |___|______|______|---||------___| 7bit |___|______|___---|---||------___| 6bit |---|------|------|---||---------| 5bit |___|______|______|___||___---___| 3bit |---|------|______|___||______---| 2bit |---|---___|______|___||_________| 1bit |___|------|------|---||------___| Note | | | 1 | 2 || 3 4 |>
- 4026 -W ExPort Output
Útil para salida de terminal de expansiones donde hay un obturador en la vuelta de la tarjeta RAM.
- 4030 R- Disk Status Register 0
-A-B---- Causa un error cuando A y B son 1 después él llama a la información contenido en los mandos del disco.
- 4031 R- Port Input
Cuando los datos estan divididos, los datos transferidos llegan a definirse en un disco y se unen mientras la lectura de esa dirección no sea vacio
- 4032 R- Disk Status Register 1
PSD
- Información de la unidad de disco
- D Bandera de medio
- 0: Disco insertado
- 1: Disco no insertado
- S Bandera de preparado
- 0: Disco preparado
- 1: Disco no preparado
- P Bandera de protegido
- 0: Escribir sin proteger
- 1: Escribir proteguido
- 4033 ExPort Input
- B
- B: Baja bateria en el disco
- 0: ALTA
- 1: BAJA
- 4040-407F Wave Table Data
- 4080 Volume Control register
- bit TFffffff
- T: Tipo de control de volumen 0:Bajo ,hundido 1:Inmediato
- T=Si vale 1...
- F:Ignorar
- ffffff: Volumen 0:mínimo (sin sonido)..3f:máximo
- T=Si vale 0...
- F: Bajo ,hundido 0:Hundido 1:Bajo
- ffffff: Baja velocidad 0:rápida .. 3f:baja
- 4082 Frequence Control registere(LOW)
- bit ffffffff: Baja frecuencia
- 4083 Frequence Control registere(High)
- bit E---ffff
- E: Si vale 1 el sonido de salida se apaga
- ffff: Alta frecuencia
- Al sonar el centro de un teclado si f =#096
- 4084 Efector Control register
- bit TFffffff
- T: Tipo de control del Efector 0:bajo,hundido 1:Inmediato
- T=Si vale 1...
- F: Ignorar
- ffffff: Velocidad de hundir del efector
- T=Si vale 0...
- F: Efecto bajo/hundido 0:Hundido 1:Bajo
- ffffff: Velocidad baja, hundida 0:rápida .. 3f:baja
- 4085 Efector State Control register
- bit Svvvvvvv
- S:Guarda el estado del efecto.
- vvvvvvv: Estado efecto
- 4086 Efector Speed Control register(Low)
- 4087 Efector Speed COntrol register(High)
- RSssssss
- R: Reset
- S: Máxima velocidad
- ssssss: Velocidad Efector
- 4088 ABCD
- Desconocido
- 4089 E-------
- E: Sonido de salida Activado/Desactivado 0:Activado 1:Desactivado
Especificaciones del cable
Cable de unidad del disco
1 3 5 7 9 B 2 4 6 8 A C
- 1:Corriente
- 2:Salida Impulsor Activado $4025's 3bit
- 3:Tierra
- 4:Salida Lectura $4025's 2bit
- 5:Entrada Sentido Sense Voltage $4033's 8bit
- Entiende la situación de encendido cuando el motor esta activado.
- 6:Entrada Lectura Datos[9] $4031
- 8:Entrada Escritura Protegida $4032's 3bit
- 9:Entrada MediaSet $4032's 1bit
- A:Salida Escritura: DATA $4024
- B:Salida Escritura: $4025's 1bit
- C:Entrada Preparado: $4032's 2bit
Cable de extensión
1 3 5 7 9 2 4 6 8 A
- 1:Tierra
- 2:Corriente
- 3:Entrada $4033's 1bit Salida $4026's 1bit
- 4:Entrada $4033's 2bit Salida $4026's 2bit
- 5:Entrada $4033's 3bit Salida $4026's 3bit
- 6:Entrada $4033's 4bit Salida $4026's 4bit
- 7:Entrada $4033's 5bit Salida $4026's 5bit
- 8:Entrada $4033's 6bit Salida $4026's 6bit
- 9:Entrada $4033's 7bit Salida $4026's 7bit
- A:NC
Método correspondiente al emulador
- Usa $6000-$DFFF para RAM
- Organiza un puntero para enseñar la posición de dato actual en el disco
- Para las figuras sincronizadas del $4025, si IRQ está en un intervalo estacionario, este usa un puntero del actual dato de un disco de 8 bits para verlo con velocidad de un incremento.
- Datos de salida para el actual puntero dentro de $4031
- Usa leer y escribir el último dato de cada bloque vacio, referido a las figuras sincronizadas de $4025 (puedes fácilmente *preguntar a archivos FDS como esto)
- Los 2 bits del $4025 muestran como conseguir el principio para un puntero de un disco cuando funciona.
- $4030 devuelve un valor que no causa un error cada vez que el tiempo empieza a atestarse cuando lee.
- Los 8 bits del $4033 muestran un 0 en todo momento.