⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basiclb2.asm

📁 在单片机内嵌BASIC语言解释程序的完整代码
💻 ASM
字号:
*        title    BASICLB2
*        page
*
*
*<><><><><><> NOTE: FUNCTION PERFORMED IN "XLATE" <><><><><><>
*
*/***** xmideol() *****/
*
*xmideol()
*{
* *tbufptr++=MEOLTOK;
* ++ibufptr;
* return;
*}
*
*
*
*/****** common code for GOSUB and GOTO *****/
*
*xgo(gotok)
*char gotok;
*{
* int num;
* *tbufptr++=gotok;      /* put GOTO or GOSUB token in buffer */
* blanks();              /* skip blanks before line number */
* *tbufptr++=LCONTOK;    /* put line number constant token in buffer */
* num=getlinum();        /* get line number */
* if(num==0) errcode=LINENERR;   /* if 0, line number error */
* if(errcode) return;    /* if error, return */
* putint(num);           /* put line number in buffer */
* return;
*}
*
XGOSUB:	EQU    *
XGOTO:	EQU    *
*        JSR    BLANKS
	LDAA   #LCONTOK
	BSR    PUTTOK
	JSR    GETLINUM
XGOTO2:	BRA    PUTDTOK
*
*
*<><><><><><> ROUTINE NOT NEEDED <><><><><><>
*
*/***** GOSUB *****/
*
*xgosub()
*{
* xgo(GOSUBTOK);
* return;
*}
*
*
*<><><><><><> ROUTINE NOT NEEDED <><><><><><>
*
*/***** GOTO *****/
*
*xgoto()
*{
* xgo(GOTOTOK);
* return;
*}
	
*/***** RETURN *****/
*
*xreturn()
*{
* *tbufptr++=RETNTOK;    /* put RETURN token in buffer */
* return;
*}
*
*/***** STOP *****/
*
*xstop()
*{
* *tbufptr++=STOPTOK;    /* put STOP token in buffer */
* return;
*}
*
*/***** END *****/
*
*xend()
*{
* *tbufptr++=ENDTOK;     /* put end token in buffer */
* return;
*}
*
*/***** TRON *****/
*
*xtron()
*{
* *tbufptr++=TRONTOK;    /* put TRON token in buffer */
* return;
*}
*
*/***** TROFF *****/
*
*xtroff()
*{
* *tbufptr++=TROFFTOK;   /* put TROFF token in buffer */
* return;
*}
*
XRETURN:	EQU    *
XSTOP:	EQU    *
XEND:	EQU    *
XTRON:	EQU    *
XTROFF:	EQU    *
XRESTORE:	EQU    *
XENDWH:	EQU    *
XRETI:	EQU    *
XSLEEP:	EQU    *
XRTIME:	EQU    *
	RTS                ; NULL FUNCTIONS BECAUSE TOKEN PLACEMENT IS DONE IN
*                            ; XLATE FUNCTION.
*
	
*/***** REM *****/
*
*xrem()
*{
* char c;
* *tbufptr++=REMTOK;     /* put rem token in buffer */
* while(1)
* {
*  if((c=*ibufptr)==EOL) break;
*  *tbufptr++=c;
*  ++ibufptr;
* }
* return;
*}
*
*
*/***** xdata() *****/
*
*xdata()
*{
* char c;
* *tbufptr++=DATATOK;            /* put DATA token in buffer */
* while((c=*ibufptr)!=EOL)
* {
*  if(c==',') *tbufptr++=COMMATOK;
*  else *tbufptr++=c;
*  ++ibufptr;
* }
* return;
*}
*
XDATA:	EQU    *
XREM:	EQU    *
	LDX    TBUFPTR      ; GET POINTER TO TOKEN BUFFER.
	PSHX                ; SAVE IT. (POINTER TO LENGTH OF REM OR DATA)
	LDAA   #0           ; SAVE A BYTE FOR THE LENGTH.
	BSR    PUTTOK
	LDAB   #2           ; INITALIZE LENGTH  TO 2 (INCLUDES LENGTH & EOL.
