Page 1 of 2

WUDSN IDE: Free integrated 6502 IDE - Request for interest

Posted: Mon May 14, 2012 1:45 am
by JAC!
Hello,

My name is Peter Dell (JAC!) and I'm the author of WUDSN IDE, a free integrated 6502 development plugin for Eclipse. It started for Atari Xl, and meanwhile (after 3 years of development) also supports other platforms like C64 both in terms of assemblers and graphics converters, etc. Last week I was approached to see if the NES community also has an interest here.

For those who don't know the IDE yet, I recommend the features and FAQ on my web site and the video tutorials in youtube.

Have fun, Peter/JAC!

Image
Image
Image
Image
Image

Re: WUDSN IDE: Free integrated 6502 IDE - Request for intere

Posted: Mon May 14, 2012 5:57 am
by Hamtaro126
My favorite is CA65, The assembler of choice from the CC65 package, It has ASM6 compatibility. but hard to use with no useful IDE.

NESICIDE had similar features and a IDE, but lacks external emulator support and SNES support, and is slow!

Can it also use C64 and SNES's 65816 features using CA65's 65816 set? I would love it.

Tepples also uses this assembler even without a IDE!

I Recommend FCEUX and BSNES (Byuu's emulator) for emulation

EDIT: Unless it supports mappers, You may want a rewrite of your IDE to support them...

Posted: Mon May 14, 2012 6:20 am
by jayminer
I haven't tried NESICIDE yet (I have been meaning to for quite some time, but never gotten around to it), so I'm not sure if I'm the right person to answer here.

Anyways, my assembler of choice is also ca65 (from the cc65-package).

Since I have been thinking about doing C64 development aswell some time in the future, it would be awesome to be able to use an IDE that you already know and are comfortable with.

So I would say, if it isn't too much work to adapt it for the NES, I would love to try this and hopefully start using it for the game I'm working on currently.

Posted: Mon May 14, 2012 6:24 am
by slobu
I think it's important to note if this is an IDE for C or ASM.

I personally come from a high-level language background so I'd stick with NESICIDE which is an IDE for C.

@Hamtaro126: It sounds like yu have some valuable feedback for cpow regarding NESICIDE. If you have anything to contribute I'm sure he'd listen. Especially when it comes to details on what is "slow".

Posted: Mon May 14, 2012 7:02 am
by Bregalad
I currently use WLA-DX because it has a lot of features, but I'm pretty sure CA65 is even better in terms of features.

I like Eclipse so it'd be nice to develop 6502 code in it. However I'd prefer have it focused on C, even if it's not common yet to program the NES in C.

Posted: Mon May 14, 2012 7:06 am
by JAC!
>CA65
This has been also requested from other platforms and is the the list already. But since it works a bit different then the usual compilers (has linker etc.), it'll take a while because I personally have not used it yet.

>65816
I guess you refer to the 16 bit instructions. The supported instruction sets are defined per compiler. And currently there are sets for 6502/6502 with Illegal Opcodes/65816/DTV. Their names are depenent on the compiler also, only the core 6502 opcodes are always named the same.

>FCEUX and BSNES (Byuu's emulator) for emulation
Thanks, that#s valueable hint. For every platform there is a set of predefined emulators (i.e. mappings) plus "user defined" one.

>I think it's important to note if this is an IDE for C or ASM.
Sure, of course. Before I posted I was not even aware people use C for NES. I've been coding ASM for 25 years now, so I hardly think about other languages :-) And to give the answer: This is a pure ASM IDE.

Image

Posted: Mon May 14, 2012 10:50 am
by Jeroen
I personally use asm6, but if you were implementing something specificly into your ide i'd suggest CA65 simply cause asm6 was never really meant to be anything but a "lets do this quick and dirty" kind of assembler.

Posted: Mon May 14, 2012 12:47 pm
by tokumaru
Same as Jeroen. Regarding emulators, I just want to point out that FCEUX is a great development tool because of its debugging capabilities, but it's fairly inaccurate as an emulator.

Posted: Mon May 14, 2012 12:47 pm
by Shiru
There was a poll I started that shown that the most popular NES assemblers are CA65 and Asm6, then NESASM follows (but it is blamed a lot for being too old). Any other assemblers including DASM are pretty rare, although there are some users of each. So I guess these two, CA65 and Asm6, could be considered as a priority.

Posted: Mon May 14, 2012 1:01 pm
by dbozan99
Hello, I was actually the person who approached Peter about NES development.

I have been learning NES programming lately and I have been using ASM6 for assembly. Notepad++ syntax highlighting just wasn't cutting it for me and I stumbled onto WUDSN while looking for 6502 IDE's. I tried it out and immediately fell in love with all of the cool features but it didn't support any of the common NES assemblers so I sent some emails.

I've since been tweaking one of the existing XML files from inside the .jar file and have made a fairly capable ASM6 xml file. The XML file controls stuff like which directives do what and so on.


Here is the XML file if you are interested. I've just been overwriting (open file as archive with winrar or 7zip or whatever) the eclipse/plugins/com.wudsn.ide.asm.compilers_1.6.1.jar/com/wudsn/ide/asm/compiler/DASM/DasmCompiler.xml file and selecting DASM/2600 as my compiler for now.

This XML isn't perfect for ASM6 but it gets the job done; perhaps a CA65 compatible file is in order?

Code: Select all

<?xml version="1.0" encoding="iso-8859-1"?>	
<instructionset
	completionProposalAutoActivationCharacters="."
	singleLineCommentDelimiters=";"
	multipleLinesCommentDelimiters=""
	stringDelimiterCharacters="'""
	blockDefinitionCharacters=""
	identifiersCaseSensitive="false"
	identifierStartCharacters="?@_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
	identifierPartCharacters="_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
	identifierSeparatorCharacter=""
	labelDefinitionSuffixCharacter=":"
	macroUsagePrefixCharacter=""
	instructionsCaseSensitive="false"
	sourceIncludeDefaultExtension="">

	<directive cpu="ALL" name="ALIGN" title="_A_l_i_g_n program counter" type="DIRECTIVE" proposal="ALIGN _"/>
	<directive cpu="ALL" name="BASE" title="Set the _B_a_s_e program address" type="DIRECTIVE" proposal="BASE _"/>
	<directive cpu="ALL" name="BIN" title="Include _b_i_nary file" type="BINARY_INCLUDE_DIRECTIVE" proposal="BIN "_""/>
	<directive cpu="ALL" name="BYTE" title="Declare constant as _b_y_t_e" type="DIRECTIVE" proposal="BYTE _"/>
	<directive cpu="ALL" name="DC.B" title="_Declare _constant as _byte" type="DIRECTIVE" proposal="DC.B _"/>
	<directive cpu="ALL" name="DC.W" title="_Declare _constant as _word" type="DIRECTIVE" proposal="DC.W _"/>
	<directive cpu="ALL" name="DB" title="_Declare constant as _byte" type="DIRECTIVE" proposal="DB _"/>
	<directive cpu="ALL" name="DW" title="_Declare constant as _word" type="DIRECTIVE" proposal="DW _"/>
	<directive cpu="ALL" name="DL" title="_Declare only _lower byte of a 16-bit word" type="DIRECTIVE" proposal="DL _"/>
	<directive cpu="ALL" name="DH" title="_Declare only _higher byte of a 16-bit word" type="DIRECTIVE" proposal="DH _"/>
	<directive cpu="ALL" name="DS.B" title="_Declare _space in _bytes" type="DIRECTIVE" proposal="DS.B _"/>
	<directive cpu="ALL" name="DSB" title="_Declare _space in _bytes" type="DIRECTIVE" proposal="DSB _"/>
	<directive cpu="ALL" name="DS.W" title="_Declare _space in _words" type="DIRECTIVE" proposal="DS.W _"/>
	<directive cpu="ALL" name="DSW" title="_Declare _space in _words" type="DIRECTIVE" proposal="DSW _"/>
	<directive cpu="ALL" name="ELSE" title="_E_l_s_e" type="DIRECTIVE" proposal="ELSE_"/>
	<directive cpu="ALL" name="ELSEIF" title="_E_l_s_e _I_f" type="DIRECTIVE" proposal="ELSEIF _"/>
	<directive cpu="ALL" name="ENDIF" title="_E_n_d of _I_F" type="END_FOLDING_BLOCK_DIRECTIVE" proposal="ENDIF_"/>
	<directive cpu="ALL" name="ENDM" title="_E_n_d of _macro" type="END_SECTION_DIRECTIVE" proposal="ENDM_"/>
	<directive cpu="ALL" name="ENDE" title="_E_n_d _enumeration definition" type="END_SECTION_DIRECTIVE" proposal="ENDE_"/>
	<directive cpu="ALL" name="ENUM" title="Define _e_n_u_meration" type="BEGIN_ENUM_DEFINITION_SECTION_DIRECTIVE" proposal="ENUM _\nENDE"/>
	<directive cpu="ALL" name="EQU" title="Set _e_q_uate" type="DIRECTIVE" proposal="EQU _"/>
	<directive cpu="ALL" name="ERROR" title="End assmbly with _e_r_r_o_r" type="DIRECTIVE" proposal="ERROR _"/>
	<directive cpu="ALL" name="FILLVALUE" title="Change the default _f_i_l_l _v_a_l_u_e for PAD and ALIGN" type="DIRECTIVE" proposal="FILLVALUE _"/>
	<directive cpu="ALL" name="HEX" title="Declare raw _h_e_x data" type="DIRECTIVE" proposal="HEX _"/>
	<directive cpu="ALL" name="IF" title="_I_f" type="BEGIN_FOLDING_BLOCK_DIRECTIVE" proposal="IF _\nENDIF"/>
	<directive cpu="ALL" name="IFDEF" title="_I_f _d_e_fined" type="BEGIN_FOLDING_BLOCK_DIRECTIVE" proposal="IFDEF _\nENDIF"/>
	<directive cpu="ALL" name="IFNDEF" title="_I_f _not _d_e_fined" type="BEGIN_FOLDING_BLOCK_DIRECTIVE" proposal="IFNDEF _\nENDIF"/>
	<directive cpu="ALL" name="INCBIN" title="_I_n_clude _b_i_nary file" type="BINARY_INCLUDE_DIRECTIVE" proposal="INCBIN "_""/>
	<directive cpu="ALL" name="INCLUDE" title="_I_n_c_l_u_d_e source file" type="SOURCE_INCLUDE_DIRECTIVE" proposal="INCLUDE "_""/>
	<directive cpu="ALL" name="INCSRC" title="_I_n_clude _sou_r_ce file" type="SOURCE_INCLUDE_DIRECTIVE" proposal="INCSRC "_""/>
	<directive cpu="ALL" name="MACRO" title="Define _m_a_c_r_o" type="BEGIN_MACRO_DEFINITION_SECTION_DIRECTIVE"  proposal="MACRO _\nENDM _"/>
	<directive cpu="ALL" name="ORG" title="Set _o_ri_gin if it hasn't been assigned yet, otherwise will function like PAD" type="BEGIN_IMPLEMENTATION_SECTION_DIRECTIVE" proposal="ORG _"/>
	<directive cpu="ALL" name="PAD" title="_P_a_d memory from current address to the specified address with FILLVALUE" type="BEGIN_IMPLEMENTATION_SECTION_DIRECTIVE" proposal="PAD _"/>
	<directive cpu="ALL" name="REPT" title="Begin _r_e_pea_t block" type="BEGIN_REPEAT_SECTION_DIRECTIVE" proposal="REPT _\nENDR"/>
	<directive cpu="ALL" name="ENDR" title="_E_n_d _repeat block" type="END_SECTION_DIRECTIVE" proposal="ENDR_"/>
	<directive cpu="ALL" name="WORD" title="Declare constant as _w_o_r_d" type="DIRECTIVE" proposal="WORD _"/>

	<illegalopcode cpu="MOS6502_ILLEGAL" name="ANC" title="_A_nd byte with accumulator and set _carry" proposal="ANC _" flags="N,Z,C" addressing="Immediate" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="ANE" title="_A_nd X register with accumulator but _exact operation unknown" proposal="ANE _" addressing="Immediate" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="ARR" title="_And byte with accumulator then _rotate one bit _right in accumulator" proposal="ARR _" flags="N,V,Z,C" addressing="Immediate" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="DCP" title="_De_crement memory by one and com_pare with memory" proposal="DCP _" flags="C" addressing="Zero Page; Zero Page,X; Absolute; Absolute,X; Absolute,Y;(Indirect,X); (Indirect),Y" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="ISB" title="_Increase memory by one, then _subtract memory from accumulator (with _borrow)" proposal="ISB _" flags="N,V,Z,C" addressing="Zero Page; Zero Page,X; Absolute; Absolute,X; Absolute,Y;(Indirect,X); (Indirect),Y" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="LAS" title="_Load _accumulator, X register and _stack pointer with with memory anded stack pointer" proposal="LAS _" flags="N,Z" addressing="Absolute,Y" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="LAX" title="_Load _accumulator and _X register with memory" proposal="LAX _" flags="N,Z" addressing="Zero Page; Zero Page,Y; Absolute; Absolute,Y;(Indirect,X);(Indirect),Y" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="LXA" title="And byte with accumulator, then _load value into _X register and _accumulator" proposal="LXA _" flags="N,Z" addressing="Immediate" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="RLA" title="_Rotate one bit _left in memory, then and _accumulator with memory" proposal="RLA _" flags="N,Z,C" addressing="Zero Page; Zero Page,X; Absolute; Absolute,X; Absolute,Y;(Indirect,X); (Indirect),Y" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="RRA" title="_Rotate one bit _right in memory, then add memory to _accumulator (with carry)" proposal="RRA _" flags="N,V,Z,C" addressing="Zero Page; Zero Page,X; Absolute; Absolute,X; Absolute,Y;(Indirect,X); (Indirect),Y" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="SAX" title="_Store _accumulator anded with _X register" proposal="SAX _" flags="N,Z" addressing="Zero Page;Zero Page,Y;(Indirect,X);Absolute" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="SBX" title="_Subtract _byte from _X register (without borrow) after X register anded with the accumulator and store result in X register" proposal="SBX _" flags="N,Z,C" addressing="Immediate" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="SHA" title="_Store (don't know what _H is for) X register anded with _accumulator anded with 7" proposal="SHA _" flags="-" addressing="Absolute,Y ;(Indirect),Y" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="SHS" title="And X register with accumulator and move to stack pointer. _Store _high byte of the target address of the argument +1 anded with _stack pointer" proposal="SHS _" flags="-" addressing="Absolute,Y" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="SHX" title="_Store _high byte of the target address of the argument +1 anded with _X register" proposal="SHX _" flags="-" addressing="Absolute,Y" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="SHY" title="_Store _high byte of the target address of the argument +1 anded with _Y register" proposal="SHY _" flags="-" addressing="Absolute,x" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="SLO" title="_Shift _left one bit in memory, then _or accumulator with memory" proposal="SLO _" flags="N,Z,C" addressing="Zero Page; Zero Page,X; Absolute; Absolute,X; Absolute,Y; (Indirect,X); (Indirect),Y" />
	<illegalopcode cpu="MOS6502_ILLEGAL" name="SRE" title="_Shift _right one bit in memory, then _eor accumulator with memory" proposal="SRE _" flags="N,Z,C" addressing="Zero Page; Zero Page,X; Absolute; Absolute,X; Absolute,Y;(Indirect,X);(Indirect),Y" />

</instructionset>
P.S. If you haven't yet tried out WUDSN, do it! It rocks! Just follow along with the installation instructions on the website and you'll be up and running in no time!

Posted: Mon May 14, 2012 1:07 pm
by JAC!
I see you really like it James :-). And before everybody is going to modify and compiler themselves, I'll provide a small 1.6.2 with ASM6 and the related EMUs soon. If you have good sample source, please send them via PM.

Posted: Mon May 14, 2012 4:01 pm
by tepples
There's plenty of sample ca65 source on my NES page.

Posted: Mon May 14, 2012 7:06 pm
by cpow
tepples wrote:There's plenty of sample ca65 source on my NES page.
Oh that reminds me...I should try Thwaite in NESICIDE. :D

Posted: Mon May 14, 2012 10:33 pm
by thefox
It's a good idea to build the IDE on top of Eclipse, the project looks promising. Maybe some day we'll see debugging support through sockets? (At the moment there are no emulators that expose debugging through sockets, but that could change.)

As far as assemblers go, I prefer CA65.

Posted: Mon May 14, 2012 11:15 pm
by JAC!
thefox wrote:Maybe some day we'll see debugging support through sockets? (At the moment there are no emulators that expose debugging through sockets, but that could change.)
Actually there are some (e.g. VICE) but the approach behind WUDSN IDE is the focus in the "I" (Integrated) of multiple platforms & compilers. With a total of 6 platforms with 2-5 emulators each and 7 compilers, all developed by different people (languages, OS...) I found it an impossible job to align with all of them on this level (wire protocol & features like in Java). Instead I try to align on loose Interfaces like for MADS & Altirria and put the IDE in between.

This screen below show what tebe and phaeron and I achieved in terms of source level debugging where the IDE is the editor (also for the breakpoints) and the emulator is the debugger. In this sense the emulator is nothing but the "Debug perspective" modern IDEs offer. An because I also use the IDE for real coding I can say that with compile & startup times of about 1s, you don't really miss remote debugging (as opposed in J2EE for example).

Image
Image