<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif; font-size:12pt">
<font size="2"><span style="font-size:11pt">>> As I recall the big one is that LLVM isn't well adapted to instruction<br>
</span></font></div>
<div style="color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif; font-size:12pt">
<font size="2"><span style="font-size:11pt"></span></font></div>
<div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt">
<div class="PlainText">>> sets without fungible registers.<br>
<br>
>What does this mean exactly? How does the WDC 65816 not have fungible registers, while other processors do?<br>
<br>
>> One idea is to use some of bank 0 as<br>
>> a source of registers, maybe with a custom pass to promote things to<br>
>> real registers where possible after the fact.<br>
<br>
>How would I end up doing this? Do you mean bank 0 of the actual SNES ROM?<br>
<br>
</div>
<div class="PlainText">Probably meant page 0, from a 6502 nomenclature, or "direct page" in 65816.</div>
<div class="PlainText"><br>
</div>
<div class="PlainText"><br>
</div>
<div class="PlainText"><span>Ah, so the 6502 and 65816.<br>
</span>
<div> ​</div>
<div> ​</div>
<div>As I recall...​</div>
<div> ​<br>
</div>
<div>These processors have one general purpose​ register "accumulator" and two limited-use index registers "x" and "y".​</div>
<div><br>
</div>
<div>So basically no registers. ​</div>
<div> ​</div>
<div>Therefore there is a reported style of​ programming the 6502 where the first 256​</div>
<div>bytes of memory -- "page 0" --​ are used as general purpose registers instead.​</div>
<div> ​</div>
<div> ​</div>
<div>The stack pointer "S" btw is an 8 bit register,​ implicitly referencing the second 256 bytes​</div>
<div>of memory -- "page 1".​ And silently wrapping around.​</div>
<div> ​</div>
<div> ​</div>
<div>Instructions referencing page 0 are smaller and​ faster than instructions referencing the rest of the 16bit​ address space.​</div>
<div> ​</div>
<div> ​</div>
<div>The 65816 is slightly less bad.​ It has a 24 bit address space (24 MB).​</div>
<div>​​</div>
<div>It's stack pointer is widened to 16 bits, referencing​ anywhere in the first 64K.​</div>
<div> ​</div>
<div> ​</div>
<div>It also renames "page 0" to be "direct page",​ based via a new 16 bit "direct page" "D" register.​</div>
<div>​</div>
<div> ​</div>
<div>If you assume a pushy/poppy ABI (like NT/x86,​ unlike NT/amd64), then these two registers combine​ to give you a semblance of a modern call sequence.​</div>
<div>D is like ebp.</div>
<div> ​</div>
<div>  ​</div>
<div>When it was said "bank 0" it was probably meant "page 0".​</div>
<div>Though 64K in 65816 might be a "bank" and the first​ 64K "bank 0".​</div>
<div>​</div>
<div><br>
</div>
<div>There is also a bank "K" register that implies the high​ 8 bits of most 16bit addresses (unless S- or D-relative).​</div>
<div> ​</div>
<div>​</div>
<div>I'm still not sure what you'd do with this.​</div>
<div>I guess you can try picking a small number of general​</div>
<div>purpose registers. No more than 8, since x86 does "ok" with that.​</div>
<div>Model them as all volatile.​</div>
<div>Store them all on the direct page.</div>
<div> ​</div>
<div> ​</div>
<div>?​</div>
<div> ​</div>
<div>​</div>
<div>Despite their historical high usefuless and that I programmed​ and used both of these, they are difficult for me to imagine using​</div>
<div>today.​</div>
<div>​</div>
<div>​</div>
<div>For the morbidly curious: The compare instruction only yields​ status bits useful for a conditional compare if the inputs​</div>
<div>are considered unsigned. To do a "compare" of signed integers,​ requires a destructive subtract. (but if accumulator does not count</div>
<div>as a register, maybe you have not destroyed anything..)</div>
<div>​</div>
<div>​</div>
<div>The interrupt enable/disable flag has a reversed meaning​ but same instruction mnemonics compared to x86.​</div>
<div>So people write the code backwards.​ sei/cli, but interrupt flag enabling vs. inhibiting interrupts. ​</div>
<div>​</div>
<div>​</div>
<div>There is no add without carry instruction.​ You have to clear carry first, like always (unless​ doing multi-precision math).​</div>
<div>​</div>
<div><br>
</div>
<div>The subtract/borrow meaning I believe is also same mnemonic ​ but reversed meaning from x86.​</div>
<div>You set carry before sbc, or such.​</div>
<div>It made sense to me at the time based on elementary school math at least.</div>
<div>​<br>
</div>
</div>
<div class="PlainText"></div>
<div class="PlainText"> - Jay<br>
<br>
</div>
</span></font></div>
</div>
</body>
</html>