view src/keywords.s @ 76:eb2681108660

Split some code into separate files for easier management (4) Because the source for lwbasic is so large, split it into several different files to make it easier to navigate and modify. This is part four of the split.
author William Astle <lost@l-w.ca>
date Sun, 06 Aug 2023 00:51:22 -0600
parents
children
line wrap: on
line source

                *pragmapush list
                *pragma list
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Keyword dictionaries and jump tables. These are defined by several macros which ensure that each command or function
; entry has an associated jump table entry. These macros are:
;
;               defcmd string,symbase
;               deffunc string,symbase,flags
;               cmdtab
;               functab
;               cmdjump
;               funcjump
; defcmd and deffunc will add an entry into the relevant dictionary table as well as adding one to the relevant jump
; tables. The cmdtab, functab, cmdjump, and funcjump will output the table definitions.
                *pragmapush list
                *pragma nolist
__cmdnum        set 0x80
__funcnum       set 0x80
defcmd          macro noexpand
                setstr __cmdtab="%(__cmdtab)\tfcs {1}\n"
                ifstr ne,"{3}",""
                setstr __cmdjump="%(__cmdjump)\tfdb {3}\n"
                else
                setstr __cmdjump="%(__cmdjump)\tfdb cmd_{2}\n"
                endc
tok_{2}         equ __cmdnum
__cmdnum        set __cmdnum+1
                endm
deffunc         macro noexpand
                setstr __functab="%(__functab)\tfcs {1}\n"
                ifstr ne,"{4}",""
                setstr __funcjump="%(__funcjump)\tfcb {3}\n\tfdb {4}\n"
                else
                setstr __funcjump="%(__funcjump)\tfcb {3}\n\tfdb func_{2}\n"
                endc
tok_{2}         equ __funcnum
__funcnum       set __funcnum+1
                endm
cmdtab          macro
                *pragmapush list
                *pragma nolist
                includestr "%(__cmdtab)"
                *pragmapop list
                fcb 0                           ; flag end of table
                endm
functab         macro
                *pragmapush list
                *pragma nolist
                includestr "%(__functab)"
                *pragmapop list
                fcb 0                           ; flag end of table
                endm
cmdjump         macro
                *pragmapush nolist
                *pragma nolist
                includestr "%(__cmdjump)"
                *pragmapop list
                endm
funcjump        macro
                *pragmapush nolist
                *pragma nolist
                includestr "%(__funcjump)"
                *pragmapop list
                endm
                *pragmapop list
                defcmd 'REM',rem
                defcmd /'/,apos
                defcmd 'DATA',data
                defcmd 'ELSE',else
                defcmd 'END',end
                defcmd 'STOP',stop
                defcmd 'LET',let
                defcmd 'NEW',new
                defcmd 'PRINT',print
                defcmd 'LIST',list
                defcmd 'RUN',run
                defcmd 'GOTO',goto
                defcmd 'GOSUB',gosub
                defcmd 'RETURN',return
                defcmd 'POP',pop
                defcmd '+',plus,SNERROR         ; IMPORTANT: the operators from + to OR MUST stay in this exact sequence
                defcmd '-',minus,SNERROR        ; with no gaps because a secondary lookup table is used for operator
                defcmd '*',times,SNERROR        ; handling during binary operator handling.
                defcmd '/',divide,SNERROR
                defcmd '^',power,SNERROR
                defcmd '<',less,SNERROR
                defcmd '>',greater,SNERROR
                defcmd '=',equal,SNERROR
                defcmd '<=',lessequal,SNERROR
                defcmd '>=',greaterequal,SNERROR
                defcmd '<>',notequal,SNERROR
                defcmd 'AND',and,SNERROR
                defcmd 'OR',or,SNERROR
                defcmd 'NOT',not,SNERROR
primarydict     cmdtab
secondarydict   functab
primaryjump     cmdjump
secondaryjump   funcjump
                *pragmapop list