
Design and implement a stable, simple, all-encompassing screen update algorithm. The current one sucks.
16:31 2004-03-21
Fix frame detection for gc-linux. (?)
13:54 2004-04-01
Idea: Adaptive Halfline Frame Detection. This algorithm assumes that something relatively time-consuming is done between vsync() calls. Every halfline read will be timed against the previous one. The old deltas will be averaged and the new compared aginst the average multiplied with an arbitrary multiplier (10?). If higher, it is assumed to be a "long" delta, and thus a new frame. Short and Long deltas will have separate averages.
15:28 2004-04-01
There is no frames in gc-linux, as far as I can tell. 'Twas a bug in getScreen() that caused teh mess.
22:08 2004-05-10
Idea from gcube: the halfline counter is increased with a fixed interval (between 1 and 200, perhaps) every time it's read. When it reaches max it returns to zero. VSYNC occurs when a specific value is reached. gcube uses 0. I think it can work.
22:25 2004-05-10
When no frames are detected, gcube uses the instruction count for automatic screen updates instead of any real-time system.
20:22 2004-06-19
Some games are apparently too fast at 50/60 FPS and some are too slow at 25/30. It seems that some games run interleaved and some don't. With no way of knowing how any particular game uses the halfline count we provide, we'll have to assume they update the screen at both half and full vsync. It will cost us performance in the games that don't use the half-vsync, but I see no alternative.
11:55 2004-06-27
Or we could just skip half of them frame updates; no one would notice. :} So it is.
18:53 2004-06-28
Now the biggest problem is the interrupt-driven demos like testdemo4. Ideas, anyone? :}
14:29 2005-04-14
Many things have changed in the last year, but automation is still on the todo list. (Making it so we don't have to use HRR manually, and stuff.)

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.
