Daedalus-Lkb Project Web Site hosted by SourceForge Logo

Daedalus-Lkb is a modified version written by me, Lkb, of the Daedalus, an emulator of the Nintendo64 console written by StrmnNrmn with help from other people (see credits.txt).
Modifications introduced in Daedalus-Lkb, if accepted, are included in the original Daedalus.
Like the original Daedalus, Daedalus-Lkb is covered by the GNU General Public License (GPL)
All binary releases are compiled for x86-based Win32 platforms and are built with Microsoft Visual C++ 6.0 SP5 with Processor Pack with Zlib and Libpng disabled.

Project summary page

Daedalus-Lkb v0.07b-Lkb4.2 (26/aug/2001)

Downloads

Source diff based on Daedalus-Lkb 0.07b-lkb3

Changes

- New memory address resolution system, using a pointer table, inspired by gnuboy

Message board announcement

In practice:
- Speed is improved, noticeably
- GoldenEye tested and still works

Minor changes:
- Memory regions allocated with VirtualAlloc instead of new (ensures page alignment, automatically zeroes memory and is more efficient for large memory areas)
- Bounds checking in memory routines now only done if !DAEDALUS_RELEASE_BUILD
- Memory tables and registers declared in a different way to align them on 4096-byte boundaries

Major changes:
- "New" memory address resolution system: instead of indirectly calling functions, it reads a pointer from an additional table and adds the MIPS address. If the result is signed (above 0x80000000, in kernel space) it falls back to the old system, otherwise the address is already computed without any function call and with only 4 instructions except register loading (MOV, SHR, ADD mem, JS)
- Added another dynarec buffer in the last virtual 64 MBs of the main one - it is used to store code reached by conditional branches that must be predicted as not taken
- Modified SR_Emit_L?, SR_Emit_S?, ReadAddress, WriteAddress, WriteValue, EPILOGUE and the ESI/ESP caching code to use/generate code for the new memory system

Note:
I realized that it hasn't been a very smart idea to add "ADDED/MODIFIED by Lkb - GCC support" notices everywhere, so I removed them and this patch assumes they are removed (for i in *.c *.cpp *.h *.inl; do sed -e '/BY Lkb.*GCC support$/d' $i>temp-sed; mv -f temp-sed $i; done) - backup first.

Problems/Bugs:
- The SR_Emit_ReadWriteAddress function, that implements dynarec for the new memory system, is really ugly beacuse it outputs directly x86 opcode numbers and takes 10 parameters

Possible improvements:
- Currently, TLB address resolution still goes thru a function call; it would be better to alter the pointer table every time the TLB is changed, so that TLB accesses would have the same performance of ordinary RAM/ROM accesses
- It might be possible to slightly rearrange instructions in SR_Emit_ReadWriteAddress to improve parallelism
- Currently a 32-bit displacement is used to jump to infrequently used code: a 8-bit or 16-bit one could be faster but would introduce a lot of design problems

Other thoughts:
- GCC: I have written some code to use GCC to compile dynamically generated C code. However, while it works, it has a lot of compile-time overhead and the speed is similar to the already existing dynarec so I've decided to drop the idea.

Daedalus-Lkb v0.07b-Lkb3 (26/jul/2001)

Downloads

Source
Source diff based on Daedalus-Lkb 0.07b-lkb2 (also contains files not present in 0.07b-lkb2)
Binary

Changes

- Support for savestates in Project64 format

Message board announcement

Daedalus-Lkb 0.07b-lkb3 adds support for savestates in Project64 format. I tested Super Mario 64, Zelda Majora's Mask and Mario Kart 64 and for each game I was able to load Project64 savestates in Daedalus and Daedalus savestates in Project64

A nice side effect of this is that Zelda Majora's Mask is now fully playable by starting from a Project64 savestate and using savestates to save your progress.

Known issues:
- Breakpoints must not be used if you want to use savestates
- The only user interface to savestate functionality are two menu items
- Localization DLLs must not be used, otherwise you will not see the Load and Save menu items

User interface ideas:
First, the Project64/Snes9X/etc. savestate UI is not very good. The reason is that typically savestates are used to save your progress as you play the game. Obviously it's wise to use more than one slot, in case you discover that there's no way to proceed in the game with your latest savestate. However to do this you have to remember the last slot you used and it's very easy to forget it. Instead, it would be better to implement both a Project64-like set of fixed slots and a savestate stack. The stack would controlled by a save button that removes the oldest savestate and pushes the current state on the stack, a load button that loads the savestate on top without removing it and a way to access the stack like the fixed slots set.

Finally, thanks to Zilmar for kindly providing information about his savestate format

Daedalus-Lkb v0.07b-Lkb2 (13/jul/2001)

Downloads

Source
Source diff based on Daedalus 0.07b (also contains files not present in 0.07b)
Binary

Changes

- GCC support. It's now possible to compile Daedalus with GCC with only a few warnings, however linking doesn't work yet.
- Fixed an horrible bug in the SRInliner decoding of opcodes 0x[0123][cd]

Message board announcement

Two improvements to Daedalus:
- GCC support. It's now possible to compile Daedalus with GCC with only a few warnings, however linking doesn't work yet.
- Fixed an horrible bug in the SRInliner decoding of opcodes 0x[0123][cd]

Daedalus-Lkb v0.07b-Lkb1 (8/jun/2001)

Downloads

Source
Binary

Changes

- New gfx combiner
- Fixed DSRxV (value must be ANDed with 0x3f since the value is 64-bit)

Message board announcement

Daedalus-Lkb v0.07b-Lkb1 includes a completely new combine mode translator.
Currently combine modes are translated using a table and when an entry is not found, an "Unknown mux" message is output to the debug console.
Instead, the new combiner creates an expression tree based on the mux value, optimizes it, tries all possible combinations of Direct3D blending stages and passes and based on the complexity and on the return value from ValidateDevice (used to ask the driver if the video card supports a combination) a score is assigned to the combination. The combination with the lowest score wins, the generated Direct3D instructions are persisted in a map, and every time the game uses that mux they are applied.
It is possible to switch on/off the new combiner using "Config\Display\Use new combiner" (can be done even without stopping emulation).
Also, 3 new debug console commands are available and, if dump is enabled (use "muxdump 1" ) , mux values and generated Direct3D combinations are output to "daedalus_combiner.txt".

Differences from Daedalus v0.07b-Lkb1 (on a G400 card)
Mario: big head now visible
Zelda Oot: intro messed up, but in-game it's better (especially Link) although some problems are introduced
Mario Kart: intro flag correctly drawn - balloons colored

Note that multitexturing is currently not supported.

Daedalus v0.07b Italian Localization DLL (4/jun/2001)

Source
Binary

Daedalus-Lkb v0.06b-Lkb1 (16/may/2001)

Downloads

Source
Binary

Changes

- Zelda textures are correctly interpolated
- Fixed Jun Su patches, now Zelda Majora's Mask works with OS HLE enabled
- Fixed minor bug that caused GFX exception in the beginning
- Added Expansion Pak setting for Majora's Mask in the ini
- Fixed DSRxV (value must be ANDed with 0x3f since the value is 64-bit)