Voy a intentar compartir mi pasion (y mis horas invertidas) por la NES en su programacion.
Para seguir el tutorial (despues de explicar los basicos) subire un pack con todo lo necesario para seguir el tutorial con mi framework para NESHLA
Yo no soy un experto de 6502 ni mucho menos, por eso mismo no explicare nada del lenguaje que no tenga que ver con el tutorial en concreto asi que si quereis seguirlo, tendreis que miraros opcodes y demas...
(Muchos datos los sacare de: http://wiki.nesdev.com aunque alli esta en ingles)
Arquitectura Basica
Antes de programar una sola linea hay que tener clara la arquitectura de la NES (la basica, sin uso de mappers)
La NES es capaz de direccionar 64KB de memoria (con mappers la cosa cambia "un poco" porque nunca se pueden ver mas de 64KB a la vez).
Direccion Tamaño Dispositivo
$0000 $0800 2KB RAM
$0800 $0800 Mirrors de la RAM
$1000 $0800 Mirrors de la RAM
$1800 $0800 Mirrors de la RAM
$2000 $0008 registros PPU
$2008 $1FF8 Mirrors de $2000 cada 8 bytes
$4000 $0018 registros NES APU y I/O
$4018 $BFE7 PRG ROM del cartucho, PRG RAM del cartucho y registros del mapper
$FFFA - vector NMI
$FFFC - vector Reset
$FFFE - vector IRQ/BRK
Nuestros programas estaran siempre (a no ser que carguemos codigo en RAM) en la parte alta $8000-$FFF9.
Y nuestras variables en los primeros $2000 con excepcion de
A) la pila, que esta en $01E0 - $01FF ya que usaremos solo 32bytes, sino se nos comeria hasta 256
y
B) la copia de la memoria de los sprites, que se puede colocar en cualquier lugar de la RAM (en incrementos de 256 en 256) y que con el framework esta situada en $0200 y ocupa 256bytes
Asi que tendremos 2048 - 256 - 32 = 1760 (menos las que se comera el framework.)
Importante, la ram que va de $0000 a $00FF permite acceder de forma mas rapida a la misma ya que la cpu se puede ahorrar un byte a la hora de escribir las instrucciones. Normalmente se utiliza esta ram para rutinas que requieran maxima velocidad. A esta zona especial se la llama Zero Page RAM.
vector NMI : puntero a la interrupcion que se ejecutara cada vblank del monitor.
vector Reset : puntero a la interrupcion que se ejecutara al hacer reset.
vector IRQ/BRK : puntero a la interrupcion que se ejecutara al ejecutar la instruccion BRK o recibir una IRQ externa
Por ahora nos interesan los 2 primeros, que son muy facilmente configurables en NESHLA como veremos mas adelante.
Configuracion de la NES para el tutorial
Todos los ejemplos aqui generados seran para una NES sin ningun tipo de mapper, es decir, cartuchos con 32KB de ROM y 8KB de CHROM, que es la configuracion mas sencilla y no requiere conocimiento de ningun mapper, si la cosa va mas alla se podran hacer pruebas con otros mappers como AXROM, UNROM, MMC1 o MMC3, que estan soportados por mi framework.
Programa basico
Una cosa muy importante a tener en cuenta cuando se programa en la NES es que si no se desactiva el video, todos los cambios que se hagan en pantalla, sprites, etc, han de hacerse DENTRO de la interrupcion NMI, para ello el framework incluye un sistema de colas para asignar tareas a la rutina NMI que ya esta configurada.
Descripcion de los ficheros de un proyecto con el framework (o lo que nos importa tocar ya que el resto lo hara el framework por nosotros):
Aquí pondre para descarga proximamente un proyecto vacio que cargará un fondo y permitirá mover un sprite por pantalla y pasare a explicar todos sus archivos.
Llegados a este punto decidme si habeis entendido algo para que pueda ir ampliando la información para que quede todo mas claro.
Continuara...


)
![más risas [+risas]](./images/smilies/nuevos/risa_ani3.gif)
