From de69180456ea2a6ba02fac131f551a60245901c2 Mon Sep 17 00:00:00 2001 From: n loewen Date: Mon, 7 Aug 2023 10:37:59 +0100 Subject: [PATCH] Add notes from 2023-08-07 --- notes/2023-08-07--dev-notes.md | 82 ++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 notes/2023-08-07--dev-notes.md diff --git a/notes/2023-08-07--dev-notes.md b/notes/2023-08-07--dev-notes.md new file mode 100644 index 0000000..a3dabdb --- /dev/null +++ b/notes/2023-08-07--dev-notes.md @@ -0,0 +1,82 @@ +# Dev notes — 2023-08-07 + +## Carry vs overflow + +[Understanding the difference between overflow and carry flags](https://stackoverflow.com/questions/69124873/understanding-the-difference-between-overflow-and-carry-flags) + +> Carry indicates the result isn't mathematically correct when interpreted as unsigned, overflow indicates the result isn't mathematically correct when interpreted as signed. +> - 1111 + 0001 = 0000 should set carry (15 + 1 = 0 is false) and clear overflow (-1 + 1 = 0 is true). +> - 0111 + 0010 = 1001 should clear carry (7 + 2 = 9 is true) and set overflow (7 + 2 = -7 is false). +> - 1001 + 1001 = 0010 should set both (9 + 9 = 2 and -7 + -7 = 2 are both false). + +so carry is unsigned +and overflow is signed + +(which is what i've got, good) + +## add more flags + change flag ops + +### flags register + +Replace the current 'Carry Flag' with a Flags Register. + +Here's a sketch for the bit pattern: + +``` +hi bit + +0 +0 +0 +0 + +0 ? negative +0 ? zero +0 overflow +0 carry + +lo bit +``` + +cf. 6502: + +- NV-BDIZC +- 7: Negative, 6: Overflow, 5: none, 4: Break, 3: Decimal, 2: Interrupt disable, 1: Zero, 0: Carry + +### flag opcodes + +- TODO: replace `CHP` and `CFC` with `FHP` and `FTG` + +- `FHP n`: hop if flag _n_ is set + - eg: `FHP 0` = hop if carry flag set + - eg: `FHP 1` = hop if overflow flag set + - to keep it simple, we're just giving each flag a number, not fussing with bitmasking or anything +- `FTG n`: toggle flag _n_ on/off + - eg: if Carry is on, `FTG 0` turns it off + - eg: if Overflow is off, `FTG 1` turns it on + +`FHP` and `FTG` can be combined to create `set flag` and `unset flag` routines: + +``` +@set_carry: + FHP 0 + FTG 0 +``` +If Carry is on when this is called, then `FTG` is skipped and Carry remains set. Otherwise, `FTG` sets carry. + +``` +; call with a return address stored at $01 + +@unset_carry: + FHP 0 ; 1 + FHP 0 ; 2 + FTG 0 ; 3 + JMP ($01) ; jump back to caller +``` +If Carry is on when this is called, then the execution is: 1, 3, and Carry is turned off. + +If Carry is off, then the execution is: 1, 2, (hop over 3; Carry is still off), jump back to caller. + +## Think about a subroutine stack? + +Maybe? \ No newline at end of file