📄 basic11.sdi
字号:
006A,00 02,TOKPTR:, TOKPTR: rmb 2 ; /* token pointer (used for list command) */
006C,00 02,VarSize:, VarSize: rmb 2 ; /* used by the line editor. size of the variable table */
,,, *
,,, *
,,, $if * > $9E
,,, $endif
,,, *
,,, *
,,, *
,,, ORG $009E
,,, *
009E,00 03,CONSTAT:, CONSTAT: RMB 3 ; GET CONSOLE STATUS FOR BREAK ROUTINE.
00A1,00 03,INCONNE:, INCONNE: RMB 3 ; GET BYTE DIRECTLY FROM CONSOLE FOR BREAK ROUTINE.
,,, *
,,, ORG $00A4
,,, *
00A4,00 10,INTABLE:, INTABLE: RMB 16 ; RESERVE SPACE FOR 8 DIFFERENT INPUT ROUTINES.
00B4,00 10,OUTABLE:, OUTABLE: RMB 16 ; RESERVE SPACE FOR 8 DIFFERENT OUTPUT ROUTINES.
,,, *
,,, *
,,, *
,,, *
,,, ORG $00C4 ; START OF RAM INTERRUPT VECTORS.
,,, *
,,, RAMVECTS: EQU *
00C4,00 03,SCISS:, SCISS: RMB 3 ; SCI SERIAL SYSTEM.
00C7,00 03,SPITC:, SPITC: RMB 3 ; SPI TRANSFER COMPLETE.
00CA,00 03,PACCIE:, PACCIE: RMB 3 ; PULSE ACCUMULATOR INPUT EDGE.
00CD,00 03,PACCOVF:, PACCOVF: RMB 3 ; PULSE ACCUMULATOR OVERFLOW.
00D0,00 03,TIMEROVF:, TIMEROVF: RMB 3 ; TIMER OVERFLOW.
00D3,00 03,TOC5:, TOC5: RMB 3 ; TIMER OUTPUT COMPARE 5.
00D6,00 03,TOC4:, TOC4: RMB 3 ; TIMER OUTPUT COMPARE 4.
00D9,00 03,TOC3:, TOC3: RMB 3 ; TIMER OUTPUT COMPARE 3.
00DC,00 03,TOC2:, TOC2: RMB 3 ; TIMER OUTPUT COMPARE 2.
00DF,00 03,TOC1:, TOC1: RMB 3 ; TIMER OUTPUT COMPARE 1.
00E2,00 03,TIC3:, TIC3: RMB 3 ; TIMER INPUT CAPTURE 3.
00E5,00 03,TIC2:, TIC2: RMB 3 ; TIMER INPUT CAPTURE 2.
00E8,00 03,TIC1:, TIC1: RMB 3 ; TIMER INPUT CAPTURE 1.
00EB,00 03,REALTIMI:, REALTIMI: RMB 3 ; REAL TIME INTERRUPT.
00EE,00 03,IRQI:, IRQI: RMB 3 ; IRQ INTERRUPT.
00F1,00 03,XIRQ:, XIRQ: RMB 3 ; XIRQ INTERRUPT.
00F4,00 03,SWII:, SWII: RMB 3 ; SOFTWARE INTERRUPT.
00F7,00 03,ILLOP:, ILLOP: RMB 3 ; ILLEGAL OPCODE TRAP.
00FA,00 03,COP:, COP: RMB 3 ; WATCH DOG TIMER FAIL.
00FD,00 03,CMF:, CMF: RMB 3 ; CLOCK MONITOR FAIL.
,,, *
,,, *
,,, #Include '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 */
,,, *
E000,7E ED 72,, JMP POWERUP
,,, MAIN: EQU *
E003,BD EC FA,MAINC:, MAINC: JSR INITVARS ; INITALIZE ALL INTERNAL VARIABLES.
E006,FE FF C4,, LDX EEStart
E009,A6 0A,, LDAA AUTOSTF,X ; get the auto start flag.
E00B,81 55,, CMPA #$55
E00D,26 04,, BNE MAIN9
E00F,0E,, CLI ; ALLOW ALL INTERRUPTS TO BE SERVICED.
E010,BD F1 59,, JSR CRUN
E013,BD E0 68,MAIN9:, MAIN9: JSR OUTHEADR ; PRINT HEADER.
,,, MAINW: EQU *
E016,FC FF C0,MAIN2:, MAIN2: LDD RAMStart ; RESET STACK VALUE.
E019,F3 FF C2,, ADDD RAMSize
E01C,8F,, XGDX
E01D,35,, TXS
E01E,0E,, CLI ; (J.I.C.)
E01F,4F,, CLRA ; CLEAR D.
E020,5F,, CLRB
E021,DD 3A,, STD TIMECMP ; DON'T ALLOW "ONTIME" INTERRUPTS TO OCCUR.
E023,DD 3F,, STD ONIRQLIN ; DON'T ALLOW "ONIRQ" INTERRUPTS TO OCCUR.
E025,DD 41,, STD ONPACLIN ; DON'T ALLOW "PACC" INTERRUPTS TO OCCUR.
E027,BD E0 AB,, 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 *
E02A,7F 00 19,, CLR IMMID ; CLEAR THE IMMIDIATE MODE FLAG.
E02D,7F 00 18,, CLR ERRCODE ; CLEAR THE ERROR CODE BYTE.
E030,7F 00 1D,, CLR RUNFLAG ; CLEAR THE RUN MODE FLAG.
E033,BD E1 05,, JSR OUTPRMPT ; SEND PROMPT TO CONSOLE.
E036,BD E0 BB,, JSR GETLINE ; GO GET LINE FROM OPERATOR.
E039,BD E0 5B,, JSR SKIPSPCS ; SKIP ANY LEADING SPACES.
E03C,BD EE 48,, JSR CHCKCMDS ; GO CHECK FOR ANY COMMANDS.
E03F,1A 83 00 00,, CPD #0 ; WERE THERE ANY?
E043,26 D1,, BNE MAIN2 ; YES. CONTINUE.
E045,DE 0A,, LDX VAREND ; SAVE CURRENT END OF VARIABLE AREA IN CASE LINE
E047,DF 2F,, STX FENCE ; HAS AN ERROR IN IT. (SO NO SPURIOUS VARIABLES
,,, * ; ARE ALLOCATED)
E049,BD E1 27,, JSR PARSE
E04C,7D 00 19,, TST IMMID ; DID WE EXECUTE IN IMMIDATE MODE?
E04F,26 C5,, BNE MAIN2 ; YES. PRINT READY MESSAGE.
E051,20 D7,, BRA MAIN1 ; NO. JUST PRINT PROMPT.
,,, *
,,, *
E053,DE 2F,MAIN3:, MAIN3: LDX FENCE ; GET THE VAREND FENCE.
E055,6F 00,, CLR 0,X ; MARK "OLD" END OF VARIABLE AREA IN CASE ANY
,,, * ; VARIABLES WERE ALLOCATED.
E057,DF 0A,, STX VAREND ; RESTORE THE POINTER.
E059,20 BB,, BRA MAIN2 ; CONTINUE AFTER ERROR.
,,, *
,,, * /***** skipspcs() *****/
,,,
,,, *skipspcs()
,,, *{
,,, * while(*ibufptr==SPC) ++ibufptr;
,,, * return;
,,, *}
,,, *
,,, SKIPSPCS: EQU *
E05B,BD E3 C3,SKIPSPC1:, SKIPSPC1: JSR GETCHR
E05E,81 20,, CMPA #SPC
E060,26 05,, BNE SKIPSPC2
E062,BD E3 CC,, JSR INCIBP
E065,20 F4,, BRA SKIPSPC1
E067,39,SKIPSPC2:, SKIPSPC2: RTS
,,, *
,,,
,,, * /***** outheader *****/
,,,
,,, *outheader()
,,, *{
,,, * pl("BASIC11 v1.1");
,,, * nl();
,,, * nl();
,,, * pl("Written by Gordon Doughman");
,,, * nl();
,,, *}
,,, *
,,, OUTHEADR: EQU *
E068,CE E0 6E,, LDX #HEADER
E06B,7E E1 1C,, JMP PL
,,, *
,,, HEADER: EQU *
E06E,0D,, FCB $0D,$0A,$0D,$0A
E06F,0A,,
E070,0D,,
E071,0A,,
E072,42 41 53 49 43 31,, FCC "BASIC11 v1.55"
,,, FCC "BASIC11 v1.55"
,,, FCC "BASIC11 v1.55"
E07F,0D,, FCB $0D,$0A
E080,0A,,
E081,43 6F 70 79 72 69,, FCC "Copyright 1985-1990 by"
,,, FCC "Copyright 1985-1990 by"
,,, FCC "Copyright 1985-1990 by"
,,, FCC "Copyright 1985-1990 by"
E097,0D,, FCB $0D,$0A
E098,0A,,
E099,47 6F 72 64 6F 6E,, FCC "Gordon Doughman"
,,, FCC "Gordon Doughman"
,,, FCC "Gordon Doughman"
E0A8,0D,, FCB $0D,$0A,0
E0A9,0A,,
E0AA,00,,
,,, *
,,, *
,,, * /***** outrdy() *****/
,,,
,,, *outrdy()
,,, *{
,,, * nl();
,,, * pl("READY");
,,, * return;
,,, *}
,,, *
,,, OUTRDY: EQU *
E0AB,CE E0 B1,, LDX #READY
E0AE,7E E1 1C,, JMP PL
,,, *
,,, READY: EQU *
E0B1,0D,, FCB $0D,$0A
E0B2,0A,,
E0B3,52 45 41 44 59,, FCC "READY"
E0B8,0D,, FCB $0D,$0A,0
E0B9,0A,,
E0BA,00,,
,,, *
,,, *
,,, * /***** getline() *****/
,,,
,,, *getline()
,,, *{
,,, * short chrcnt;
,,, * char c;
,,, * chrcnt=IBUFLEN;
,,, * ibufptr=inbuff;
,,, *
,,, GETLINE: EQU *
E0BB,C6 4F,, LDAB #IBUFLEN-1
E0BD,DE 49,, LDX INBUFFS
,,, *
,,, * while((c=inbyte())!=EOL && (chrcnt>0))
,,, * {
,,, *
E0BF,BD FE EA,GETLINE3:, GETLINE3: JSR INBYTE
E0C2,81 0D,, CMPA #EOL
E0C4,27 2B,, BEQ GETLINE1
E0C6,5D,, TSTB
E0C7,27 28,, 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;
,,, * }
,,, *
,,, *
E0C9,81 08,, CMPA #BS
E0CB,26 10,, BNE GETLINE2
E0CD,C1 4F,, CMPB #IBUFLEN-1
E0CF,27 20,, BEQ GETLINE1
E0D1,09,, DEX
E0D2,86 20,, LDAA #SPC
E0D4,BD FE CD,, JSR OUTBYTE
E0D7,86 08,, LDAA #BS
E0D9,BD FE CD,, JSR OUTBYTE
E0DC,5C,, INCB
,,, *
,,, * if(c < SPC) continue; /* ignore all other control characters */
,,, *
,,, GETLINE2: EQU *
E0DD,81 03,, CMPA #CNTRLC ; IS IT A "BREAK"?
E0DF,26 06,, BNE GETLINE4 ; NO. GO PROCESS THE CHARACTER.
E0E1,7C 00 1C,, INC CONTFLAG ; DONT ALLOW A "CONT".
E0E4,7E F2 6F,, JMP CHCKBRK2 ; GO DO A BREAK.
E0E7,81 20,GETLINE4:, GETLINE4: CMPA #SPC
E0E9,25 D4,, BLO GETLINE3
,,, *
,,, * *ibufptr=c; /* save character in input buffer */
,,, * ibufptr+=1; /* point to next location */
,,, * chrcnt-=1;
,,, * }
E0EB,A7 00,, STAA 0,X
E0ED,08,, INX
E0EE,5A,, DECB
E0EF,26 CE,, BNE GETLINE3
,,, *
,,, * *ibufptr=EOL; /* put EOL in input buffer */
,,, * ibufptr=inbuff; /* initalize the input buffer pointer */
,,, * return;
,,, *}
,,, *
,,, GETLINE1: EQU *
E0F1,86 0D,, LDAA #EOL
E0F3,A7 00,, STAA 0,X
E0F5,DE 49,, LDX INBUFFS
E0F7,DF 00,, STX IBUFPTR
E0F9,39,, RTS
,,, *
,,, ToUpper: EQU *
E0FA,81 61,, cmpa #'a' ; is the character less than a lower case 'a'?
E0FC,25 06,, blo ToUpper1
E0FE,81 7A,, cmpa #'z'
E100,22 02,, bhi ToUpper1
E102,84 DF,, anda #$df
E104,39,ToUpper1:, ToUpper1: rts
,,,
,,, * /***** outprmpt() *****/
,,,
,,, *outprmpt()
,,, *{
,,, * nl(); /* go to new line */
,,, * outbyte('#'); /* send prompt to console */
,,, * return;
,,, *}
,,, *
,,, OUTPRMPT: EQU *
E105,CE E1 0A,, LDX #PRMPTSTR
E108,20 12,, BRA PL
,,, *
,,, PRMPTSTR: EQU *
E10A,0D,, FCB $0D,$0A
E10B,0A,,
E10C,3E,, FCC ">"
E10D,00,, FCB 0
,,, *
,,, * /***** nl() *****/
,,,
,,, * nl() /* send CR/LF to console */
,,, *{
,,, * outbyte(CR);
,,, * outbyte(LF);
,,, * return;
,,, *}
,,, *
,,, *
E10E,8D 00,NL2:, NL2: BSR NL
,,, NL: EQU *
E110,CE E1 19,, LDX #CRLFSTR
E113,8D 07,, BSR PL
E115,7F 00 1E,, CLR PRINTPOS ; SET THE CURRENT PRINT POSITION TO 0.
E118,39,, RTS
,,, *
E119,0A,CRLFSTR:, CRLFSTR: FCB $0A,$0D,$00
E11A,0D,,
E11B,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 *
E11C,A6 00,PL1:, PL1: LDAA 0,X
E11E,27 06,, BEQ PL2
E120,BD FE CD,, JSR OUTBYTE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -