From b7dee84390a08a1ebf2c19b58311ac0b33490768 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 26 Jul 2020 22:03:06 +0200 Subject: [PATCH] added memory checks and some other bits to array creation routine --- src/basic/engine_variables/array_create.s | 102 ++++++++++-------- .../helper_array_create_checkmem.s | 62 +++++++++++ .../helper_array_create_mul.s | 32 +++--- 3 files changed, 133 insertions(+), 63 deletions(-) create mode 100644 src/basic/engine_variables/helper_array_create_checkmem.s diff --git a/src/basic/engine_variables/array_create.s b/src/basic/engine_variables/array_create.s index d63106e9..46026364 100644 --- a/src/basic/engine_variables/array_create.s +++ b/src/basic/engine_variables/array_create.s @@ -88,14 +88,21 @@ array_create_store_dims: phx_trash_a jsr varstr_garbage_collect - // __FAC1+0/+1 will be used to calculate number of elements + // __FAC1+1/+2 will be used to calculate number of elements ldy #$01 - sty __FAC1+0 - dey sty __FAC1+1 + dey + sty __FAC1+2 - // Create the initial array structure (format checked by creating arrays with original ROM) + // Check if there is enough free memory for the header + + pla // .A - number of dimensions + sta __FAC1+0 + jsr helper_array_create_checkmem + lda __FAC1+0 + + // Create the initial array structure (header) - format checked by creating arrays with original ROM // Bytes 0/1 - array name, but we can not fetch it easily now, so skip it for now // Bytes 2/3 - offset to the next array, skip it for now too @@ -103,13 +110,15 @@ array_create_store_dims: // Bytes 5+ - max index in each dimension (big endian!), this will be set in a loop ldy #$04 - pla #if CONFIG_MEMORY_MODEL_60K - // XXX - // XXX: implement this - // XXX + stx INDEX+2 + + ldx # 0, then we certainly have enough space + + lda INDEX+3 + bne helper_array_create_checkmem_success + + // We have very little memory left - we need at least number of dimensions*2 + 5 bytes + + lda __FAC1+0 + asl + clc + adc #$04 + + cmp INDEX+2 + bcs helper_array_create_checkmem_fail + + // FALLTROUGH + +helper_array_create_checkmem_success: + + rts + +helper_array_create_checkmem_fail: + + jmp do_OUT_OF_MEMORY_error diff --git a/src/basic/engine_variables/helper_array_create_mul.s b/src/basic/engine_variables/helper_array_create_mul.s index 1d42e218..b0424f44 100644 --- a/src/basic/engine_variables/helper_array_create_mul.s +++ b/src/basic/engine_variables/helper_array_create_mul.s @@ -2,7 +2,7 @@ // #LAYOUT# * BASIC_0 #TAKE // #LAYOUT# * * #IGNORE -// 16-bit multiplication, INDEX+0/+1 = __FAC1+0/+1 * __FAC1+2/+3; __FAC1+0/+1 = INDEX+0/+1 +// 16-bit multiplication, INDEX+0/+1 = __FAC1+1/+2 * __FAC1+3/+4; __FAC1+1/+2 = INDEX+0/+1 // uses INDEX+2/+3 (for helper routine) as work area @@ -12,37 +12,37 @@ helper_array_create_mul: // preserves .X and .Y // We will reuse 8x8 multiplication routine used by floating point operations - // __FAC1+0 (lo byte) * __FAC1+2 (lo byte) + // __FAC1+1 (lo byte) * __FAC1+3 (lo byte) - lda __FAC1+0 + lda __FAC1+1 sta INDEX+2 - lda __FAC1+2 + lda __FAC1+3 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) + // __FAC1+1 (lo byte) * __FAC1+4 (hi byte) lda __FAC1+1 sta INDEX+2 - lda __FAC1+2 + lda __FAC1+4 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, + // __FAC1+2 (hi byte) * __FAC1+3 (lo byte) + + lda __FAC1+2 + sta INDEX+2 + lda __FAC1+3 + jsr helper_array_create_mul_8x8_add // multiply and add to high byte of the result + + // __FAC1+2 (hi byte) * __FAC1+4 (hi byte) has to be 0, // otherwise the result would be out of range // do not calculate - lda __FAC1+0 + lda __FAC1+2 beq helper_array_create_mul_success - lda __FAC1+3 + lda __FAC1+4 beq helper_array_create_mul_success // FALLTROUGH