summaryrefslogtreecommitdiff
path: root/Optimizing-assembly-code.md
diff options
context:
space:
mode:
authorRangi <remy.oukaour+rangi42@gmail.com>2020-06-09 15:22:02 -0400
committerRangi <remy.oukaour+rangi42@gmail.com>2020-06-09 15:22:02 -0400
commit97136f4bba85ecfd9c32814ae7c1963f10a2254f (patch)
treed2f10d2c0d75abdc4a2260ce2cf7d963619bb6be /Optimizing-assembly-code.md
parent7cfbf4f8aa73a2e6cbd75ca5bb6aa88c6402915a (diff)
hl|bc|de -= N
Diffstat (limited to 'Optimizing-assembly-code.md')
-rw-r--r--Optimizing-assembly-code.md40
1 files changed, 40 insertions, 0 deletions
diff --git a/Optimizing-assembly-code.md b/Optimizing-assembly-code.md
index 54af5ba..7d7afd9 100644
--- a/Optimizing-assembly-code.md
+++ b/Optimizing-assembly-code.md
@@ -28,6 +28,7 @@ WikiTI's advice fully applies here:
- [16-bit registers](#16-bit-registers)
- [Multiply `hl` by 2](#multiply-hl-by-2)
- [Add `a` to a 16-bit register](#add-a-to-a-16-bit-register)
+ - [Subtract an 8-bit constant from a 16-bit register](#subtract-an-8-bit-constant-from-a-16-bit-register)
- [Add `a` to an address](#add-a-to-an-address)
- [Increment or decrement a 16-bit register](#increment-or-decrement-a-16-bit-register)
- [Load from an address to `hl`](#load-from-an-address-to-hl)
@@ -490,6 +491,45 @@ Or if you can spare another 16-bit register and want to optimize for size over s
add hl, de
```
+
+### Subtract an 8-bit constant from a 16-bit register
+
+(The example uses `hl`, but `bc` or `de` would also work.)
+
+Don't do:
+
+```asm
+ ; 8 bytes, 8 cycles
+ ld a, l
+ sub FOO
+ ld l, a
+ ld a, h
+ sbc 0
+ ld h, a
+```
+
+But do:
+
+```asm
+ ; 7 bytes, 7 or 8 cycles
+ ld a, l
+ sub FOO
+ ld l, a
+ jr nc, .no_carry
+ dec h
+
+.no_carry:
+```
+
+Or if you can spare another 16-bit register, do:
+
+```asm
+ ; 4 bytes, 5 cycles
+ ld de, -FOO
+ add hl, de
+```
+
+
### Add `a` to an address
(The example uses `hl`, but `bc` or `de` would also work.)