From 6281e2036f6857cab07b49d57bb126c209ef4726 Mon Sep 17 00:00:00 2001 From: Clanmaster21 Date: Thu, 10 Oct 2019 19:44:23 +0100 Subject: [PATCH] Optimised intoXX functions (#19) * Optimised intoXX functions Rewrote intoXX functions to mainly rely on intoHL, as the HL instructions are smaller and faster. Also removed some redundant push and pop instructions. I edited the given unit tests to test these, and they seem to work as expected. * Doesn't use self-modifying code The number of bytes is the same as my previous attempt, with 11 more cycles in intoHL, so although I don't feel as clever this time it's still a good optimisation. I found an equivalent method for intoDE, however relying on intoHL still allows for `ex (sp), hl` to be used in intoIX, which is smaller and faster. * Update core.asm * Tried harder to follow coding convention Added tabs between mnemonics and operands, and replaced a new line I accidentally removed. --- kernel/core.asm | 41 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/kernel/core.asm b/kernel/core.asm index 9259aaa..f23475a 100644 --- a/kernel/core.asm +++ b/kernel/core.asm @@ -27,34 +27,29 @@ addDE: noop: ; piggy backing on the first "ret" we have ret -; copy (DE) into DE, little endian style (addresses in z80 are always have -; their LSB before their MSB) -intoDE: - push af - ld a, (de) - inc de - ex af, af' - ld a, (de) - ld d, a - ex af, af' - ld e, a - pop af +; copy (HL) into DE, then exchange the two, utilising the optimised HL instructions. +; ld must be done little endian, so least significant byte first. +intoHL: + push de + ld e, (hl) + inc hl + ld d, (hl) + ex de, hl + pop de ret -intoHL: - push de - ex de, hl - call intoDE - ex de, hl - pop de +intoDE: + ex de, hl + call intoHL + ex de, hl ; de preserved by intoHL, so no push/pop needed ret intoIX: - push de - push ix \ pop de - call intoDE - push de \ pop ix - pop de + push ix + ex (sp), hl ;swap hl with ix, on the stack + call intoHL + ex (sp), hl ;restore hl from stack + pop ix ret ; add the value of A into HL