XREM1:	BSR    GETCHR
	CMPA   #EOL
	BEQ    XREM2
	BSR    PUTTOK
	BSR    INCIBP
	INCB                ; UP THE BYTE COUNT.
	BRA    XREM1
XREM2:	BSR    PUTTOK
	PULX                ; GET POINTER TO LENGTH BYTE.
	STAB   0,X          ; PUT IT IN THE TOKEN BUFFER.
	RTS
*
*
XPORTA:	EQU    *
XPORTB:	EQU    *
XPORTC:	EQU    *
XPORTD:	EQU    *
	LDAB   #NUM         ; WE'RE XLATING A NUMERICAL STATEMENT.
	BRA    ASIGNMT1     ; GO DO IT LIKE AN ASIGNMENT STATEMENT.
*
*
*
*
	
*/***** LET *****/
*
*xlet()
*{
* letcom(LETTOK);                /* pass LET token to common code */
* return;
*}
*
*/***** implied LET *****/
*
*ximplet()
*{
* letcom(IMLETTOK);
* return;
*}
*
*/***** common code for explicit & implicit LET *****/
*
*letcom(letok)
*short letok;
*{
* *tbufptr++=letok;              /* put LET token in buffer */
* blanks();              /* skip blanks before assignment statement */
* if(ibufptr=='@') { *tbufptr++=INDIRTOK; ++ibufptr; }
* asignmt();                     /* evaluate expression */
* return;
*}
*
XLET:	EQU    *
XIMPLET:	EQU    *
*        JSR    BLANKS
*XLET1    JMP    ASIGNMT
*
*
	
*/***** asignmt() *****/
*
*asignmt()
*{
*short type;
* if((type=getvar())==0) return; /* get variable & return type */
* if(errcode) return;
* if(*ibufptr++!='=') { errcode=IVEXPERR; return; } /* invalid expression */
* *tbufptr++=EQUALTOK;           /* put equals token in buffer */
* xexpres(type);                 /* build expression in token buffer */
* return;
*}
*
ASIGNMT:	EQU    *
	JSR    GETVAR
	TAB
ASIGNMT1:	BSR    GETNXCHR
	CMPA   #'='
	BEQ    ASIGNMT2
	LDAA   #IVEXPERR
	JMP    RPTERR
ASIGNMT2:	LDAA   #EQUALTOK
	BSR    PUTTOK
	TBA
*                               FALL THROUGH TO XEXPRES.
*
*
	
