Todo
Todo
18:41 2003-12-06
EXI 0:1 devices (Mask ROM, Real-Time Clock (RTC), SRAM, UART and GPIO).
11:55 2004-06-27
RTC and SRAM implemented.
20:20 2004-01-20
Add screenshot directory option, filename beginning and number settings.
----------------------------------------------
BBA-----------------------------------------
20:23 2004-01-20
Create BBA driver, so it'll act like an independent NIC. (?)
20:17 2004-05-02
Nope. Use SOCK_RAW instead? I think it can be done.
18:04 2004-05-15
It can't. BBA emulation should be /dev/null-ed until I have a good idea of how to
do it.
01:27 2004-05-25
BBA nerfed.
13:58 2004-10-31
The driver idea has been resurrected, though in a different form. The driver will
be a virtual NIC that is connected to the virtual Cube run by WhineCube via a
virtual cross-over cable. :) This would probably work great for me, as I expect
relatively few of the high-frequency packets of my broadband connection to be sent
to the virtual NIC, making the noise managable for the emulated program. There
could be a problem for people who already sit on the same subnet that the Cube
wants to use, but that's of secondary concern to me.
00:49 2004-05-05
Add INI file setting mac_address and enable the setting in Advanced Options.
Default MAC address: 0:0:0:0:0:0.
14:02 2004-10-31
New default MAC address: 1:2:3:4:5:6.
19:27 2004-05-04
Emulate BBA interrupts.
-----------------------------------------------------------------------------------
-------
20:49 2004-04-22
Implement DMA audio position notification interrupts completely.
21:33 2004-06-19
No need yet. They are only used with DVD streaming.
16:18 2004-01-29
Write a TB/DEC viewer demo.
04:15 2004-03-03
Upgrade all file handling to cope with filenames.length() > MAX_PATH. *Very*
optional. ;)
14:11 2005-02-28
My workings with char buffers, especially filenames, are unsafe. Change everything
possible to some variable-length string type.
17:50 2004-05-02
Add C-stick and Analog L/R, make gamepad mappings configurable, activate all four,
create a dialog box for them.
Analog L/R will be tied in with the digital keys and analog mods.
The analog mod will be global for all analog inputs. For now. We may add an option
to change it; to add new analog mod keys.
23:49 2004-05-26
C-stick and analog L/R done.
11:56 2004-06-27
Four configurable pads done.
----------------------------------------------
RECOMPILER----------------------------------
22:50 2004-03-28
Clean up that whole mess with last_instruction_* in the recompiler.
17:03 2004-11-02
Being done as a part of the rewriting.
18:06 2004-05-28
There may be room for optimization in findJDRBIndexBy*() if JDRBs are sorted by
start address. Chexx it out.
13:45 2004-04-03
Take the unchanging bulk of add_mem1_*() and put it in a Recompiler-global buffer.
I estimate it can save up to 20 MB of recbuf space (in gc-linux), not to mention
the instruction cache performance benefits.
12:32 2004-04-28
Add request_global_max_pia() (physical instruction address) to the big icbi check
in add_mem1...() when add_mem1...() has been made into a function.
02:12 2004-05-02
This won't provide any performance improvement until the recompiler uses physical
addresses instead of effective ones.
19:34 2004-05-29
running_icbi already uses physical addresses. request_global_max_pia() will just
have to be written a little differently.
19:12 2004-05-31
Bug in gc-linux.
22:32 2004-11-01
Gc-linux runs fine, I think.
20:46 2004-07-22
Especially big and common instructions could be optimized by creating functions for
them, which recompiled code would call, making it smaller, thus increasing
instruction cache efficiency. This is unfortunately somewhat inefficient in many
cases because of the lack of a MOV r32, imm8 z/s-ext instruction. stw and lwz are
example candidates.
18:22 2004-05-28
Maybe the instruction counter could be moved from edi to a lesser-used register,
ebx for example. Chexx it out.
12:11 2004-06-11
Doable, but it would requre a whole bunch of rewriting. Low priority for now.
02:16 2004-05-27
Recompiler: opcodes that refer to multiple registers could probably benefit from
loading a base address into a IA32 register (ecx for example) and using disp8
addressing. ps_merge10 is the first to use this scheme (albeit only in a rare
instance).
00:29 2004-07-07
Lots more use of disp8 now. Where it's used, disp16 addressing for the rest of the
registers become possible. fpr_ps could be the biggest beneficiary of this.
22:36 2004-11-01
disp16 is useless because of architectural limitations. It's either disp8 or 32 for
us.
21:28 2004-05-31
Both of these require checking out of register usage. ebx seems good for one
permanent, like the counter. Disp8 addressing would be much more efficient with
another permanent... edx is only used in div and mul instructions... but with the
ebx move, it would be used a lot more... how about using esi or edi for some of
this stuff? ... It's all tricky business.
12:10 2004-06-11
32*8 = 256, so we'd need two different permanents for GPRs and FPRs. Way too much.
17:30 2004-10-12
Perhaps some sort of checking system... no, the indirect branch instructions
prevent all multi-instruction optimizations.
18:48 2004-06-30
Remake into a classic recompiler with illegal opcodes (primary 2, I think) written
over the recompiled instructions. Make sure to implement an error-check routine so
actual illegal opcodes aren't confused with ours.
15:58 2004-07-01
Lots of big freakin' unnecessary recompilations noted. :}
17:26 2004-10-12
Especially in gc-linux, but also during some advanced devkit/sdk init sequences.
20:09 2004-07-13
Primary 2 is used for EmuDebug. Use Primary 1.
22:38 2004-11-01
Format for the recompiled overwrites, 32 bits:
000001XXXXXXXXXXXXXXXXXXXXXXXXXX
where X is an index into the main DynaRec Block Vector.
22:48 2004-11-01
When an instruction in a DRB has been targeted for recompilation, less than all of
the instructions in that block may have been overwritten. Therefore, reusal of
recompiled instructions must be implemented. Or we could save all the old
instructions, allowing recompilation of any block anywhere... I think that's what
must be done, since static branches, end-of-block references and such render
previously recompiled instructions erroneus when placed in a new block or in new
places within the old block.
17:11 2004-11-02
Static branches (b, bc) presents a new problem when removing the old recursive
recompilation system. They may now be recompiled to one of two states: Known
address, like before, or unknown, in which case it will return with an error code.
This error code will be handled with more recompilation, and the branch instruction
will be rewritten with a known address. This scheme may require that the
instructions be filled with NOPs to make sure there's enough space for both states.
New idea: since the known-address state can be assumed to be larger (there should
be an ASSERTion, I think) we can recompile all branches to known-address state
initially, then at the end of the block, when we have known addresses for the
current block as well as the previous blocks, we can fill in the ones we can, and
overwrite the ones we can't with the Unknown-address state thingy.
This would also require storing of all out-of-block references, so they can be
updated if a referenced block is erased and/or recompiled. Storing them in the
referenced block would allow quick rewriting when that block is changed. However,
if the referencing block is changed, all its previous references would need to be
updated/deleted. That would require a list of referenced blocks to be stored in the
referencing block. The referenced block should be able to go through its list of
references and remove the ones in question.
*Or possibly have separate lists for every referencing block, speeding up the
removal process considerably.
*Nah... how would such a list of lists be indexed? It could be a list of vectors...
or a list of pointer+size structs?
*The struct has been coded.
The other variant is making static branch instructions dynamic. This would remove
the need for references, but would impact runtime performance, as most of the
branching code would have to be written in C++. I'm thinking at least 6 DWORD
reads, as well as overhead and processing.
Referencing takes more memory and recompilation effort. I'm thinking 4 bytes per
block-external static branch plus 16 bytes per block plus up to (nblocks^2) * 4
bytes. I remember seeing some 160 blocks, but let's say 200 for evil's sake. Also 4
MB of code, and 1/5 of that be static branches (200000). ((200^2)*4) + (200*16) +
(200000*4) = 963200 bytes < 1MB. Relatively little, considering the backup of the
4MB of code, plus at least 20MB of recompiled code.
00:52 2004-11-03
What will happen when an Unknown-state branch is hit? Well, first we should check
if its target is already recompiled; another branch may have triggered it.
If it isn't, {
it will be recompiled.
}
If the recompilation occurred now, or if the branch block doesn't already refer to
the target block, {
it will be added to the vector, and a ReferenceBlock will be added to the target
block's list.
}
Then the reference will be added to the target block. The branch itself will be
overwritten with the known state.
05:18 2004-11-03
What'll happen when a block that's being referenced is removed/remade? All the
references which can be fixed are, of course, but the new block may be smaller than
the old. Thus we would need to recompile more... and wind up in the recursive
system again. The branches could theoretically be reverted to Unknown status, but
that would require a large amount of work. I'm thinking of having the Unknown
status be not different in code, only different in target jump address; it would
jump to a sort of handler function, written in assembly, which would return with
the error. ... This is probably more optimized, since the targets of conditional
branches which are never taken don't require recompilation. It would also be better
in the Unknown->Known process, which would be reduced to a single DWORD write. :)
05:26 2004-11-03
It seems that there are good solutions to most things, and that I can eventually
come up with them. :) My mother knew this a long time ago. :D
17:59 2004-11-03
It wasn't so easy after all... see, we need to know where we came from.
16:09 2004-11-04
This can be accomplished in !onestep mode by changing the JMP instruction to a
CALL, and changing the target pos to point to an assembly function that would hack
the stack, set the error code, and return with... the pos of the instruction after
the branch. (Preassembled or created at runtime like the store/load helpers, I
don't know.)
19:05 2004-11-05
The onestep mode needs to be fixed too, but that's of secondary consideration at
the moment.
00:04 2004-11-11
The new recompiler is up and running, but fireee's title screen is strange. It'll
have to be fixed.
00:18 2004-11-11
The same error exists in other demos as well, most notably my own bordertest. It
may be because of the opcode overwriting, which could be "stowed away" in its own
memory space. This would cost us 24 MB of RAM and would require additions to
RecMem.
02:24 2004-11-11
A dual run and interp degub log confirms it. Note: we can remove ppc_code() from
DRB now. I fact, I'ma do that right now.
17:11 2004-11-11
Ehm, no. The whole idea with overwriting is to be able to detect code updates. This
is getting to be very annoying. OK, new idea:
*No overwrites when recompiling. On unknown static or dynamic branch, check first
for dynarec's overwrite. If overwritten, check for validity and do the branch. If
not overwritten, find the DRB, compare the target opcode with the stored one. If
equal, overwrite it. Else, recompile.
*This method could be a tad slower the first time code is executed, but it should
leave a much smaller print on the emulated memory. I have some concerns about
leftover overwrites and dynarecopcode validity checking, but I can't think properly
right now. I'm just gonna implement this, see what it does.
18:19 2004-11-11
It works? I thought it wasn't supposed to work quite yet. :}
02:05 2004-11-13
When all's done, make sure to clear away any old/unused code from the recompiler
files.
20:49 2004-11-19
Code overwrites conflicts with logical addresses instead of physical when blocks
overlap, resulting in illegal opcode encounters. Fix this by making sure DRBs only
use physical addresses. I remember that this has been done before, with problematic
results... investigate.
01:22 2004-11-22
Added PIAs to the DRBs. It should make everything work, but there is now an
assertion that DRBs does not cross memory translation borders. If they do, the
results are undefined (read "crash").
01:06 2004-11-23
Prevented (PIA but not EIA) overlapping DRBs, which resulted in way too many
recompilations in gc-linux, since two addressing modes are used in conjunction. We
obviously need to allow PIA overlaps, but how to handle our overwrites? Well, we
could make a new vector of vectors of indices, where each vector of indices would
contain indices to all the overlapping DRB for one physical block... which wouldn't
work very well since overlapping blocks don't necessarily have the same start_pia
and size. Wait, it could... but only if you had a vector for every overwrite...
20:21 2004-11-26
It works, yay. gc-linux is very fast. However, fireee encounters the cache bug, as
predicted. It will have to be fixed.
04:41 2005-03-09
Pong! also works only with the cache/interpreter combo now.
19:38 2005-03-11
Done.
15:15 2004-07-22
Use the stack (ESP - size) instead of rec_temp where possible.
22:42 2004-07-22
Make macros for PS instructions, so they won't be so error-prone.
16:51 2004-08-31
Minimize the recompiler by giving each opcode a list of standardized attributes and
optionally one (or more?) custom attribute. There would then be a function that
defines all the standard attributes... problem: the custom attribute would probably
need to be able to be placed in varying positions... It's worth some thought.
17:23 2004-10-12
I imagine an attribute as a specially declared function. Example:
#define BASE_ATTRIB(name) void name(DWORD opcode) {
#define ATTRIB_RA_D16(name) BASE_ATTRIB(name) D_rA; D_d16;
ATTRIB_RA_D16(load_ad16) {
...
}}
16:36 2004-10-13
Why not just keep the current system and make more helper functions? Would be
simpler, I think.
02:20 2004-11-03
if(!g::rec_onestep), the counter should only be checked after(before?) branch (both
static and dynamic) instructions. This optimization can be made since some sort of
branch must be taken often to keep the code from going out into invalid address
space. Do this as part of the rewrite. (before?) Oh yeah, static branches are the
ones that *don't* check the counter at teh moment.
16:53 2004-11-07
The bc_ctr_cond system can be optimized more. Do it.
00:26 2004-11-10
Check the main run loop for optimizations. I think it's become kinda bloated.
22:04 2005-03-03
Fix unemulated opcode handling in the recompiler.
10:57 2005-03-29
Make the label system better by putting label creation in functions of their own.
Automatic selection of long/short labels is one of the more useful parts.
18:21 2006-07-22
GekkoTest doesn't work in the recompiler, since it overwrites its test code (with a
first word that is identical). A CRC of the original PPC code would be useful for
recompiled blocks, to be compared when jumping to a block that is marked
invalidated. A block is marked as invalidated by ICInvalidateRange()[LOOK UP ACTUAL
OPCODE!].
-----------------------------------------------------------------------------------
-------
------------------------------------------NEW
RECOMPILER----------------------------------
18:10 2006-07-22
There is an idea to use gcc (or another properly optimizing C compiler) for all our
recompilation needs. Due to its slowness, caching on disk would be useful.
-----------------------------------------------------------------------------------
-------
19:17 2004-04-05
Change the memory translation so that we start with some standard BATs and no
paging(possible?) when /trans is on. This'll remove the need for physicalization
then.
17:27 2004-04-21
Done, but we still need the actual BATs set by PSO.
...
or9, and quite possibly a couple of others, has a decrypted IPL dump. Maybe *it*
sets the BATs. I won't be in a position to request a copy until WhineCube is
publicly released, though...
12:29 2004-04-28
Make sure to get an encrypted copy of teh IPL, too.
11:57 2004-06-27
I now have the decrypted IPL and a partial encrypted(?) dump. Rewrite my dumper
program to get the Mask ROM, get Snike to run it.
09:45 2004-07-20
Gcube has the fonts. wee.
21:39 2004-11-19
No go. gc-linux uses 0XCC* addresses with translation disabled.
19:59 2004-04-06
Make disasm(analyze) reachable without a CoreBase.
18:54 2004-04-24
Screen update seems to slow things down a lot. Investigate/fix.
18:47 2004-05-20
The memcpy takes about 16 ms. I think that's a tad slower than it has to be.
12:31 2004-04-28
Only add cycle count check in the recompiler if(next_instruction_is_branch())
//Includes rfi, but not sc.
16:15 2004-04-30
Proper video mode emulation, with different halfline counts and changing the 50FPS
menu item to 60 in PAL60 mode.
11:58 2004-06-27
Kinda done.
17:51 2005-05-08
Uncertain. 30 FPS in BAM3K intro seems a tad slow to me. Without sound there's no
reference sync.
18:43 2004-05-04
Pause recompiler run timing during recompilation, so we get appropriate MIPS
counts. Also keep track of the amount of time spent in recompilation.
16:23 2004-05-08
Try disabling D3DCREATE_FPU_PRESERVE to increase performance.
18:50 2004-05-20
With the help of gcube, get Freeloader and Action Replay working.
19:08 2004-05-23
Compare a standard run with a sc-nerfed one.
10:42 2004-05-24
The changed sc seems to take Freeloader down a whole different codepath into a
complex infinite loop. Decide wether to include /nerf_sc in the readme.
15:14 2004-05-22
The hardware hook system used in gcube is probably more efficient than my if/switch
system. Implement it. Use standard "unemulated" functions.
18:36 2004-07-18
Done. Do the same for the GP.
02:46 2004-08-19
Done for BP. Not needed for CP. Would be complicated for XF.
17:43 2005-05-13
For XF, we'd need to retain the if-type statements, at least for multi-word writes,
but it can be divided, and it should be, for it has reached confusing
proportions. :)
23:54 2004-05-26
GP: Consolidate the repetitive stuff in gp_draw_quad().
18:37 2004-07-18
Mostly done.
12:26 2004-06-15
GP: Remove CP and BP arrays. Load own variables with the values of interest.
17:52 2005-05-08
Alternatively, create macros for all values.
15:38 2004-07-10
GP: Optimize texture creation for DirectX texture creation instead of dumping.
12:26 2004-08-27
Fix the indexed formats. Consolidate, too. It's a friggin' mess. :}
00:12 2004-08-31
Done, but there are bugs:
*tex-fmt-tpl seems to have its textures mirrored relative to the dumps.
*tex-tlut works in strange ways. Probably cache-related.
*Unhandled texture cache causes problems. Different textures are somethetimes
loaded from the same mainmem address.
11:57 2005-05-10
It would probably be a good idea to check that the format and dimensions match with
our cached texture on load.
13:18 2004-07-13
Then, change read_instruction() into a fetch system, with fetch() and
set_fetch(DWORD address).
15:54 2004-07-14
It is teh slow. Profile.
18:57 2004-08-31
To fully utilize the power of the PNG format, the texture dump routines need to be
rewritten.
21:46 2004-09-03
Fix TEV texture modulation. Currently the texture is ignored and the vertex color
is used.
16:59 2004-09-06
Split the timing system into video and processor parts.
* The video part would have a configurable frame limiter (x FPS, on/off) and would
affect display interrupts, halfline registers and GP Copy to EFB operations.
* The processor part would be able to switch between realtime and exact (possibly
not during execution), where the exact mode would attempt to emulate a real Cube
more accurately than now. It would affect the DEC/TB system and also the RTC on EXI
01.
17:15 2004-09-07
Rehash:
* Frame limiter. The only part that uses Sleep. Does so only in the emu thread, and
only when the next frame is about to be displayed and there's exxess time before it
is due.
* Video and processor are now controlled as one. Three modes: Realtime, Exact
Realistic, and Exact Fast.
* * Realistic means that everything is emulated as closely as possible to a real
cube. Things taken into consideration will include the current video mode, the
BogoMIPS count (which happens to be almost equal to the MHz count, 485 MIPS, 486
MHz), and the TB speed (40.5 Mhz). All four display interrupts will be properly
emulated.
* * Fast means that things are emulated as fast as stably possible. TB/DEC is
in/de-creased by one per instruction. The halfline count is increased by one per
read. The display interrupts are triggered as one, every (1<<X) instructions, where
X is a positive integer < 30.
19:03 2004-09-07
Random thought: This scheme should allow frame limiting and exact timing to
coexist.
19:37 2004-09-15
Timing todo:
*exact/realtime VI interrupts, with simple SI.
**11:32 2004-09-22 DONE, except SIPOLL.
*exact SIPOLL.
*frame limiter. DONE!
**11:36 2004-09-22 DONE, but untested.
**17:00 2004-09-30 Tested, looks like it's working.
*exact/realtime HCT.
*test with gc-linux. DONE, looks pretty good.
*Exact DMA Audio timing.
**03:20 2004-10-11 DONE, but possibly buggy.
*Exact Fast mode seems to do something strange to EXIProbe(), making it return 0
even though there's a device present. Investigate/fix.
17:04 2004-09-21
To ensure optimum synchronization in realtime mode, all timings shall compare the
current time only to a precalculated value and use the HRPC value zero(0) as their
base.
11:32 2004-09-22
Unsure about this. HRPC values are LARGE_INTEGERs, and can thus wrap to -2^63. Some
safety checks are in place.
13:36 2004-09-22
A BOGOMIPS value of 485000000 yielded a result of 968.70. Linear interpolation,
242805409, resulted in 132.60. A second interpolation is required. We want 484.96
BogoMIPS.
23:24 2004-09-22
Done. x ~= 345M.
03:25 2004-09-28
Result: 188.41 BogoMIPS. Bugger. New x, calculated with second-grade stats:
416633555. Result: 227.84.
13:13 2004-09-28
Third-grade: 451923835 Result: 246,78. 486M->265,21!
14:37 2004-09-28
Linear with the new one: 890181858. Result: 486.40 BogoMIPS in gc-linux. Good
enough.
03:23 2004-10-11
In realtime mode, frame limiting causes a VI assertion error in SDK debug demos.
Turning frame limiting off results in 120 FPS. Investigate.
14:44 2004-10-13
The getVDelay function and the FRAMES_PER_SECOND definition should be cleared up. I
may have fixed it now.
20:48 2004-09-12
GX Subtract blend mode.
03:14 2004-10-11
Implemented. May be buggy.
04:27 2004-10-13
The DSP seems pretty unimplementable right now. Assuming the AX is the only library
which uses DSP, it could be HLE'd with the method described in the CXBX Progress
report. It's not a completely failsafe method, and care needs to be taken to handle
as many of its potential problems as possible.
12:56 2004-10-14
Ector told me that most games use AX, but some of Nintendo's own use a different
version. They will be most trublomatic.
07:58 2004-12-07
After reviewing Dolphin's AX code, it seems that there's only one actual feedback
thingy in the emulation. It won't be completely trivial to implement, but it should
be simple enough.
00:19 2005-05-16
Use duddie's work to implement proper DSP emulation. A rom dump will be needed.
04:31 2004-10-13
However, the CARD library also uses DSP. I suppose it could be HLE'd, too, but at
which level? CARD_Unlock, probably. But that function isn't exported... this could
get messy. :/
14:31 2004-10-13
int __CARDUnlock(int, int);
That's as far as I can figure it. Guessing from the caller code, the HLE function
should probably just return 0. Or possibly 1.
12:56 2004-10-14
It doesn't seem to work.
19:08 2004-10-13
To make the OOVPA system work with GCMs, default.dol needs to be parsed... and
loaded... and patched... in that order. How problematic, then, that we have a
precompiled bootstrap that does all that...
19:14 2004-10-13
We could change the bootstrap to call us back when the DOL has been loaded. We can
then parse it on our own and patch it before it is executed. Nice. :)
21:42 2004-10-13
We can't be sure that the apploader will load the DOL according to the DOL header,
but we'll have to assume it does. The alternative is further modding of the BS2,
and even that isn't perfectly safe, since the apploader may contain its own disc-
reading functions.
15:31 2004-10-26
Check performance diff in halfline-vsyncing demos between vinterrupts on and off.
If it's low, turn them on in 2d mode too.
Otherwise, use some sort of algrithm to guess if the interrupts are required.
16:01 2004-10-26
Change the BS2 to have a special instruction at the end instead of an infinite
loop; people may not see the error message...
16:16 2004-10-26
Find out how long an Erase Sector and a Write command takes (in TB units), and
change the EXIINTHACK system to match.
14:33 2004-10-31
Make the interpreter do_interrupts less often... once every 16K(perhaps)
instructions should work nicely.
17:13 2004-11-02
This may cause problems with the sc instruction. Keep it in mind when working on
this.
03:08 2004-11-24
Replace all simple g::verbose checks with VDEGUB.
10:43 2004-12-14
or9 about gc-linux. Investigate/implement.
[10:07:26] <or9> btw I found some bug in decrementer in emu :
[10:07:49] <or9> lwz r0, 12 (sp)
[10:07:53] <or9> addi sp, sp, 8 <- when DECREMENTER_EXCEPTION is
here,
[10:07:53] <or9> mtlr r0 <- r0 fucked
[10:07:53] <or9> blr
[10:08:16] <or9> Decrementer exception check now only after branch instructions in
dolwin
[10:10:54] <or9> because R0 is used as temporary register in kernel
13:49 2005-04-18
I've investigated the linux exception code, and r0 is saved at the start of every
exception. The return code is too split up to verify completely, but r0 seems to be
restored as well. It wouldn't make any sense to save it for nothing. Tell or9 of
this.
14:42 2005-04-18
[14:38:58] <or9> gpr0 is reserved by kernel
[14:39:08] <or9> in exception handler
[14:39:21] <or9> so if gpr0 holds LR value
[14:39:34] <or9> and decrementer raised before "mtlr r0"
[14:39:46] <or9> emu will fuck up, by returning at 0x00000000 usually
[14:40:37] <or9> i fighting with it by asserting decrementer only after branch
opcodes, since its asyncronous exception
[14:40:57] <or9> (and not precede also)
[14:41:08] <Masken> strange that, 'cause I checked out the exception handler source
code and found that it saves r0 to memory
[14:41:41] <or9> well, im pretty sure that it will fucked on decrementer exception
[14:41:49] <or9> i used my debuggy
19:06 2005-01-25
Fix the flickering in the LICENCED BY NINTENDO screen in BAM3K.
01:27 2005-04-13
Done, although there's more flickering in some timing modes after the timing
overhaul.
20:00 2005-02-03
Inno Setup says "Properly designed GUI applications should not expect to be started
from a particular directory; they should always specify full pathnames on files
they open." I agree. Fix it.
01:40 2005-02-04
This'll require some thought.
*If we are to continue on our current path of creating all files in the current
directory... we won't have to do anything.
*If we want to save all or some files in the .exe's directory, we'll need to modify
some code... we can't do this; it'd screw up my development environment.
*The third option is using the registry to save the installation directory. Other
directories would be saved in the ini file located in that installation directory.
This option needs to handle the case of the executable being started from a
location that is not the installation directory. I think the best way would be to
present the user with a dialog box if the registry's value doesn't match the
directory where the exe file is being executed. The dialog would give the user the
option to read/use or overwrite the registry value, and also the option to prevent
the dialog box from being shown again. The preventation may be selected only when
choosing read.
23:13 2005-03-02
Investigate the possibility of creating dialog boxes programatically instead of
using a dialog editor. If implemented successfully, it should greatly simplify
adding new data items and new dialog boxes.
15:20 2005-03-03
Add a CRC to the OOVPA system. The OOVPA will be used to find the function, then
the entire function will be read and crc-checked to make sure we got a hit. A miss
will be considered a fatal error.
15:58 2005-03-10
Change DirectInput to foreground access only. Test all situations you can think of,
then call on the beta testers to think of some more. :)
16:35 2005-03-13
Get nForces mp3 implementation to work without sacking DesktopMan's Tetris.
Removing the on-dma-start interrupt makes it play, but slowly, and the dump is
broken, and it breaks Tetris. Come back after speeding up the emu.
19:41 2005-03-14
Add an optional Beta number to version.h. Non-beta releases have a beta number of
0(zero). Change AD16, wc_debug and IDM_ABOUT to display everything correctly.
19:44 2005-03-14
Remove wc_debug from the main release package, make a devkitPPC demo, and upload it
independently. Maintain it so it's always up to date with the emu.
02:18 2005-03-19
Sure about that? It would cause old versions released after this change to lose
wc_debug functionality.
22:29 2005-03-19
No one's complained about it yet. Until someone does, I shall assume that it is not
a problem.
16:00 2005-03-18
Add SIPOLL interrupts to realtime mode.
22:56 2005-03-19
Check if D3DCREATE_HARDWARE_VERTEXPROCESSING can be used again. It could give us a
considerable performance boost in 3D apps.
20:28 2005-04-24
tf-pn-mtx.elf acts very strangely with hardware processing on. There may be a bug
in the vertex shader.
18:02 2005-03-21
Investigate wether the offset argument in hardware r/w functions can be removed.
It's only used in one function besides the unhandlers. If it cannot be done, at
least we can put the data in the write functions first, to take advantage of
fastcall.
22:43 2005-03-23
Set up an NFS server and test gc-linux with it.
14:16 2005-03-29
Consider wether ULI should be renamed EmuTime.
14:21 2005-03-29
Decide of wether to use word wrapping or manual maximum.
15:06 2005-03-29
Seems like a combolation is in order; ordinary function calls are better of going
manual.
14:45 2005-03-29
Consider making InterruptRaiser a friend of CoreBase.
18:21 2005-03-31
Create an outside-type CPU comparator. To increase speed at the cost of memory, one
could create a buffering system in which the last X register sets are saved,
allowing outside comms to be done only every X cycles instead of every cycle. X
would have to be negotiated between the peers somehow. Or if we use a client/server
approach, one of them could decide.
12:14 2005-04-01
There could also be a hardware-access comparator.
12:15 2005-04-01
Create an option to log every single hardware access. we might want to make it
private-only.
09:12 2005-04-03
See about getting rid of Hardware::rw() et. al. Think manual inline.
09:15 2005-04-03
Harmonize timing by making sure that do_interrupts() are called on the same cycles
in both interpreter and recompiler. They may differ between timing modes, though.
19:06 2005-04-03
Not possible because of the recompiler's irrational periods. Instead, make
approximate delays to get similar conditions.
13:51 2005-04-04
I've checked by doing a /rec /skip run. It's definitely an interrupt timing issue.
14:05 2005-04-04
b6-b7 /clog comparison useless.
14:12 2005-04-04
Maybe a clean /lint comparison could reveal something; differences in interrupt
timing.
11:55 2005-04-06
I've got nothing. Moving on to other bugs for now...
11:55 2005-04-06
Bug in ctr-snd where it doesn't switch to the other sound if one is already
playing.
11:56 2005-04-06
Maybe it's not a bug; I still don't know what happens on a real Cube.
19:19 2005-04-07
DEGUBs should always be accompanied by their basic causes. As it is now, some
hardware thingses are written without a r/w? notice. Go through code, chekkitout.
17:00 2005-04-12
Improve map/degub system by allowing a specific symbol to control them
(start/stop).
11:00 2005-04-14
Make AdditiveTiming use RDTSCR or whatever it's called. We don't need it to be
exact over time, like the emulator timing.
17:10 2005-04-14
Move VISI to hw_vi.cpp.
19:14 2005-04-14
Add GCM gamename to window titlebar.
21:47 2005-04-14
See PPC Manual, appendix E.1. Address checking should be added to stwcx. and if the
reserved address doesn't match the effective one, the store should be completed.
19:12 2005-04-18
Done for interpreter. Recompiler should be changed too, but I don't wanna right
now, and also I don't think it'll matter very much. Dual mode will detect any
problems.
14:04 2005-04-15
Possible sync/isync implementation: have "synced" state in Core. False by default,
set to true by sync instructions, set to false by... what? Checked by operations
requiring sync, like BAT or MSR writes.
02:12 2005-04-16
Add datestamp to compability list.
13:04 2005-04-18
Functionalize memdegub, with both effective and physical addresses in advanced
mode.
13:05 2005-04-18
Try to get effective addresses out of the recompiler memory error handler. Maybe we
can make it use the Memory class instead of rec code... might make things a lot
slower, though.
20:28 2005-04-18
Try to enable image retention when paused in 3d mode.
20:41 2005-04-25
Improve memdegub performance by having a position pointer instead of copying the
previous string every time.
21:49 2005-04-25
Investigate what happens to illegal memory accesses on a real Cube. I don't think
it's MCEs, like I've implemented it. Rather, according to or9's bootrom RE, it
would be a MI interrupt... but what would happen if MI is turned off? And how would
regions not covered by one of the four MI registers be handled? I need to know.
17:11 2005-04-26
Go through code, replace memcpy with mem::read*() and write*() where possible.
17:20 2005-04-26
Clean up common.h. It's messy.
11:25 2005-04-29
Remake convertYUYV2RGB using assembly. also get rid of doline().
00:13 2005-05-02
Make it so that pausing when recompiling results in pausing directly afterwards
instead of causing an error.
Maybe we could rework the thread so it pauses itself (by waiting for some Windows
event, perhaps).
10:48 2005-05-04
Fix the code duplication in doGLE() and its companions.
02:06 2005-05-06
Handle the DirectX init errors (and possibly others) better, by using UEs in place
of the cryptic D3DERRs that are used now. The specific D3DERRor is useless to me
without knowing its line number anyway.
17:59 2005-05-07
Done for initD3D and initDI. Other code (main and gp) remain.
19:18 2005-05-10
Introduce a special return type for GLE functions, so they become more easily
recognizable. Convert all existing code. Low priority.
23:55 2005-05-13
Augment FieldCollection::dump() to throw an exception if any non-fielded bits of a
dword are set.
03:35 2005-05-17
Add an optional total error bypass. It would have three different settings: Normal,
Popup and Ask/Continue, and Total Ignore. When changing from Normal to any of the
others, pop up a warning box about the instability and "if WC crashes, reset to
Normal and try again".
20:36 2005-05-17
Make sure that dsp_log has taken over all appropriate DEGUBs from log_audio.
20:47 2005-05-21
There are comments, questions, in dsp_intops.cpp, that point to unclarities in
Duddie's DSP documentation. Ask him about it.
19:29 2005-05-24
It centers around the accumulators and the controlreg bitset opcodes.
19:28 2005-05-24
Consider implementing vertex transforms in C, as an alternative to Direct3D's
Shaders.
23:39 2005-05-24
Change pad input shifts to 2/3 and 1/3 instead of 1/2 and 1/4 to escape the
deadzone.
18:45 2005-06-17
Instead, fix the controller ranges. Compare yagcd and the sdk.
18:29 2005-05-26
EBF->texture copying can be made to a region of an already existing texture.
WhineCube will not recognize this, and will create a separate texture which will
not be used. Fix this by saving texture sizes and checking against... all existing
textures when making a copy... not very fast, I'm afraid.
20:27 2005-05-26
Dolphin does not implement z-texturing.
20:54 2005-05-26
Our own pixel shaders will be required to implement z-texturing.
00:48 2005-05-27
Until then, make sure anything that tries to be used as a z-texture is ignored.
Currently, they're loaded as standard textures, and dumped too.
03:34 2005-06-02
Change hardware hook functions so they return the new value for their register
instead of writing it themselves. Safer that way.
17:01 2005-06-03
Or... get rid of the collector functions altogether and have the memory subsystems
call the hooks directly.
19:44 2005-06-03
Clean up GP statistics to avoid code duplication.
16:49 2005-06-06
See about fixing the killPeriodicTasks() handling code dupe. It'd have to be moved
to CoreBase, I think.
20:16 2005-06-07
Optimize is_power_of_2 using setcc.
17:53 2005-06-08
Fix code dupe in GP draw functions.
18:23 2005-06-08
Emulate custom line width using ID3DXLine.
18:49 2005-07-26
Special Pixel Shaders may also be required.
11:57 2005-06-14
mgt-triple-buf.elf is acting strangely when frame limiting is active in exact-fast
mode, as if it wasn't active. Fix.
12:12 2005-06-14
Disabled copy ignore. bam3k may dislike it.
14:45 2005-06-14
Re-enabled copy ignore.
13:21 2005-07-29
Frame limiting is working, but there's a delay when it's turned on. Investigate.
16:21 2005-06-18
The 32 line discrepancy in most gx demos is due do the demo lib calling
GXAdjustForOverscan. There's actually supposed to be two 16-line blocks on the top
and bottom instead of a single 32-line block. A combolation of VI and GX states
into the viewport handler will be required to emulate this accurately. Note that
this does not affect the text position in pix-logic et. al. This reinforces my
opinion that these demos must be tested on real hardware before work on them is
continued.
03:15 2005-06-19
Force the console width to 80 chars, wrapping lines.
19:27 2005-06-21
Use the nice method of continuing strings ("yadda "\n"yadda"...) and fix all lines
longer than 90 characters in the code.
21:01 2005-06-21
Check Metroid 2, Disney Sport Football and Bomberman Land 2 for weird fifo
behaviour.
01:11 2005-07-07
Soul Calibur 2 seems to do it also. It looks like the same bug as before: VI
interrupt trashes the FIFO.
21:57 2005-06-21
Add pixel shader detection and disabling code.
01:12 2005-07-28
Done. Some more testing of ps1.x error handling code is required.
21:06 2005-06-22
Find some way to reduce the size of enumerations. Most of them need only take one
byte, instead of four. However, we must retain type safety. A #defined or template
class should help.
23:44 2005-06-22
Find out why accesses to hwndVDO fails for no reason at times. Then fix it.
00:44 2005-06-29
Something weird is up with texture alpha. Effects are visible in tev-multi.
01:26 2005-07-05
Make an array of col0 and col1 in getconvertices to eliminate code duplication.
23:50 2005-07-24
There are texture copy formats which are unemulated, and I can't figure out how the
frell they translate from enumeration to bp register, so I can't know which format
they want. I imagine one could figure it out by writing a demo which goes through
all the different formats.
12:24 2005-07-05
Nintendo says: "We recommend using the locked-down cache mechanism when writing
bulk data to the EFB." Investigate this. It may be useful for rgb->yuv conversions
on the Cube.
20:28 2005-07-06
Improve error detection in TEV->PS generator, especially with respect to unused
results.
00:23 2005-07-07
Optimize fsel by using fld/fstp instead of movsd, like ps_sel.
00:52 2005-07-07
Move from FVF to proper Vertex Declaration in order to support binormals, which are
needed for bumpmapping.
20:21 2005-07-20
Kill the threads on timeout to prevent deadlocks.
20:44 2005-07-20
Done, but there's still the problem of order; the emu thread is waiting for the GP
thread, but not terminating it, so it has to be waited on and terminated later.
21:56 2005-07-22
Move Hardware hook and other init to the respective files.
01:16 2005-07-23
Fix fifo change errors and emulate 32-byte WGP by copying the unused bytes to the
new fifo on fifo change.
12:17 2005-08-01
Didn't work.
01:16 2005-07-25
Continue? screen in BAM3K has an invisible marker. Try to find it by wireframe
and/or disabling logic blend modes.
12:16 2005-08-01
Add a "Reset to defaults" button in AOptions.
20:40 2005-08-14
Tetris Worlds (GTRE) is very slow in the first screen. Investigate and fix.
13:01 2005-08-19
Add frame counting to shaders and display lists. Remove old ones regularly (like
once per second), but first investigate how long objects are left unused. We do not
want to recreate stuff unnecessarily.
13:58 2005-08-19
Add stack tracing to common exception handlers. Maybe check for PDB file on start,
set a bool. Use Konstantin Boukreev's code.
10:48 2005-08-21
Add some sort of register caching to the recompilers. Note that function calls
invalidate all registers.
10:55 2005-08-21
It is noted that the far-reaching implications of this would necessitate a full
rewrite of the recompiler, possibly into some pseudo-assembler language. Maybe text
would be used, but I think that would be inefficient. A function set, with one (or
more, overloaded) func for every Intel opcode, could be better.
00:14 2005-08-27
Add minidump functionality.
14:44 2005-08-28
Change MemoryPool to use a hash map instead of a list. Should be faster.
00:51 2005-09-01
Make the project compatible with DevC++, to see if gcc/mingw is a better optimizer.
17:43 2006-01-15
DevC++ sucks. This is put on hold.
11:29 2005-09-15
Read in the first 0x20 bytes from dvd to 80000000. Apparently it's some sort of
standard.
20:13 2005-09-20
All variable and function names should be made to conform to a single standard. I
haven't decided which standard yet.
23:34 2005-09-27
Add compile-time restrictions on xf func data sizes. Use templates, like Symbian
descriptors.
16:24 2005-10-02
This will allow us to discard unused words in recompiled Display List XF loads.
14:13 2005-10-02
Maybe fix the naming scheme. I like the Symbian variant, with Capitals for classes,
smallCaps for functions, mCaps for class variables, iCaps for inherited variables?,
aCaps for arguments, smallCaps for function variables, gCaps and sCaps for globals
and statics.
20:36 2005-10-27
Also maybe change pointer and references to have the modifier before the space (as
in Symbian), instead of after (as it is in WhineCube now).
20:45 2005-10-27
Remove header references from each other by forward-declaring classes and structs
wherever possible. This will minimize the number of files that must be compiled
after an edit.
23:47 2006-01-01
All errors when writing to a file should give the user the options "Abort, Retry,
Ignore". For example, in the Settings dialog, when pressing OK, if the INI file
cannot be written, Abort will return to the dialog box, Retry will attempt to write
the INI file again, and Ignore will close the box without writing the file.
22:25 2006-01-04
Check gc-linux self-relocatable DOLs; they are reported as invalid.
21:47 2006-04-14
SPR logging is broken.
08:58 2006-04-24
Savestate schemes:
*Standard Slot, like in ZSNES.
*Single slot with multiple saves, like Serious Sam. User-configurable number of
saves.
*A combolation: slots where the emu saves a number of the latest saves regardless
of slot. User-configurable number of saves.
12:42 2006-04-30
Improve invalid opcode detection! Take a look at sc(syscall) for example.
22:44 2006-05-17
A different but related thing that should be done is to get rid of the old OpArray
system and use faster function-based fixed arrays, like the other emulators. I
don't know yet what sort of system will ultimately be used... maybe a macro-based
masked eq... would slow the interpreter down, though.
14:26 2006-04-30
Also handle addic and stwcx better. See andi.
22:50 2006-05-17
Speaking of slowdown, the constant if(degub_on):s must take a great toll on the
machine. See what can be done about those.
22:52 2006-05-17
See above also. Maybe we should create a special release-debug build, with all the
DEGUB options, and a speedy release build without them.
22:41 2006-05-17
To improve performance, the current class-based system should be abolished.
Alternatives include pure C99, but the most recent one I came up with was declaring
- everything that's only created once anyway - static. That should get rid of
practically all the C++ overhead. Things that are declared multiple times, such as
small structs and classes, wouldn't get faster in a C99 scenario anyways. One might
also look into thin templates (Symbian-style).
21:15 2006-05-22
See about using GDB to create a remote debugger. Should be considerably less work
than a built-in one, and allow for source-level debugging (very fucking useful).
23:25 2006-06-08
Get rid of TerminateThread. If a thread does not exit on its own, its code is
broken.
14:45 2006-06-14
Threading is most unclean. Cleanse the code. :)
20:25 2006-07-23
There are several weird bugs in main.cpp, related to the drawing and pausing code.
The crashes when screenshooting and pausing are the most noticable, but there's
also a bug that prevents any screen updates from being done if one does not make
the window lose focus first.
11:53 2006-09-30
Crash fixed. 'Twas quitThread that PostCloseMessage whenever someone started stuff
from the command line.
17:23 2006-08-26
Add option to allow EmuDebug output to be ignored, just like UART output.
19:36 2006-08-28
Set internally used values to internal header files, to avoid unneccesary
recompilation. See especially meminterface.
23:30 2006-09-05
Option for accurate FPU emulation (especially FPSCR exception bits)?
19:43 2006-09-10
Upgrade all code that uses the old HEX macros in stringCommons.h. There are new,
better macros available.
17:16 2006-09-30
There is a bug in fread() (M$'s version at least) that results in the file position
being set to an arbitrary number after a call. Get rid of all calls to fread(),
maybe by wrapping it in a class that requires file position for every read and has
no tell(). Alternative: use libstl... although I think I remember it having the
same bug. A class of our own is safest.
18:28 2006-09-30
I'm making a class, but I think the bug sits in the M$ libraries, so that calling
Win32 functions directly is safe. This means that algorithms won't have to keep
track of the actual file position.
15:12 2006-10-01
Classes created. fread() removed. Remove fwrite() too.
23:24 2006-10-07
Dump DSP data rom. Dump irom and compare with duddie's dump. Check what effect DSP
Reset and Init have on iram/dram and, if possible, the effect on the Program
Counter.
21:29 2006-10-15
DSP Yield is currently incorrectly named Halt. This confuses matters, are there is
a real DSP Halt which must be handled properly. Refactor code.
13:11 2006-11-26
Change EXI interrupts so that they are triggered as soon as an appropriate write is
made to the control register of the pertinent channel. Flags for the interrupts
(type, channel) will be needed. I think this is closest to how it works on
hardware.
15:35 2006-12-09
Compare QEMU's PPC MMU emulation with ours. Theirs is probably more bug-free than
ours.
13:56 2006-12-31
Tabulate entire codebase.
11:05 2007-05-11
The backspace key is handled even when not in focus, resulting in resets when doing
stuff like navigating directories in a file manager. Fix.
19:53 2007-07-14
The reset doesn't occur until WhineCube regains focus. It seems like old keyboard
events are processed then. This is obviously not proper.