From 48eec7d56e8bc6ccd9a1a5b1aa9503a0c4574d0a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 6 Jun 2020 19:16:54 +0200 Subject: [PATCH] first step towards string expression evaluation --- c64/aliases/,aliases_ram_lowmem.s | 2 +- c64/basic/,stubs/ad9e.frmevl.s | 10 ----- c64/basic/commands/cmd_print.s | 50 ++++++++++++++++++++++- c64/basic/engine/ad9e.frmevl.s | 40 ++++++++++++++++++ c64/basic/{,stubs => engine}/ad9e.interop | 0 5 files changed, 89 insertions(+), 13 deletions(-) delete mode 100644 c64/basic/,stubs/ad9e.frmevl.s create mode 100644 c64/basic/engine/ad9e.frmevl.s rename c64/basic/{,stubs => engine}/ad9e.interop (100%) diff --git a/c64/aliases/,aliases_ram_lowmem.s b/c64/aliases/,aliases_ram_lowmem.s index 2f1cbb06..acb718d5 100644 --- a/c64/aliases/,aliases_ram_lowmem.s +++ b/c64/aliases/,aliases_ram_lowmem.s @@ -20,7 +20,7 @@ .label VERCKB = $0A // flag used by BASIC, 0 - LOAD, 1 - VERIFY .label COUNT = $0B // [!] our implementation might be different XXX give more details .label DIMFLG = $0C // [!] our implementation might be different XXX give more details - .label VALTYP = $0D // -- NOT IMPLEMENTED -- + .label VALTYP = $0D // expression eveluation result; $00 - float, $FF - string .label INTFLG = $0E // -- NOT IMPLEMENTED -- .label GARBFL = $0F // [!] our implementation might be different XXX give more details .label SUBFLG = $10 // -- NOT IMPLEMENTED -- diff --git a/c64/basic/,stubs/ad9e.frmevl.s b/c64/basic/,stubs/ad9e.frmevl.s deleted file mode 100644 index 46f275ed..00000000 --- a/c64/basic/,stubs/ad9e.frmevl.s +++ /dev/null @@ -1,10 +0,0 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE - - -// XXX provide documentation and implementation - -FRMEVL: - STUB_IMPLEMENTATION() diff --git a/c64/basic/commands/cmd_print.s b/c64/basic/commands/cmd_print.s index 85bf7d96..d9fd8b16 100644 --- a/c64/basic/commands/cmd_print.s +++ b/c64/basic/commands/cmd_print.s @@ -6,8 +6,50 @@ cmd_print: - // XXX print an argument here + // First check if we have anything to print + jsr end_of_statement_check + bcs cmd_print_new_line + + cmp #$3B // semicolon + beq cmd_print_done + + jsr unconsume_character + + // FALLTROUGH + +cmd_print_loop: + + // Now evaluate the expression + + jsr FRMEVL + lda VALTYP + bpl cmd_print_float + + // FALLTROUGH + +cmd_print_string: + + // Print a string value + + ldy #$00 +!: + cpy __FAC1 + 0 + beq cmd_print_next_arg + + lda (__FAC1 + 1), y // XXX read from under ROM + jsr JCHROUT + iny + jmp !- + +cmd_print_float: + + // XXX probably we should also check INTFLG here + // XXX + + // FALLTROUGH + +cmd_print_next_arg: // Look for the next argument @@ -16,10 +58,14 @@ cmd_print: jsr fetch_character cmp #$2C // comma - beq cmd_print + beq cmd_print_loop cmp #$3B // semicolon beq cmd_print_done + // Something unexpected + + jmp do_SYNTAX_error + cmd_print_new_line: jsr print_return diff --git a/c64/basic/engine/ad9e.frmevl.s b/c64/basic/engine/ad9e.frmevl.s new file mode 100644 index 00000000..be7fb23b --- /dev/null +++ b/c64/basic/engine/ad9e.frmevl.s @@ -0,0 +1,40 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000 +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + + +// Well-known BASIC routine, described in: +// +// - [CM64] Computes Mapping the Commodore 64 - page 102 +// - https://sta.c64.org/cbm64basconv.html +// +// Output: +// - VALTYP - $00 = floating number, $FF = string +// - INTFLG (XXX float/integer, probably) +// - for float: FAC1 +// - for string: __FAC1 + 0 = length, __FAC1 + 1 = pointer to string + +// XXX provide documentation and implementation + +FRMEVL: + + // XXX for now we just report dummy string + + lda #$FF + sta VALTYP + + lda #$0B + sta __FAC1 + 0 + + lda #dummy_text + sta __FAC1 + 2 + + rts + +dummy_text: + + .text "LOREM IPSUM" diff --git a/c64/basic/,stubs/ad9e.interop b/c64/basic/engine/ad9e.interop similarity index 100% rename from c64/basic/,stubs/ad9e.interop rename to c64/basic/engine/ad9e.interop