*/***** xexpres() *****/
*
*xexpres(type)
*short type;
*{
* char c;
* while(1)
* {
*  if(match("-")) *tbufptr++=NEGTOK;
*  else if(match("@")) *tbufptr++=INDIRTOK;
*  else if(match("NOT")) *tbufptr++=NOTTOK;
XEXPRES:	EQU    *
	PSHY
	PSHA
	TSY
XEXPRS29:	LDX    #UINARYOP
	JSR    TBLSRCH
	BCC    XEXPRS30
	BSR    PUTTOK
*
*  if(*ibufptr=='(')     /* open paren? */
*  {
*   *tbufptr++=OPARNTOK; /* put in token buffer */
*   ++ibufptr;           /* point to next char in input buffer */
*   xexpres(type);       /* go get sub expression */
*   if(errcode) return;
*   if(*ibufptr!=')') { errcode=UPARNERR; return; }
*   *tbufptr++=CPARNTOK; /* put it in the token buffer */
*   ++ibufptr;           /* point to the next char in the input buffer */
*   goto chkoprtr;
*  }
*
XEXPRS30:	JSR    GETCHR
	CMPA   #'('
	BNE    XEXPRS1
	JSR    INCIBP
	LDAA   #OPARNTOK
	JSR    PUTTOK
	LDAA   0,Y
	JSR    XEXPRES
XEXPRS2:	JSR    GETNXCHR
	CMPA   #')'
	BEQ    XEXPRS3
	LDAA   #UPARNERR
	JMP    RPTERR
XEXPRS3:	LDAA   #CPARNTOK
	JSR    PUTTOK
	JMP    CHKOPRTR
*
*  if((numeric(*ibufptr)) | (*ibufptr=='$') | (*ibufptr=='"'))
*  {
*   c=getcon();
*   if(errcode) return;
*  }
*  else if(c=getfun()) ;
*  else (c=getvar()) ;
*  if(errcode) return;
*  if(type==NULL) type=c;
*  if(c!=type) { errcode=DTMISERR; return; }
*
XEXPRS1:	EQU    *
	JSR    NUMERIC
	BCS    XEXPRS4
	CMPA   #'$'
	BEQ    XEXPRS4
	CMPA   #'"'
	BNE    XEXPRS5
XEXPRS4:	JSR    GETCON
	BRA    XEXPRS7
XEXPRS5:	JSR    GETFUN
	TSTA
	BNE    XEXPRS7
	JSR    GETVAR
XEXPRS7:	LDAB   0,Y
	CMPB   #NULL
	BNE    XEXPRS8
	STAA   0,Y
XEXPRS8:	CMPA   0,Y
	BEQ    XEXPRS9
	LDAA   #DTMISERR
	JMP    RPTERR
XEXPRS9:	EQU    *
*
*
*/* now look for operator or end of expression */
*
*  chkoprtr:
*  c=*ibufptr;
*  if(c==EOL | c==MIDEOL | c==SPC | c==COMMA | c==SEMI | c==')')
*  {
*   return(c);
*  }
*
CHKOPRTR:	EQU    *
	JSR    GETCHR
	CMPA   #EOL
	BEQ    XEXPRS24
	CMPA   #MIDEOL
	BEQ    XEXPRS24
	CMPA   #SPC
	BEQ    XEXPRS24
	CMPA   #COMMA
	BEQ    XEXPRS24
	CMPA   #SEMI
	BEQ    XEXPRS24
	CMPA   #')'
	BEQ    XEXPRS24
*
*
*  if(type==NUM)
*  {
*   if(c=cknumop()) ;
*   else if(c=ckbolop()) ;
*   else if(ifwhflag) c=cklogop();
*   else c=NULL;
*  }
XEXPRS15:	EQU    *
	LDAA   0,Y
	CMPA   #NUM
	BNE    XEXPRS21
	JSR    CKNUMOP
	BCS    XEXPRS17
	JSR    CKBOLOP
	BCS    XEXPRS17
	TST    IFWHFLAG
	BEQ    XEXPRS18
	JSR    CKLOGOP
	BRA    XEXPRS17
XEXPRS18:	LDAA   #NULL
	BRA    XEXPRS17
*
*
*  else { errcode=IDTYERR; return; }
*
XEXPRS21:	EQU    *
	LDAA   #IDTYERR
	JMP    RPTERR
*
*
*  if(c==NULL) { errcode=OPRTRERR; return; }
*  *tbufptr++=c;
* }
* return;
*}
*
XEXPRS17:	EQU    *
	TSTA
	BNE    XEXPRS23
	LDAA   #OPRTRERR
	JMP    RPTERR
XEXPRS24:	INS
	PULY
	RTS
XEXPRS23:	JSR    PUTTOK
	JMP    XEXPRS29
*
*
*/***** cknumop() *****/
*
*cknumop()
*{
* if(match("+")) return(PLUSTOK);
* else if(match("-")) return(MINUSTOK);  
* else if(match("*")) return(MULTTOK);
* else if(match("/")) return(DIVTOK);
* else if(match("\\")) return(MODTOK);
* else if(match("^")) return(PWRTOK);
* else return(NULL);
*}
*
CKNUMOP:	EQU    *
	LDX    #NUMOPTBL
