User:Zzo38/Hardware NSF: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
(Created page with "These are some of my ideas for hardware NSF. ==Hardware== Memory from $4018-$403F would be filled by a 40-byte ROM used for an interrupt routine. Writing to this memory ...")
 
No edit summary
Line 52: Line 52:
* Start routine:
* Start routine:
** Disable main routine ROM.
** Disable main routine ROM.
** Call the play subroutine.
** Call the init subroutine.
** Enable interrupts.
** Enable interrupts.
** Run an idle loop doing nothing.
** Run an idle loop doing nothing.

Revision as of 03:25, 25 August 2012

These are some of my ideas for hardware NSF.

Hardware

Memory from $4018-$403F would be filled by a 40-byte ROM used for an interrupt routine. Writing to this memory is used to switch between main routine and program/data from .NSF file in the $8000-$FFFF space. (Famicom Disk System uses some of these addresses but NSF only uses the audio registers, not these ones.)

When the main routine is enabled, $8000 is RAM (used to store the current song number) and $8001-$FFFF is ROM.

The hardware generate IRQ at the rate specified in the NSF header. When IRQ is called, the IRQ vector should be read as $4018 whenever it is checked.

Another thing the hardware will do is convert the audio to digital and whenever the name tables are being accessed, make the pattern tables read as a waveform view of the music being played.

Main Routine

  • Disable IRQ.
  • Wait for PPU.
  • Write the starting song number to $8000.
  • Set up palette.
  • Fill up the nametable with the title and so on from the NSF header, and with the current and maximum song number, and indicate the music is stopped.
  • Enable background.
  • Loop:
    • Update the display of the current song number.
    • If LEFT is pushed:
      • Decrement current song number. If it is zero it wraps around.
    • If RIGHT is pushed:
      • Increment current song number. If it is too high it wraps to zero.
    • If START is pushed:
      • Initialize the sound registers by writing $00 to $4000-$4013, $0F to $4015.
      • Initialize the frame counter to 4-step mode ($40 to $4017).
      • Write initial bank values to $5FF6-$5FFF.
      • Update display to indicate song is playing.
      • Load value at memory $8000 into the accumulator.
      • Load zero into the X register.
      • Jump to the start routine.
  • Stop routine:
    • Disable interrupts.
    • Turn off all audio.
    • Reset the stack pointer.
    • Update display to indicate song is stopped.
    • Go to main loop checking which button is pushed.

Interrupt Routine

  • Check if the A button is pushed.
  • If the A button is pushed:
    • Enable main routine ROM.
    • Jump to the stop routine.
  • Call the play subroutine.
  • Reset the stack pointer.
  • Enable interrupts.
  • Run an idle loop doing nothing.
  • Start routine:
    • Disable main routine ROM.
    • Call the init subroutine.
    • Enable interrupts.
    • Run an idle loop doing nothing.