Here's a routine to expand MSX-BASIC with new commands. It uses the ROM cartridge method to add new commands via CALL statement.
.BIOS
.PAGE 1
CSRY equ $F3DC
MNROM equ $FCC1
PROCNM equ $FD89
; standar ROM header with STATEMENT call defined
DEFB $41,$42
DEFW 0
DEFW STATEMENT
DEFW 0
DEFW 0
DEFS 6
STATEMENT:	push hl ; preserves current pointer to command text buffer
		ld ix,CMDTAB
		ld bc,4
@@STLOOP:	ld l,[ix+0] ; loads in HL the string address of the keyword to be compared with PROCNM buffer
		ld a,[ix+1]
		or a
		jp z,SYNTAXERR ; if zero, we've reached end of list, so keyword hasn't been recognized = SYNTAX ERROR
		ld h,a
		ld de,PROCNM
		call MEMCMP ; both strings are compared
		jr nz,@@NOMATCH
		pop hl ; they are equal, so
		ld e,[ix+2]
		ld d,[ix+3]
		push de
		pop ix ; we must load in IX the address of the new command implementation and
		jp [ix] ; jump into...
@@NOMATCH:	add ix,bc ; no match, we need to compare with the next keyword stored in table
		jr @@STLOOP
SYNTAXERR:	pop hl ; generate a SYNTAX ERROR
		xor a
		ccf  ; carry flag=1
		ret
MEMCMP:		ld a,[de] ; compare two strings in HL & DE
		cp [hl]
		ret nz
		or a
		inc hl
		inc de
		jr nz,MEMCMP
		ret
;
; Command/keywords implementation starts here
; DE=text address next to the expansion statement name
;
; Command 1: fills screen (mode 0) with a specified character
CMD1CODE:
		push hl  ; IMPORTANT!! we must to preserve HL
		ld a,[hl]
		cp $28 ; looks for (
		jp nz,SYNTAXERR
		inc hl
		ld a,[hl]
		cp $22 ; looks for "
		jp nz,SYNTAXERR
		inc hl
		ld b,[hl] ; load parameter
		inc hl
		ld a,[hl]
		cp $22 ; looks for "
		jp nz,SYNTAXERR
		inc hl
		ld a,[hl]
		cp $29 ; looks for )
		jp nz,SYNTAXERR
LOOP3:		inc hl
		ld a,[hl]
		cp $20 ; eat blanks
		jr z,LOOP3
		or a ; ends with zero?
		jr z,DOCMD1
		cp $3A ; ends with :?
		jp nz,SYNTAXERR
DOCMD1:
		push hl
		ld hl,0
		ld a,b
		ld bc,$800
		call FILVRM
		pop hl
		pop bc
		xor a  ; carry flag=0
		ret
; Command 2 : prints version!
CMD2CODE:
		push hl ; IMPORTANT!!, we must to keep HL
		ld a,[CSRY]
		ld l,a
		ld h,1
		call POSIT
		ld hl,MSG
@@PRNTLOOP:	ld a,[hl]
		or a
		jr z,@@PRNTEND
		call CHPUT
		inc hl
		jr @@PRNTLOOP
@@PRNTEND:	pop hl
		ret
MSG: DT "EXTENDED BASIC v0.1",0
; Command Table : Address of the keyword literal, Address of the command implementation
CMDTAB: DEFW CMD1,CMD1CODE
DEFW CMD2,CMD2CODE
DEFW 0 ; table ends with 0
CMD1: DT "FILLSCREEN",0
CMD2: DT "VERSION",0
DUMMY1: DEFS 7989
DUMMY2: DEFB 0
How to use :
1) Copy+paste
2) Compile and rename the resulting file as a .ROM
3) Load the file & execute it. The BASIC expansion will be installed
New commands added as example (both useless 

 ):
- CALL VERSION ( or _VERSION )
Prints the version 
 
 
- CALL FILLSCREEN("character") ( or _FILLSCREEN )
Fills screen 0 name table with "character".
NOTE: I've not tested yet in a real MSX. I'm not sure right now about step 3; it could differs between emulators and the real thing.