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

83 lines
1.5 KiB
ArmAsm

// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
assign_variable_TI_string:
// Evaluate the expression, check if the result is suitable
jsr FRMEVL
lda VALTYP
bpl_16 do_TYPE_MISMATCH_error // branch if not string
lda __FAC1+0
cmp #$06
bne_16 do_ILLEGAL_QUANTITY_error // we need exactly 6-character string
// Initialize new time counter, process all the digits
ldy #$00
sty INDEX+0
sty INDEX+1
sty INDEX+2
// FALLTROUGH
assign_variable_TI_string_loop:
// First fetch the digit
#if CONFIG_MEMORY_MODEL_60K
ldx #<(__FAC1 + 1)
jsr peek_under_roms
#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
jsr peek_under_roms_via_FAC1_PLUS_1
#else // CONFIG_MEMORY_MODEL_38K
lda (__FAC1 + 1), y
#endif
jsr convert_PETSCII_to_digit
bcs_16 do_ILLEGAL_QUANTITY_error
tax // move decoded digit to .X
// Strangely, original implementation seems to be very permissive,
// it accepts any digit at any position; for compatibility
// we should better follow this convention
assign_variable_TI_string_loop_digit:
cpx #$00
beq assign_variable_TI_string_loop_next
clc
lda table_TI_lo, y
adc INDEX+0
sta INDEX+0
lda table_TI_mid, y
adc INDEX+1
sta INDEX+1
lda table_TI_hi, y
adc INDEX+2
sta INDEX+2
dex
bpl assign_variable_TI_string_loop_digit // branch always
assign_variable_TI_string_loop_next:
iny
cpy #$06
bne assign_variable_TI_string_loop
// Set the resulting value
ldy INDEX+2
ldx INDEX+1
lda INDEX+0
jmp JSETTIM