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

📄 basiclb1.asm

📁 在单片机内嵌BASIC语言解释程序的完整代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	ORG    ROMBEG
*        title    BASICLB1
******************************************************************************
*                                                                            *
*                      MC68HC11 BASIC INTERPRETER                            *
*                                                                            *
*                             WRITTEN BY:                                    *
*                                                                            *
*                           GORDON DOUGHMAN                                  *
*                                                                            *
*                        COPYRIGHT 1985-1990 BY                              *
*                                                                            *
*                           GORDON DOUGHMAN                                  *
*                                                                            *
******************************************************************************
*
*
*/
*       include "1.DEFINES.C"
*
*main()
*{
* initvars();            /* initalize all variables & pointers */
* outheader();           /* send startup message to console */
* outrdy();              /* output ready message */
*
	JMP    POWERUP
MAIN:	EQU    *
MAINC:	JSR    INITVARS     ; INITALIZE ALL INTERNAL VARIABLES.
	LDX    EEStart
	LDAA   AUTOSTF,X    ; get the auto start flag.
	CMPA   #$55
	BNE    MAIN9
	CLI		; ALLOW ALL INTERRUPTS TO BE SERVICED.
	JSR    CRUN
MAIN9:	JSR    OUTHEADR     ; PRINT HEADER.
MAINW:	EQU    *
MAIN2:	LDD    RAMStart     ; RESET STACK VALUE.
	ADDD   RAMSize
	XGDX
	TXS
	CLI                 ; (J.I.C.)
	CLRA                ; CLEAR D.
	CLRB
	STD    TIMECMP      ; DON'T ALLOW "ONTIME" INTERRUPTS TO OCCUR.
	STD    ONIRQLIN     ; DON'T ALLOW "ONIRQ" INTERRUPTS TO OCCUR.
	STD    ONPACLIN     ; DON'T ALLOW "PACC" INTERRUPTS TO OCCUR.
	JSR    OUTRDY       ; PRINT READY MESSAGE.
*
* while(1)               /* do forever */
* {
*  outprmpt();           /* output prompt */
*  getline();            /* getline from console */
*  skipspcs();           /* ignore leading spaces in input buffer */
*  if(chckcmds()) continue;           /* check for commands */
*  parse();              /* translate/execute line */
*  if(errcode) rpterr(); /* if an error occured somewhere, report it. */
*  errcode=0;            /* clear error status */
* }
*}
*
MAIN1:	EQU    *
	CLR    IMMID        ; CLEAR THE IMMIDIATE MODE FLAG.
	CLR    ERRCODE      ; CLEAR THE ERROR CODE BYTE.
	CLR    RUNFLAG      ; CLEAR THE RUN MODE FLAG.
	JSR    OUTPRMPT     ; SEND PROMPT TO CONSOLE.
	JSR    GETLINE      ; GO GET LINE FROM OPERATOR.
	JSR    SKIPSPCS     ; SKIP ANY LEADING SPACES.
	JSR    CHCKCMDS     ; GO CHECK FOR ANY COMMANDS.
	CPD    #0           ; WERE THERE ANY?
	BNE    MAIN2        ; YES. CONTINUE.
	LDX    VAREND       ; SAVE CURRENT END OF VARIABLE AREA IN CASE LINE
	STX    FENCE        ; HAS AN ERROR IN IT. (SO NO SPURIOUS VARIABLES
*                             ; ARE ALLOCATED)
	JSR    PARSE
	TST    IMMID        ; DID WE EXECUTE IN IMMIDATE MODE?
	BNE    MAIN2        ; YES. PRINT READY MESSAGE.
	BRA    MAIN1        ; NO. JUST PRINT PROMPT.
*
*
MAIN3:	LDX    FENCE        ; GET THE VAREND FENCE.
	CLR    0,X          ; MARK "OLD" END OF VARIABLE AREA IN CASE ANY
*                             ; VARIABLES WERE ALLOCATED.
	STX    VAREND       ; RESTORE THE POINTER.
	BRA    MAIN2        ; CONTINUE AFTER ERROR.
*
*        /***** skipspcs() *****/
	
*skipspcs()
*{
* while(*ibufptr==SPC) ++ibufptr;
* return;
*}
*
SKIPSPCS:	EQU    *
SKIPSPC1:	JSR    GETCHR
	CMPA   #SPC
	BNE    SKIPSPC2
	JSR    INCIBP
	BRA    SKIPSPC1
SKIPSPC2:	RTS
*
	
