Can I haz time machine?
Another busy month passed, here comes the new update with lots of bug fixes and some freshly implemented instructions:
- Implementation of
- AND.x reg,reg;
- EOR.x reg,reg;
- EOR.x reg,mem;
- SUBA.x reg,reg;
- SUBA.x #imm,reg;
- BSET.L #imm,reg;
- BCLR.L #imm,reg;
- EXG.L reg,reg and
- NOP :) instruction.
- Reorganized MOVE.x mem,mem instruction: memory reading and writing is separated out into independently callable functions to support the implementation of other similar instructions.
- Implementation of OR.x reg,reg instruction was adapted to a more generic form.
- Fixed flag checking for AND(I).(W|B) #imm,reg instructions.
- Removed confusing OR immediate macroblock and replaced by the already available OR low immediate.
- Falling back from addressing mode d16(ax) to (ax) if the offset is zero.
- Fixed depenency flag handling in result check helper function.
- Cleaned up opcode description table. Removed instructions from the table and from source code which won't be supported by the JIT compiler. Added missing RTM instruction.
- Temporary register storage slots were moved from the stack frame to the Regs structure (context).
- Removed useless debug log that flooded the output.
- Temporarily disabled MOVE.x mem,mem and EOR.x reg,mem instructions to let the Kickstart run.
I have good news and not-so-good news
Which one should we start with? Okay, let me choose for you: not-so-good news first.
At the moment (beside the yet unimplemented instructions) there are two bugs that prevent the OS from running properly:
- For some unknown reason when an instruction reads and then writes the memory then the Kickstart goes back to the well-known reboot loop (actually it is a crash, sometimes you can even see the Guru message).
At the moment I don't have the slightest idea why this happens. I traced it back to the normal MOVE instruction, when it copies data from one address to another. There is nothing wrong with the instruction implementation itself - as far as I can tell. So, this is some weird sh*t again. Lovely. - When the optimize flag is turned on (comp_optimize = true in the config) then the Kickstart crashes very early.To tell you the truth, I am not surprised. When I tried to figure out the register dependency for each macroblock for each instruction then sometimes I mixed up stuff what I found later on. Due to the wrong register dependency settings for some macroblocks, these were accidentally removed, so some code is "optimized away". Most likely there are more mix-ups and missing dependencies in the code, it can be found just matter of time.
Good news:
As you can see in the last item for the update: I temporarily disabled the two already implemented instruction which tries to read and write the memory. The missing instructions are substituted by using the interpretive instructions.
Now, if you disable the optimize option in the configuration (comp_optimize=false) then the Kickstart seems working with some actual JIT compiled instructions! YAY! \o/ (I guess.)
Some more interesting problems
I have got some feedback about issues with running Kickstart 1.3 and some old Amiga500 games when the JIT is enabled. This is interesting indeed because if even if the JIT was turned on it did not emulate these old codes because the cache is never turned on (there was no cache in the Motorola 68000 processors when these programs were written).
As you can read it in the FAQ: the JIT compiling is depending on the cache emulation heavily. So, this is one more question mark. I haven't had much time to investigate it yet.
But most importantly: the Summer Sun is shining, let's go surfing! (Oh, wait. I don't do surfing. Last time when I jumped onto a bodyboard on the beach I bruised my ribs. Embarrassing and totally geeky. Let's just surf the net, shall we?)