- Evaluate b before a
This makes instructions that address the stack twice meaningful instead of confusing and useless.
ADD PEEK, POP
should pop the top of the stack and add it to the second entry, but currently the PEEK
is evaluated before the POP
occurs.
- Add [SP+next word] addressing
This makes writing functions that store extra variables or arguments on the stack easier.
POP isn't useful as an a value, and PUSH isn't useful as a b value, so they should be combined into one value, with postincrement and predecrement determined by whether they're in a/b.
- Make opcodes 5 bits
A literal a value is not very useful, and having 2x more opcodes is very useful. bbbbbbaaaaaaoooo becomes bbbbbbaaaaaooooo
- Make literal range include -1.
Shift the literal range from [0, 31] to [-1, 30].
Having -1 as a literal lets you useful one-word instructions like:
NOT X --> XOR X, -1```
5. Rename O register to EX or OV
-------------------------------------
O and 0 are very easy to confuse, other special registers are two characters, and it doesn't always represent overflow.
6. Add signed MUL/DIV instructions
--------------------------------------
Signed operations make maneuvers, targeting, and fixed-point trigonometry routines more efficient.
Suggested mnemonics: `MLI`, `DVI`.
7. Add signed right shift (ASR)
-----------------------------------------
Signed operations are useful.
8. Add additional IF instructions
------------------------------------
Supporting all the relations (<, >, <=, >=) will make assembly easier to write and read. Suggested mnemonics and effects:
0x11: IFB a, b - performs next instruction only if (a&b)!=0 (Bit set)
0x12: IFE a, b - performs next instruction only if a==b (Equal)
0x13: IFN a, b - performs next instruction only if a!=b (Not equal)
0x14: IFG a, b - performs next instruction only if a>b (signed) (Greater)
0x15: IFA a, b - performs next instruction only if a>b (unsigned) (Above)
0x16: IFL a, b - performs next instruction only if a<b (signed) (Less)
0x17: IFU a, b - performs next instruction only if a<b (unsigned) (Under)
Appendix A.
===========
1. Fix line drawing characters
------------------------------
As [jecowa noted on reddit](http://www.reddit.com/r/dcpu16/comments/sio8u/dcpu_font_help_what_are_those_first_30ish_glyphs/c4ekx9u), you can't make full boxes with the current line drawing characters.
These 22 glyphs let you draw boxes:
│─└┌┐┘┴├┬┤┼
║═╚╔╗╝╩╠╦╣╬
Suggestions for extra 5 glyphs:
° (Degree) and ♠♥♦♣ (Card suits)
Note that the full block █ with fg color X is equivalent to space with bg X. Replace it with a dithered ▒ half-block.
I would also suggest PUSHALL and POPALL to conserve program size, even if they take the exact same amount of cycles as doing it manually