83 lines
1.5 KiB
ArmAsm
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
|