mortarm wrote: ↑Thu Feb 15, 2024 3:54 pm
I'm not familiar with the 65816. As a regular user, what advantages, if any, would there be to upgrading?
As an ordinary non-developer:
You get to run software that says "this only runs on a 65816" or whatever our colloquial term for a 65816-powered X16 is going to be ("Super X16"?

).
Programming wise:
The 65816 gives you actual 16-bit operations, which means one opcode can handle loading two bytes of memory into a 16-bit accumulator, and you can do actual 16-bit math on that accumulator.
Indexed memory access (e.g., LDA $nnnn,X) can use a 16-bit index so you can have more than 256 bytes in a single table (for example).
The stack pointer is a full 16 bits, which means the CPU stack can be located
anywhere in memory, not just $01xx, and I'm assuming that means the stack can hold more than 256 bytes.
Instead of zeropage addressing, you have "direct" addressing, which is just like zeropage except you can move around to anywhere you want.
One of the biggest advantages of the 65816 which is sadly unavailable on the X16 is its ability to address up to 16 MB of memory. The way it works is, you have two "bank select" registers: one used when the CPU is reading opcodes and arguments (PBR) and one used when the program is accessing memory (DBR), so for example, instead of needing to write to a memory address to switch banks, you use an opcode to load PBR or DBR with the desired bank number, and you can have the program running in one bank and have it manipulate memory in a different bank at the same time.
On the X16, the A16..A23 output from the 65816 is ignored, so you still see the same memory map that a 6502 sees (regardless of PBR and DBR), complete with the bankswitching regions and the memory-mapped bank select registers at $0000 and $0001.
Edit: There's also a "block move" command but I haven't looked into how it works just yet. I imagine it just copies a chunk of memory from one location to another with just one opcode.