(notes) 2023-08-23 - Create dev note, thinking about re-arranging the ISA
This commit is contained in:
parent
c0f11f2b03
commit
c8d30e524a
|
|
@ -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)
|
||||||
Loading…
Reference in New Issue