*        /***** outheader *****/
	
*outheader()
*{
* pl("BASIC11 v1.1");
* nl();
* nl();
* pl("Written by Gordon Doughman");
* nl();
*}
*
OUTHEADR:	EQU    *
	LDX    #HEADER
	JMP    PL
*
HEADER:	EQU    *
	FCB    $0D,$0A,$0D,$0A
	FCC    "BASIC11 v1.55"
	FCB    $0D,$0A
	FCC    "Copyright 1985-1990 by"
	FCB    $0D,$0A
	FCC    "Gordon Doughman"
	FCB    $0D,$0A,0
*
*
*        /***** outrdy() *****/
	
*outrdy()
*{
* nl();
* pl("READY");
* return;
*}
*
OUTRDY:	EQU    *
	LDX    #READY
	JMP    PL
*
READY:	EQU    *
	FCB    $0D,$0A
	FCC    "READY"
	FCB    $0D,$0A,0
*
*
*        /***** getline() *****/
	
*getline()
*{
* short chrcnt;
* char c;
* chrcnt=IBUFLEN;
* ibufptr=inbuff;
*
GETLINE:	EQU    *
	LDAB   #IBUFLEN-1
	LDX    INBUFFS
*
* while((c=inbyte())!=EOL && (chrcnt>0))
* {
*
GETLINE3:	JSR    INBYTE
	CMPA   #EOL
	BEQ    GETLINE1
	TSTB
	BEQ    GETLINE1
*
*  if(c==BS)
*  {
*   if(ibufptr!=inbuff)
*   {
*    ibufptr-=1;         /* point to previous buffer location */
*    outbyte(SPC);        /* erase character on screen */
*    outbyte(BS);        /* back cursor up */
*    chrcnt+=1;
*   }
*   else
*    continue;
*   }
*
*
	CMPA   #BS
	BNE    GETLINE2
	CMPB   #IBUFLEN-1
	BEQ    GETLINE1
	DEX
	LDAA   #SPC
	JSR    OUTBYTE
	LDAA   #BS
	JSR    OUTBYTE
	INCB
*
*  if(c < SPC) continue;  /* ignore all other control characters */
*
GETLINE2:	EQU    *
	CMPA   #CNTRLC      ; IS IT A "BREAK"?
	BNE    GETLINE4     ; NO. GO PROCESS THE CHARACTER.
	INC    CONTFLAG     ; DONT ALLOW A "CONT".
	JMP    CHCKBRK2     ; GO DO A BREAK.
GETLINE4:	CMPA   #SPC
	BLO    GETLINE3
*
*  *ibufptr=c;            /* save character in input buffer */
*  ibufptr+=1;           /* point to next location */
*  chrcnt-=1;
* }
	STAA   0,X
	INX
	DECB
	BNE    GETLINE3
*
* *ibufptr=EOL;          /* put EOL in input buffer */
* ibufptr=inbuff;        /* initalize the input buffer pointer */
* return;
*}
*
GETLINE1:	EQU    *
	LDAA   #EOL
	STAA   0,X
	LDX    INBUFFS
	STX    IBUFPTR
	RTS
*
ToUpper:		 EQU	*
	 cmpa	#'a'		; is the character less than a lower case 'a'?
	 blo	ToUpper1
	 cmpa	#'z'
	 bhi	ToUpper1
	 anda	#$df
ToUpper1:	rts
	
*        /***** outprmpt() *****/
	
*outprmpt()
*{
* nl();          /* go to new line */
* outbyte('#');  /* send prompt to console */
* return;
*}
*
OUTPRMPT:	EQU    *
	LDX    #PRMPTSTR
	BRA    PL
*
PRMPTSTR:	EQU    *
	FCB    $0D,$0A
        FCC    ">"
	FCB    0
*
*        /***** nl() *****/
	
* nl()                    /* send CR/LF to console */
*{
* outbyte(CR);
* outbyte(LF);
* return;
*}
*
*
NL2:	BSR    NL
NL:	EQU    *
	LDX    #CRLFSTR
	BSR    PL
	CLR    PRINTPOS     ; SET THE CURRENT PRINT POSITION TO 0.
	RTS
*
CRLFSTR:	FCB    $0A,$0D,$00
*
*        /***** pl() *****/
	
*pl(ptr)                 /* send line to console */
*char *ptr;
*{
* int k; char c;
* k=0;
* while(c=ptr[k++]) outbyte(c);
* return;
*}
*
PL:	EQU    *
PL1:	LDAA   0,X
	BEQ    PL2
	JSR    OUTBYTE
	INX
	BRA    PL1
