added support for unary operators
This commit is contained in:
1 parent
ea235af997
commit
345f966ef3
2 files changed
+68
-16
No files matched your search
@@ -283,7 +283,7 @@ Not all of them - only these we want to have implemented.
|
|||||||
| `$A68E` | `RUNC` | DONE | |
|
| `$A68E` | `RUNC` | DONE | |
|
||||||
| `$A7AE` | `NEWSTT` | PARTIAL | redirected to RUN command |
|
| `$A7AE` | `NEWSTT` | PARTIAL | redirected to RUN command |
|
||||||
| `$AB1E` | `STROUT` | DONE | |
|
| `$AB1E` | `STROUT` | DONE | |
|
||||||
| `$AD9E` | `FRMEVL` | NOT DONE | |
|
| `$AD9E` | `FRMEVL` | PARTIAL | |
|
||||||
| `$BDCD` | `LINPRT` | DONE | temporary implementation |
|
| `$BDCD` | `LINPRT` | DONE | temporary implementation |
|
||||||
| `$E3BF` | `INIT` | NOT DONE | |
|
| `$E3BF` | `INIT` | NOT DONE | |
|
||||||
| `$E422` | `INITMSG` | DONE | |
|
| `$E422` | `INITMSG` | DONE | |
|
||||||
|
|||||||
@@ -43,37 +43,81 @@ FRMEVL:
|
|||||||
|
|
||||||
FRMEVL_loop:
|
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
|
jsr end_of_statement_check
|
||||||
bcs_16 do_SYNTAX_error
|
bcs_16 do_SYNTAX_error
|
||||||
|
|
||||||
// There are 4 basic possibilities: a string, a float, an opening bracket, or a token
|
|
||||||
|
|
||||||
jsr fetch_character
|
jsr fetch_character
|
||||||
|
|
||||||
|
// Check for a string or opening bracket
|
||||||
|
|
||||||
cmp #$22 // check for opening quote
|
cmp #$22 // check for opening quote
|
||||||
beq FRMEVL_fetch_string
|
beq FRMEVL_fetch_string
|
||||||
cmp #$28 // check for opening bracket
|
cmp #$28 // check for opening bracket
|
||||||
beq FRMEVL_handle_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
|
// Check for unary operators
|
||||||
// XXX check all other operators
|
|
||||||
|
|
||||||
cmp #$AB // check for unary minus
|
cmp #$AB // check for unary minus
|
||||||
beq_16 do_NOT_IMPLEMENTED_error // XXX
|
beq_16 FRMEVL_unary_minus
|
||||||
cmp #$A8 // check for NOT
|
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
|
cmp #$FF // check for PI
|
||||||
beq_16 do_NOT_IMPLEMENTED_error // XXX
|
beq_16 FRMEVL_fetch_PI // XXX
|
||||||
cmp #$AA // check for unary plus (ignore this one)
|
|
||||||
beq FRMEVL_loop
|
// 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
|
// Nothing recognized
|
||||||
|
|
||||||
jmp do_SYNTAX_error
|
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
|
// This subroutine handle brackets - it just calls FRMEVL recursively
|
||||||
// and consumes the closing bracket afterwards
|
// and consumes the closing bracket afterwards
|
||||||
@@ -88,6 +132,16 @@ FRMEVL_handle_bracket:
|
|||||||
|
|
||||||
jmp do_SYNTAX_error
|
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'
|
// 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
|
// Push the operator address to stack, in a form
|
||||||
// suitable for RTS
|
// suitable for RTS
|
||||||
|
|
||||||
// XXX add support for other operators, use .Y
|
|
||||||
|
|
||||||
lda operator_jumptable_hi, y
|
lda operator_jumptable_hi, y
|
||||||
pha
|
pha
|
||||||
lda operator_jumptable_lo, y
|
lda operator_jumptable_lo, y
|
||||||
|
|||||||
Reference in new issue
Block a user