*
CKOP:	JSR    TBLSRCH
	BCS    CKOP1   
	LDAA   #NULL
CKOP1:	RTS
*
*
	
*/***** ckbolop() *****/
*
*ckbolop()
*{
* if(match("AND")) return(ANDTOK);
* else if(match("OR")) return(ORTOK);
* else if(match("EOR")) return(EORTOK);
* else return(NULL);
*}
*
CKBOLOP:	EQU    *
	LDX    #BOLOPTBL
	BRA    CKOP
*
*
	
*/***** cklogop() *****/
*
*cklogop()
*{
* if(match("<=")) return(LTEQTOK);
* else if(match(">=")) return(GTEQTOK);
* else if(match("<>")) return(NOTEQTOK);
* else if(match("<")) return(LTTOK);
* else if(match(">")) return(GTTOK);
* else if(match("=")) return(EQTOK);
* else return(NULL);
*}
*
CKLOGOP:	EQU    *
	LDX    #LOGOPTBL
	BRA    CKOP
*
*
*
*
*<><><><><> NOTE: THIS ROUTINE HAS NO 'C' COUNTER PART <><><><><><>
*
TBLSRCH:	EQU    *
	JSR    STREQ        ; SEARCH FOR STRING.
	BCS    TBLSRCH1     ; IF FOUND GO GET TOKEN & RETURN.
TBLSRCH2:	INX                 ; BUMP POINTER TO NEXT CHAR.
	LDAA   0,X          ; GET IT.
	BNE    TBLSRCH2     ; KEEP LOOKING FOR END OF ENTRY.
	INX                 ; FOUND IT. BUMP POINTER TO NEXT ENTRY.
	INX
	LDAA   0,X          ; AT THE END OF THE TABLE?
	BNE    TBLSRCH      ; NO. GO CHECK THE NEXT ENTRY.
	CLC                 ; YES. FLAG AS NOT FOUND.
	RTS                 ; RETURN.
TBLSRCH1:	LDAA   1,X          ; GET TOKEN.
	SEC                 ; FLAG AS FOUND.
	RTS                 ; RETURN.
*
*
NUMOPTBL:	EQU    *
PLUS:	FCC    "+"
	FCB    0
	FCB    PLUSTOK
MINUS:	FCC    "-"
	FCB    0
	FCB    MINUSTOK
MULT:	FCC    "*"
	FCB    0
	FCB    MULTTOK
DIV:	FCC    "/"
	FCB    0
	FCB    DIVTOK
MODS:	FCB    $5C,$00
	FCB    MODTOK
	FCB    0            ; END OF TABLE FLAG.
*
BOLOPTBL:	EQU    *
ANDS:	FCC    ".AND."
	FCB    0
	FCB    ANDTOK
ORS:	FCC    ".OR."
	FCB    0
	FCB    ORTOK
EORS:	FCC    ".EOR."
	FCB    0
	FCB    EORTOK
	FCB    0            ; END OF TABLE FLAG.
*
LOGOPTBL:	EQU    *
LTEQ:	FCC    "<="
	FCB    0
	FCB    LTEQTOK
GTEQ:	FCC    ">="
	FCB    0
	FCB    GTEQTOK
NOTEQ:	FCC    "<>"
	FCB    0
	FCB    NOTEQTOK
LT:	FCC    "<"
	FCB    0
	FCB    LTTOK
GT:	FCC    ">"
	FCB    0
	FCB    GTTOK
EQ:	FCC    "="
	FCB    0
	FCB    EQTOK
	FCB    0            ; END OF TABLE FLAG.
*
*
UINARYOP:	EQU    *
NEGS:	FCC    "-"
	FCB    0
	FCB    NEGTOK
NOTS:	FCC    "NOT"
	FCB    0
	FCB    NOTTOK
	FCB    0            ; END OF TABLE MARKER.
*

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -