(notes) 2023-08-23 - Create dev note, thinking about re-arranging the ISA

This commit is contained in:
n loewen 2023-08-23 14:43:12 +01:00
parent c0f11f2b03
commit c8d30e524a
1 changed files with 164 additions and 0 deletions

View File

@ -0,0 +1,164 @@
# Dev notes — 2023-08-23
## Instruction set layout notes
### Reference: 6502
[The 6502 Instruction Set Decoded](https://llx.com/Neil/a2/opcodes.html)
> Most instructions that explicitly reference memory locations have bit patterns of the form aaabbbcc. The aaa and cc bits determine the opcode, and the bbb bits determine the addressing mode.
## CHUMP reference
from David Feinberg, "A Simple and Affordable TTL Processor for the Classroom":
> The CHUMP instruction set features seven key operations, each of which comes in two flavors: constant and memory. For example, there is an ADD command for adding a constant to the accumulator, and another ADD for adding a value from memory to the accumulator. The 4-bit constant portion of the instruction is ignored by the seven memory commands. Table 1 describes the seven constant commands. The corresponding memory commands operate similarly on a memory value, and have a 1 in the op-code's low-order bit.
>
> For example, the following program increments the value in RAM location 2 repeatedly. Used properly, every READ command should be followed by a memory command, and every memory command should be preceded by a READ command.
> ```0: 10000010 READ 2
> 1: 00010000 LOAD IT
> 2: 00100001 ADD 1
> 3: 01100010 STORETO 2
> 4: 10100000 GOTO 0
>```
Constant instructions:
dec bin
00 0000 Load
02 0010 Add
04 0100 Subtract
06 0110 Store To
08 1000 Read
10 1010 GOTO
12 1100 If Zero
Memory instructions (I think):
dec bin
01 0001 Load
03 0011 Add
05 0101 Subtract
07 0111 Store To
09 1001 Read
11 1011 GOTO
13 1101 If Zero
## Current Cardiograph
```
hex bin
00 0000 END *
01 0001 STO lit#
02 0010 STO addr
03 0011 LDA lit#
04 0100 LDA addr
05 0101 ADD lit#
06 0110 ADD addr
07 0111 SUB lit#
08 1000 SUB addr
09 1001 HOP lit#
0A 1010 HOP addr
0B 1011 JMP lit#
0C 1100 JMP addr
0D 1101 FTG lit#
0E 1110 FHP lit# *
0F 1111 NOP ———— *
```
so the least significant bit indicates the addressing mode (0 = direct, 1 = indirect)
except for three exceptions: END, FHP, and NOP
## Possible Cardiograph revisions
If NOP swaps with FHP, then a 1 in the least significant bit always indicates literal addressing:
```
0000 END
0001 STO lit#
0010 STO addr
0011 LDA lit#
0100 LDA addr
0101 ADD lit#
0110 ADD addr
0111 SUB lit#
1000 SUB addr
1001 HOP lit#
1010 HOP addr
1011 JMP lit#
1100 JMP addr
1101 FTG lit#
1110 NOP
1111 FHP lit#
```
Or we could use 8 bits, and use one of the upper 4 to group instructions:
```
00 0000 0000 END
01 0000 0001 NOP
... ... NOP
0F 0000 1111 NOP
10 0001 0000 STO lit#
11 0001 0001 STO addr
12 0001 0010 LDA lit#
13 0001 0011 LDA addr
14 0001 0100 ADD lit#
15 0001 0101 ADD addr
16 0001 0110 SUB lit#
17 0001 0111 SUB addr
18 0001 1000 HOP lit#
19 0001 1001 HOP addr
1A 0001 1010 JMP lit#
1B 0001 1011 JMP addr
1C 0001 1100 FTG lit#
1D 0001 1101 FTG addr
1E 0001 1110 FHP lit#
1F 0001 1111 FHP addr
```
```
gggg iii a
g: group
i: instruction
a: addressing mode (for group 0)
```
- makes the use of the LSB for direct/indirect addressing perfectly consistent for group `0001`
- makes room for indirect `FTG` and `FHP` (but those still don't seem very useful)
...
But if I want to be able to add more groups later, something like `gg aa iiii` might be better...
```
hex bin group mode op
00 0000 0000 0 -- END
01 0000 0001 0 -- NOP
50 0101 0000 1 direct STO
51 0101 0001 1 direct LDA
52 0101 0010 1 direct ADD
53 0101 0011 1 direct SUB
54 0101 0100 1 direct HOP
55 0101 0101 1 direct JMP
56 0101 0110 1 direct FTG
57 0101 0111 1 direct FHP
60 0110 0000 1 indirect STO
61 0110 0001 1 indirect LDA
62 0110 0010 1 indirect ADD
63 0110 0011 1 indirect SUB
64 0110 0100 1 indirect HOP
65 0110 0101 1 indirect JMP
66 0110 0110 1 indirect FTG
67 0110 0111 1 indirect FHP
```
**let's do that!**
(but for now i'm going to skip indirect FTG and FHP out of laziness)