Add subdirectories to engine/ similar to pokecrystal

This commit is contained in:
Rangi 2020-07-02 23:30:21 -04:00
parent 5559d51c86
commit f275790aec
124 changed files with 342 additions and 346 deletions

214
engine/math/bcd.asm Normal file
View file

@ -0,0 +1,214 @@
DivideBCDPredef::
DivideBCDPredef2::
DivideBCDPredef3::
DivideBCDPredef4::
call GetPredefRegisters
DivideBCD::
xor a
ld [hDivideBCDBuffer], a
ld [hDivideBCDBuffer+1], a
ld [hDivideBCDBuffer+2], a
ld d, $1
.mulBy10Loop
; multiply the divisor by 10 until the leading digit is nonzero
; to set up the standard long division algorithm
ld a, [hDivideBCDDivisor]
and $f0
jr nz, .next
inc d
ld a, [hDivideBCDDivisor]
swap a
and $f0
ld b, a
ld a, [hDivideBCDDivisor+1]
swap a
ld [hDivideBCDDivisor+1], a
and $f
or b
ld [hDivideBCDDivisor], a
ld a, [hDivideBCDDivisor+1]
and $f0
ld b, a
ld a, [hDivideBCDDivisor+2]
swap a
ld [hDivideBCDDivisor+2], a
and $f
or b
ld [hDivideBCDDivisor+1], a
ld a, [hDivideBCDDivisor+2]
and $f0
ld [hDivideBCDDivisor+2], a
jr .mulBy10Loop
.next
push de
push de
call DivideBCD_getNextDigit
pop de
ld a, b
swap a
and $f0
ld [hDivideBCDBuffer], a
dec d
jr z, .next2
push de
call DivideBCD_divDivisorBy10
call DivideBCD_getNextDigit
pop de
ld a, [hDivideBCDBuffer]
or b
ld [hDivideBCDBuffer], a
dec d
jr z, .next2
push de
call DivideBCD_divDivisorBy10
call DivideBCD_getNextDigit
pop de
ld a, b
swap a
and $f0
ld [hDivideBCDBuffer+1], a
dec d
jr z, .next2
push de
call DivideBCD_divDivisorBy10
call DivideBCD_getNextDigit
pop de
ld a, [hDivideBCDBuffer+1]
or b
ld [hDivideBCDBuffer+1], a
dec d
jr z, .next2
push de
call DivideBCD_divDivisorBy10
call DivideBCD_getNextDigit
pop de
ld a, b
swap a
and $f0
ld [hDivideBCDBuffer+2], a
dec d
jr z, .next2
push de
call DivideBCD_divDivisorBy10
call DivideBCD_getNextDigit
pop de
ld a, [hDivideBCDBuffer+2]
or b
ld [hDivideBCDBuffer+2], a
.next2
ld a, [hDivideBCDBuffer]
ld [hDivideBCDQuotient], a ; the same memory location as hDivideBCDDivisor
ld a, [hDivideBCDBuffer+1]
ld [hDivideBCDQuotient+1], a
ld a, [hDivideBCDBuffer+2]
ld [hDivideBCDQuotient+2], a
pop de
ld a, $6
sub d
and a
ret z
.divResultBy10loop
push af
call DivideBCD_divDivisorBy10
pop af
dec a
jr nz, .divResultBy10loop
ret
DivideBCD_divDivisorBy10:
ld a, [hDivideBCDDivisor+2]
swap a
and $f
ld b, a
ld a, [hDivideBCDDivisor+1]
swap a
ld [hDivideBCDDivisor+1], a
and $f0
or b
ld [hDivideBCDDivisor+2], a
ld a, [hDivideBCDDivisor+1]
and $f
ld b, a
ld a, [hDivideBCDDivisor]
swap a
ld [hDivideBCDDivisor], a
and $f0
or b
ld [hDivideBCDDivisor+1], a
ld a, [hDivideBCDDivisor]
and $f
ld [hDivideBCDDivisor], a
ret
DivideBCD_getNextDigit:
ld bc, $3
.loop
ld de, hMoney ; the dividend
ld hl, hDivideBCDDivisor
push bc
call StringCmp
pop bc
ret c
inc b
ld de, hMoney+2 ; since SubBCD works starting from the least significant digit
ld hl, hDivideBCDDivisor+2
push bc
call SubBCD
pop bc
jr .loop
AddBCDPredef::
call GetPredefRegisters
AddBCD::
and a
ld b, c
.add
ld a, [de]
adc [hl]
daa
ld [de], a
dec de
dec hl
dec c
jr nz, .add
jr nc, .done
ld a, $99
inc de
.fill
ld [de], a
inc de
dec b
jr nz, .fill
.done
ret
SubBCDPredef::
call GetPredefRegisters
SubBCD::
and a
ld b, c
.sub
ld a, [de]
sbc [hl]
daa
ld [de], a
dec de
dec hl
dec c
jr nz, .sub
jr nc, .done
ld a, $00
inc de
.fill
ld [de], a
inc de
dec b
jr nz, .fill
scf
.done
ret

143
engine/math/multiply_divide.asm Executable file
View file

