added support for unary operators

This commit is contained in:
FeralChild64 committed 2020-06-07 16:32:45 +02:00
1 parent ea235af997
commit 345f966ef3
2 files changed
+68 -16

No files matched your search

+1 -1
View File
@@ -283,7 +283,7 @@ Not all of them - only these we want to have implemented.
| `$A68E` | `RUNC` | DONE | |
| `$A7AE` | `NEWSTT` | PARTIAL | redirected to RUN command |
| `$AB1E` | `STROUT` | DONE | |
| `$AD9E` | `FRMEVL` | NOT DONE | |
| `$AD9E` | `FRMEVL` | PARTIAL | |
| `$BDCD` | `LINPRT` | DONE | temporary implementation |
| `$E3BF` | `INIT` | NOT DONE | |
| `$E422` | `INITMSG` | DONE | |
+67 -15
View File
@@ -43,37 +43,81 @@ FRMEVL:
FRMEVL_loop:
// Check if end of statement
// At this point there are 4 valid possibilities:
// - a string, a float, pi, or a variable (in short: a value to fetch)
// - a token (whichj means function to execute)
// - an unary operator
// - an opening bracket
// Check if end of statement, fetch the character
jsr end_of_statement_check
bcs_16 do_SYNTAX_error
// There are 4 basic possibilities: a string, a float, an opening bracket, or a token
jsr fetch_character
// Check for a string or opening bracket
cmp #$22 // check for opening quote
beq FRMEVL_fetch_string
cmp #$28 // check for opening bracket
beq FRMEVL_handle_bracket
cmp #$7F // check for a token
bcc FRMEVL_fetch_float
// Search for a value or unary operator, starting from the most probable
// XXX check all other operators
// Check for unary operators
cmp #$AB // check for unary minus
beq_16 do_NOT_IMPLEMENTED_error // XXX
beq_16 FRMEVL_unary_minus
cmp #$A8 // check for NOT
beq_16 do_NOT_IMPLEMENTED_error // XXX
beq_16 FRMEVL_unary_not
// Check for the PI
cmp #$FF // check for PI
beq_16 do_NOT_IMPLEMENTED_error // XXX
cmp #$AA // check for unary plus (ignore this one)
beq FRMEVL_loop
beq_16 FRMEVL_fetch_PI // XXX
// If not a PI and not an unary operator, than everything above
// $7F has to be a function
cmp #$80 // check for a token
bcc FRMEVL_execute_function
// There are 2 possibilities left - a floating point value or a variable
// XXX implement this part
// Nothing recognized
jmp do_SYNTAX_error
//
// This subroutine handles the situation when we have to execute a BASIC function
// in place when parser normally expects a value
//
FRMEVL_execute_function:
// XXX implement this
jmp do_NOT_IMPLEMENTED_error
//
// These two subroutines handles the situation when we got an unary operator
// in place when parser normally expects a value
//
FRMEVL_unary_not:
ldy #$0D // our code for unary NOT
skip_2_bytes_trash_nvz
// FALLTROUGH
FRMEVL_unary_minus:
ldy #$0E // our code for unary NOT
jmp FRMEVL_push_operator_address
//
// This subroutine handle brackets - it just calls FRMEVL recursively
// and consumes the closing bracket afterwards
@@ -88,6 +132,16 @@ FRMEVL_handle_bracket:
jmp do_SYNTAX_error
//
// This subroutine handles the situation when our value to fetch is PI
//
FRMEVL_fetch_PI:
// XXX implement this
jmp do_NOT_IMPLEMENTED_error
//
// This subroutine fetches the floating point value from the 'outside world'
//
@@ -204,8 +258,6 @@ FRMEVL_push_operator_address:
// Push the operator address to stack, in a form
// suitable for RTS
// XXX add support for other operators, use .Y
lda operator_jumptable_hi, y
pha
lda operator_jumptable_lo, y