view src/keywords.s @ 125:0607e4e20702

Correct offset error for keyword table lookup
author William Astle <lost@l-w.ca>
date Sun, 07 Jan 2024 20:35:51 -0700
parents eb2681108660
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