Difficulty on making an FDS project?
Posted: Mon Nov 28, 2016 10:25 pm
I'm looking in to this, is there a massive technical difference between a normal NES rom style project and an FDS project?
NES Development and Strangulation Records message boards
http://forums.nesdev.com/
Once you have a working program and want to try it, make a newPokun wrote:Edit: BTW there is a way to trick the BIOS to skip the Kyodaku screen so you can boot faster, but I haven't tried it and I didn't want to do it in a basic example template.
Code: Select all
file on the disk that gets loaded [b]last[/b] upon bootup, whose load address is $2000. It should be about 256 bytes long, and have these 8 bytes repeating:
$90 00 00 00 00 00 00 00
The FDS BIOS/Copyright screen will be skipped.
ccovell wrote:Code: Select all
file on the disk that gets loaded [b]last[/b] upon bootup, whose load address is $2000. It should be about 256 bytes long, and have these 8 bytes repeating: $90 00 00 00 00 00 00 00 [/quote]Does that effectively just enable NMIs? and why 32-ish repeats?
Thanks for sharing this, will take a lookGilbert wrote:A few years back, I'd tried converting my short demo to FDS.
I've just attached the archived source from my HDD. It's been a while so I haven't checked the integrity of the files, but just drop asm6.exe into the same folder as the files and launch the batch file and things should be done.
Instead of using copy/b actually one may also use asm6 itself to combine the files together (by using incbin and db for header stuff and the like).
So a PRG file then, how does the BIOS determine in what order to boot the files? Is it the file number, file ID or the order the files comes on the disk maybe?ccovell wrote:Once you have a working program and want to try it, make a new [ CODE ] file on the disk that gets loaded last upon bootupPokun wrote:Edit: BTW there is a way to trick the BIOS to skip the Kyodaku screen so you can boot faster, but I haven't tried it and I didn't want to do it in a basic example template.
Code: Select all
/* PPU IO */
#define PPU_CTRL1 0x2000
#define PPU_CTRL2 0x2001
#define PPU_STATUS 0x2002
#define PPU_SPR_ADDR 0x2003
#define PPU_SPR_IO 0x2004
#define PPU_VRAM_SCRL 0x2005
#define PPU_VRAM_ADDR 0x2006
#define PPU_VRAM_IO 0x2007
#define PPU_SPR_DMA 0x4014
#define PPU_TV_SYS 0x4119
/* For PPU_CTRL1 */
#define PC1_NAME_MASK 0x03 // mask of name table area
#define PC1_NAME0 0x00 // use name0
#define PC1_NAME1 0x01 // use name1
#define PC1_NAME2 0x02 // use name2, reserved
#define PC1_NAME3 0x03 // use name3, reserved
#define PC1_INC32 0x04 // add 32 by every access of ppu
#define PC1_SPR_PAT1 0x08 // sprite use pattern 1
#define PC1_BG_PAT1 0x10 // background use pattern 1
#define PC1_SPR_BIG 0x20 // set the sprite size 8*16
#define PC1_RESERVE 0x40 // reserved, unused
#define PC1_NMI 0x80 // nmi enable
/* For PPU_STATUS */
#define PS_VRAM_WFLAG 0x08 // vram write flag
#define PS_SPR_OVER8 0x20 // sprite over 8 on one scan line
#define PS_SPR0_HITFLAG 0x40 // #0 sprite hit flag
#define PS_VBLANK 0x80 // vblank flag
#define reg(_addr) (*((volatile unsigned char*)(_addr)))
void waitforvsync(void)
{
nes_timer = 0;
while(!nes_timer);
}
void nmi_enable(unsigned char en)
{
if(!en)
reg(PPU_CTRL1) &= ~PC1_NMI;
else
reg(PPU_CTRL1) |= PC1_NMI;
}
// incert this to your code, wait until the NMI is triggered
while(!(reg(PPU_STATUS) & PS_VBLANK));
// delay 1 frame for the NMI routine is done
waitforvsync();
...
...
...