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

📄 basic11.sdi

📁 该应用软件可以实现大多数单片机的仿真实验
💻 SDI
📖 第 1 页 / 共 5 页
字号:
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 + -