This page is a mirror of Tepples' nesdev forum mirror (URL TBD).
Last updated on Oct-18-2019 Download

WUDSN IDE: Free integrated 6502 IDE - Request for interest

WUDSN IDE: Free integrated 6502 IDE - Request for interest
by on (#93761)
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
by on (#93765)
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...

by on (#93766)
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.

by on (#93767)
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".

by on (#93768)
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.

by on (#93770)
>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

by on (#93781)
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.

by on (#93792)
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.

by on (#93793)
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.

by on (#93795)
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:
<?xml version="1.0" encoding="iso-8859-1"?>   
<instructionset
   completionProposalAutoActivationCharacters="."
   singleLineCommentDelimiters=";"
   multipleLinesCommentDelimiters=""
   stringDelimiterCharacters="'&quot;"
   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 &quot;_&quot;"/>
   <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 &quot;_&quot;"/>
   <directive cpu="ALL" name="INCLUDE" title="_I_n_c_l_u_d_e source file" type="SOURCE_INCLUDE_DIRECTIVE" proposal="INCLUDE &quot;_&quot;"/>
   <directive cpu="ALL" name="INCSRC" title="_I_n_clude _sou_r_ce file" type="SOURCE_INCLUDE_DIRECTIVE" proposal="INCSRC &quot;_&quot;"/>
   <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!

by on (#93797)
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.

by on (#93804)
There's plenty of sample ca65 source on my NES page.

by on (#93816)
tepples wrote:
There's plenty of sample ca65 source on my NES page.

Oh that reminds me...I should try Thwaite in NESICIDE. :D

by on (#93827)
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.

by on (#93832)
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

by on (#93839)
thefox wrote:
It's a good idea to build the IDE on top of Eclipse

Why? I'm not being flippant...I really would like to know the reason why.

by on (#93841)
I think any other platform would have been equally good, provided it's portable enough for the intended consumers and gives the creator the best productivity. And Qt is also an excellent choice. WUDSN IDE is in Eclipse simply because I spent 7 years Java development as my profession before I started.

by on (#93846)
JAC! wrote:
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)

Yeah I meant NES emulators. :)

cpow wrote:
thefox wrote:
It's a good idea to build the IDE on top of Eclipse

Why? I'm not being flippant...I really would like to know the reason why.

I didn't mean to single out Eclipse, I'm sure there are other mature IDEs out there that could've been used as well (Visual Studio comes to mind...). All I'm saying is doing it like this is good because there's a stable platform to build on, and every wheel doesn't have to be reinvented.

Not that there's anything wrong with building from ground up, like you're doing. :)