PL2:	RTS
*
	
*        /***** parse() *****/
	
*parse()
*{
* int num;
* tbufptr=tknbuf;                /* initalize the token buffer pointer */
*
PARSE:	EQU    *
	LDX    TKNBUFS		; Get the start of the token buffer
	STX    TBUFPTR
*
* if(num=getlinum())             /* get line number if present */
* {
*  if(*ibufptr==EOL)             /* was line # followed by CR? */
*  {                             /* yes. */
*   delline(num);                /* go delete the line from the prog buffer */
*   return;
*  }
*  immid=0;                      /* flag as not immidiate */
*  putlinum(num);                /* put line number in buffer */
* }
*  else immid=1;                  /* if no line # flag as immidiate*/
*
	BSR    GETLINUM
	BCC    PARSE2
	PSHA
	JSR    GETCHR
	CMPA   #EOL
	PULA
	BNE    PARSE1
	JSR    DELLINE
	LDX    VAREND
	INX
	STX    STRASTG
PARSE7:	RTS
PARSE1:	CLR    IMMID
PARSE8:	BSR    PUTLINUM
	BRA    PARSE3
PARSE2:	JSR    GETCHR
	CMPA   #EOL
	BEQ    PARSE7
	LDAA   #1
	STAA   IMMID
	LDD    #0
	BRA    PARSE8
*
* if(errcode) return;             /* if line number error, return */
* xlate();                        /* if translation error, return */
* if(errcode) return;
* if(immid) runline();            /* if immidiate mode run 1 line */
*  else storlin();                /* if not store pgm line */
* return;                         /* go get next line */
*}
*
PARSE3:	JSR    XLATE
	TST    IMMID
	BEQ    PARSE5
	JMP    RUNLINE      ; GO RUN THE LINE & RETURN.
PARSE5:	JSR    STORLIN      ; GO STORE LINE & RETURN.
	LDX    VAREND
	INX
	STX    STRASTG
	RTS
*
	
*        /***** getlinum *****/
	
*getlinum()
*{
* int num;
* num=0;
*
GETLINUM:	EQU    *
*
*
	PSHY
	CLRA
	PSHA
	PSHA
	TSY
*
* if(numeric(*ibufptr)==0) return(0);    /* if 1st char not numeric, rtn 0 */
*
	LDX    IBUFPTR
	LDAA   0,X
	BSR    NUMERIC
	BCC    GTLNUM4
*
* while(numeric(*ibufptr))       /* while *ibufptr is numeric */
* {
*  num=num*10+(*ibufptr-'0');    /* get a digit */
*  ibufptr++;                    /* advance input buffer pointer */
*  if(num<=0) { errcode=LINRANG; return(0); }
* }
* return(num);
*}
*
GTLNUM2:	LDAA   0,X
	BSR    NUMERIC
	BCS    GTLNUM3
	SEC
GTLNUM1:	LDD    0,Y
	BNE    GTLNUM4
	LDAA   #LINENERR
	BRA    GTLNUM5
GTLNUM4:	INS
	INS
	PULY
	STX    IBUFPTR
	RTS
GTLNUM3:	BSR    ADDDIG
	BPL    GTLNUM2
	LDAA   #LINRANG
GTLNUM5:	JMP    RPTERR
*
*
ADDDIG:	EQU    *
	LDD    0,Y
	ASLD
	ASLD
	ADDD   0,Y
	ASLD
	STD    0,Y
	LDAB   0,X
	INX
	SUBB   #'0'
	CLRA
	ADDD   0,Y
	STD    0,Y
	RTS
*
*
*        /***** putlinum *****/
	
*putlinum(lnum)
*int lnum;
*{
* putint(lnum);          /* put line # in token buffer */
* *tbufptr++=0;          /* hold place for length of line */
* return;
*}
*
PUTLINUM:	EQU    *
	JSR    PUTDTOK
	CLRA
	JMP    PUTTOK
*
*        /***** numeric() *****/
	
*numeric(c)
*char c;
*{
* c=c&127;
* return((c>='0')&(c<='9'));
*}
*
NUMERIC:	EQU    *
	CMPA   #'0'
	BLO    NUMERIC1
	CMPA   #'9'
	BHI    NUMERIC1
	SEC
	RTS
NUMERIC1:	CLC
	RTS
	
*        /***** alpha() *****/
	
*alpha(c)
*char c;
*{

⌨️ 快捷键说明

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