📄 basiclb1.asm
字号:
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 + -