@ -0,0 +1,143 @@
_Multiply::
ld a, $8
ld b, a
xor a
ld [H_PRODUCT], a
ld [H_MULTIPLYBUFFER], a
ld [H_MULTIPLYBUFFER+1], a
ld [H_MULTIPLYBUFFER+2], a
ld [H_MULTIPLYBUFFER+3], a
.loop
ld a, [H_MULTIPLIER]
srl a
ld [H_MULTIPLIER], a ; (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
jr nc, .smallMultiplier
ld a, [H_MULTIPLYBUFFER+3]
ld c, a
ld a, [H_MULTIPLICAND+2]
add c
ld [H_MULTIPLYBUFFER+3], a
ld a, [H_MULTIPLYBUFFER+2]
ld c, a
ld a, [H_MULTIPLICAND+1]
adc c
ld [H_MULTIPLYBUFFER+2], a
ld a, [H_MULTIPLYBUFFER+1]
ld c, a
ld a, [H_MULTIPLICAND] ; (aliases: H_MULTIPLICAND)
adc c
ld [H_MULTIPLYBUFFER+1], a
ld a, [H_MULTIPLYBUFFER]
ld c, a
ld a, [H_PRODUCT] ; (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
adc c
ld [H_MULTIPLYBUFFER], a
.smallMultiplier
dec b
jr z, .done
ld a, [H_MULTIPLICAND+2]
sla a
ld [H_MULTIPLICAND+2], a
ld a, [H_MULTIPLICAND+1]
rl a
ld [H_MULTIPLICAND+1], a
ld a, [H_MULTIPLICAND]
rl a
ld [H_MULTIPLICAND], a
ld a, [H_PRODUCT]
rl a
ld [H_PRODUCT], a
jr .loop
.done
ld a, [H_MULTIPLYBUFFER+3]
ld [H_PRODUCT+3], a
ld a, [H_MULTIPLYBUFFER+2]
ld [H_PRODUCT+2], a
ld a, [H_MULTIPLYBUFFER+1]
ld [H_PRODUCT+1], a
ld a, [H_MULTIPLYBUFFER]
ld [H_PRODUCT], a
ret
_Divide::
xor a
ld [H_DIVIDEBUFFER], a
ld [H_DIVIDEBUFFER+1], a
ld [H_DIVIDEBUFFER+2], a
ld [H_DIVIDEBUFFER+3], a
ld [H_DIVIDEBUFFER+4], a
ld a, $9
ld e, a
.asm_37db3
ld a, [H_DIVIDEBUFFER]
ld c, a
ld a, [H_DIVIDEND+1] ; (aliases: H_MULTIPLICAND)
sub c
ld d, a
ld a, [H_DIVISOR] ; (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
ld c, a
ld a, [H_DIVIDEND] ; (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
sbc c
jr c, .asm_37dce
ld [H_DIVIDEND], a ; (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
ld a, d
ld [H_DIVIDEND+1], a ; (aliases: H_MULTIPLICAND)
ld a, [H_DIVIDEBUFFER+4]
inc a
ld [H_DIVIDEBUFFER+4], a
jr .asm_37db3
.asm_37dce
ld a, b
cp $1
jr z, .asm_37e18
ld a, [H_DIVIDEBUFFER+4]
sla a
ld [H_DIVIDEBUFFER+4], a
ld a, [H_DIVIDEBUFFER+3]
rl a
ld [H_DIVIDEBUFFER+3], a
ld a, [H_DIVIDEBUFFER+2]
rl a
ld [H_DIVIDEBUFFER+2], a
ld a, [H_DIVIDEBUFFER+1]
rl a
ld [H_DIVIDEBUFFER+1], a
dec e
jr nz, .asm_37e04
ld a, $8
ld e, a
ld a, [H_DIVIDEBUFFER]
ld [H_DIVISOR], a ; (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
xor a
ld [H_DIVIDEBUFFER], a
ld a, [H_DIVIDEND+1] ; (aliases: H_MULTIPLICAND)
ld [H_DIVIDEND], a ; (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
ld a, [H_DIVIDEND+2]
ld [H_DIVIDEND+1], a ; (aliases: H_MULTIPLICAND)
ld a, [H_DIVIDEND+3]
ld [H_DIVIDEND+2], a
.asm_37e04
ld a, e
cp $1
jr nz, .asm_37e0a
dec b
.asm_37e0a
ld a, [H_DIVISOR] ; (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
srl a
ld [H_DIVISOR], a ; (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
ld a, [H_DIVIDEBUFFER]
rr a
ld [H_DIVIDEBUFFER], a
jr .asm_37db3
.asm_37e18
ld a, [H_DIVIDEND+1] ; (aliases: H_MULTIPLICAND)
ld [H_REMAINDER], a ; (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
ld a, [H_DIVIDEBUFFER+4]
ld [H_QUOTIENT+3], a
ld a, [H_DIVIDEBUFFER+3]
ld [H_QUOTIENT+2], a
ld a, [H_DIVIDEBUFFER+2]
ld [H_QUOTIENT+1], a ; (aliases: H_MULTIPLICAND)
ld a, [H_DIVIDEBUFFER+1]
ld [H_DIVIDEND], a ; (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
ret

13
engine/math/random.asm Executable file
View file

@ -0,0 +1,13 @@
Random_::
; Generate a random 16-bit value.
ld a, [rDIV]
ld b, a
ld a, [hRandomAdd]
adc b
ld [hRandomAdd], a
ld a, [rDIV]
ld b, a
ld a, [hRandomSub]
sbc b
ld [hRandomSub], a
ret