Files
open-roms/src/basic/engine_variables/helper_array_create_mul.s
T

77 lines
1.6 KiB
ArmAsm

// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
// 16-bit multiplication, INDEX+0/+1 = __FAC1+0/+1 * __FAC1+2/+3; __FAC1+0/+1 = INDEX+0/+1
// uses INDEX+2/+3 (for helper routine) as work area
helper_array_create_mul: // preserves .X and .Y
phx_trash_a
// We will reuse 8x8 multiplication routine used by floating point operations
// __FAC1+0 (lo byte) * __FAC1+2 (lo byte)
lda __FAC1+0
sta INDEX+2
lda __FAC1+2
jsr mul_FAC2_FAC1_8x8 // this preserves .Y
sta INDEX+0 // result - lo byte
stx INDEX+1 // result - hi byte
// __FAC1+0 (lo byte) * __FAC1+3 (hi byte)
lda __FAC1+0
sta INDEX+2
lda __FAC1+3
jsr helper_array_create_mul_8x8_add // multiply and add to high byte of the result
// __FAC1+1 (hi byte) * __FAC1+2 (lo byte)
lda __FAC1+1
sta INDEX+2
lda __FAC1+2
jsr helper_array_create_mul_8x8_add // multiply and add to high byte of the result
// __FAC1+1 (hi byte) * __FAC1+3 (hi byte) has to be 0,
// otherwise the result would be out of range
// do not calculate
lda __FAC1+0
beq helper_array_create_mul_success
lda __FAC1+3
beq helper_array_create_mul_success
// FALLTROUGH
helper_array_create_mul_error:
jmp do_OUT_OF_MEMORY_error
helper_array_create_mul_success:
lda INDEX+0
sta __FAC1+0
lda INDEX+1
sta __FAC1+1
plx_trash_a
rts
helper_array_create_mul_8x8_add:
jsr mul_FAC2_FAC1_8x8
cpx #$00
bne helper_array_create_mul_error
clc
adc INDEX+1
bcs helper_array_create_mul_error
sta INDEX+1
rts