Skip to content

Instantly share code, notes, and snippets.

@neuro-sys
Last active February 24, 2019 15:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save neuro-sys/fc4834b51068b7aff83f83d636169037 to your computer and use it in GitHub Desktop.
Save neuro-sys/fc4834b51068b7aff83f83d636169037 to your computer and use it in GitHub Desktop.
; Each new term in the Fibonacci sequence is generated by adding the
; previous two terms. By starting with 1 and 2, the first 10 terms
; will be:
; 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
; By considering the terms in the Fibonacci sequence whose values do
; not exceed four million, find the sum of the even-valued terms.
ORG &8000
DI
XOR A
LD HL, SUM
LD (HL), A
INC HL
LD (HL), A
INC HL
LD (HL), A
INC HL
LD (HL), A ; SUM = 0
LD L, 1
XOR A
LD H, A
EXX
LD L, A
LD H, A
EXX ; HL'HL = T1 = 1
LD E, 2
XOR A
LD D, A
EXX
LD E, A
LD D, A
EXX ; DE'DE = T2 = 2
FIBSUM: PUSH HL
EXX
PUSH HL
EXX ; SAVE T1
PUSH DE
EXX
PUSH DE
EXX ; SAVE T2
BIT 0, E ; IS T2 DIVISIBLE BY 2?
JP NZ, FIBSUM_L1 ; YES
LD HL, SUM
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
EXX
LD HL, SUM+2
LD A, (HL)
INC HL
LD H, (HL)
LD L, A
EXX ; HL'HL = SUM
CALL ADD32 ; HL'HL = SUM + T2
EX DE, HL
EXX
EX DE, HL
EXX ; DE'DE = HL'HL
LD HL, SUM
LD (HL), E
INC HL
LD (HL), D
EXX
LD HL, SUM+2
LD (HL), E
INC HL
LD (HL), D
EXX ; SUM = SUM + T2 | (T2 MOD 2 == 0)
.FIBSUM_L1 LD HL, &F6FF ; LOWER WORD OF -4,000,001
EXX
LD HL, &FFC2 ; UPPER WORD OF -4,000,001
EXX
EXX
POP DE
EXX
POP DE ; RESTORE T2
CALL ADD32 ; HL'HL = - 4,000,0001 + T2
EXX
BIT 7, H
EXX
JP Z, FIBSUM_DONE ; IF POSITIVE, DONE
EXX
POP HL
EXX
POP HL ; RESTORE T1
CALL ADD32 ; HL'HL = T3 = T1 + T2
LD C, E
LD B, D
EXX
LD C, E
LD B, D ; BC = T2
EXX
LD E, L
LD D, H
EXX
LD E, L
LD D, H
EXX ; DE = T3
LD L, C
LD H, B
EXX
LD L, C
LD H, B ; HL = T2
EXX
JP FIBSUM
.FIBSUM_DONE POP HL
POP HL
POP HL
POP HL ; RESET STACK
JP $
SUM: DEFS 4 ; 32-BIT UNSIGNED INTEGER
; HL'HL = HL'HL + DE'DE
ADD32: ADD HL, DE
EXX
ADC HL, DE
EXX
RET
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment