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

📄 command1.asm

📁 该应用软件可以实现大多数单片机的仿真实验
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	LDX    #DATA
	JSR    PL
	BRA    LREM3
*
*
LREMLINE:	EQU    *
	LDX    #REM
	JSR    PL
LREM3:	LDX    TOKPTR
	INX                 ; PUT POINTER PAST LENGTH BYTE.
LREM1:	LDAA   0,X
	CMPA   #EOL   
	BNE    LREM2
	INX
	STX    TOKPTR
	RTS
LREM2:	JSR    OUTBYTE
	INX
	BRA    LREM1
*
*
TOKTBL:	EQU     *
	FCB     LETTOK
	FDB     LET
	FCB     READTOK
	FDB     READ
	FCB     RESTRTOK
	FDB     RESTORE
	FCB     GOSUBTOK
	FDB     GOSUB
	FCB     GOTOTOK
	FDB     GOTO
	FCB     ONTOK
	FDB     ON
	FCB     RETNTOK
	FDB     RETURN
	FCB     IFTOK
	FDB     IIF
	FCB     THENTOK
	FDB     THENS
	FCB     ELSETOK
	FDB     ELSES
	FCB     INPUTTOK
	FDB     INPUT
	FCB     PRINTTOK
	FDB     PRINT
	FCB     FORTOK
	FDB     FOR
	FCB     NEXTTOK
	FDB     NEXT
	FCB     STOPTOK
	FDB     STOPSS
	FCB     ENDTOK
	FDB     ENDS
	FCB     TRONTOK
	FDB     TRON
	FCB     TROFFTOK
	FDB     TROFF
	FCB     WHILETOK
	FDB     WHILE
	FCB     ENDWHTOK
	FDB     ENDWH
	FCB     STEPTOK
	FDB     STEP
	FCB     TOTOK
	FDB     TO
	FCB     COMMATOK
	FDB     COMMAC
	FCB     SEMITOK
	FDB     SEMIC
	FCB     MEOLTOK
	FDB     COLLINC
	FCB     IMLETTOK
	FDB     IMLET
	FCB     POKETOK
	FDB     POKE
	FCB     EQUALTOK
	FDB     EQ
	FCB     OPARNTOK
	FDB     OPARN
	FCB     CPARNTOK
	FDB     CPARN
	FCB     ANDTOK
	FDB     ANDS
	FCB     ORTOK
	FDB     ORS
	FCB     EORTOK
	FDB     EORS
	FCB     LTTOK
	FDB     LT
	FCB     GTTOK
	FDB     GT
	FCB     LTEQTOK
	FDB     LTEQ
	FCB     GTEQTOK
	FDB     GTEQ
	FCB     EQTOK
	FDB     EQ
	FCB     NOTEQTOK
	FDB     NOTEQ
	FCB     PLUSTOK
	FDB     PLUS
	FCB     MINUSTOK
	FDB     MINUS
	FCB     MULTTOK
	FDB     MULT
	FCB     DIVTOK
	FDB     DIV
	FCB     MODTOK
	FDB     MODS
	FCB     NOTTOK
	FDB     NOTS
	FCB     RTIMETOK
	FDB     RTIMES
	FCB     NEGTOK
	FDB     NEGS
	FCB     SSCNTOK
	FDB     SPACE
	FCB     DIMTOK
	FDB     DIM
	FCB     EEPTOK
	FDB     EEP
	FCB     PORTATOK
	FDB     PORTA
	FCB     PORTBTOK
	FDB     PORTB
	FCB     PORTCTOK
	FDB     PORTC
	FCB     PORTDTOK
	FDB     PORTD
	FCB     PNUMTOK
	FDB     POUNDSGN
	FCB     INBYTTOK
	FDB     INBYTES
	FCB     TIMETOK
	FDB     TIME
	FCB     ONTIMTOK
	FDB     ONTIME
	FCB     ONIRQTOK
	FDB     ONIRQ
	FCB     RETITOK
	FDB     RETI
	FCB     PACCTOK
	FDB     PACC
	FCB     ONPACTOK
	FDB     ONPACC
	FCB     SLEEPTOK
	FDB     SLEEP
	FCB     0            ; END OF TABLE MARKER.
*
*
LFUNCTBL:	EQU    *
	FCB    FDIVTOK
	FDB    FDIVS
	FCB    CHRTOK
	FDB    CHRS
	FCB    ADCTOK
	FDB    ADCS
	FCB    ABSTOK
	FDB    ABS
	FCB    RNDTOK
	FDB    RND
	FCB    SGNTOK
	FDB    SGN
	FCB    TABTOK
	FDB    TABS
	FCB    CALLTOK
	FDB    CALL
	FCB    PEEKTOK
	FDB    PEEK
	FCB    FEEPTOK
	FDB    EEP
	FCB    HEXTOK
	FDB    HEX
	FCB    FPRTATOK
	FDB    PORTA
	FCB    FPRTBTOK
	FDB    PORTB
	FCB    FPRTCTOK
	FDB    PORTC
	FCB    FPRTDTOK
	FDB    PORTD
	FCB    FPRTETOK
	FDB    PORTE
	FCB    FTIMETOK
	FDB    TIME
	FCB    HEX2TOK
	FDB    HEX2
	FCB    FPACCTOK
	FDB    PACC
IMLET:	FCB    0            ;  NO KETWORD TO PRINT FOR AN IMPLIED LET.
COLLINC:	FCC    ":"
	FCB    0
SEMIC:	FCC    ";"
	FCB    0
COMMAC:	FCC    ","
	FCB    0
OPARN:	FCC    "("
	FCB    0
CPARN:	FCC    ")"
	FCB    0
SPACE:	FCC    " "
	FCB    0
PORTE:	FCC    "PORTE"
	FCB    0
POUNDSGN:	FCC    "#"
	FCB    0
*
*
CRUN:	EQU    *
	JSR    NL2          ; DO 2 CR/LF SEQUENCES.
	JSR    RUNINIT      ; INITALIZE RUNTIME VARIABLES.
	LDAA   #1           ; SET THE RUN MODE FLAG.
	STAA   RUNFLAG
*
*        END OF POINTER INITIALIZATIONS
*
	LDY    BASBEG       ; POINT TO THE START OF THE PROGRAM.
	CPY    BASEND       ; IS THERE A PROGRAM IN MEMORY?
	BNE    CRUN5        ; YES. GO RUN IT.
	RTS                 ; NO. RETURN.
*
CRUN5:	LDD    0,Y          ; GET NUMBER OF FIRST/NEXT LINE OF BASIC PROGRAM.
	STD    CURLINE      ; MAKE IT THE CURRENT LINE.
	TST    TRFLAG       ; IS THE TRACE MODE TURNED ON?
	BEQ    CRUN6        ; NO. CONTINUE.
	LDAA   #'['         ; YES. PRINT THE CURRENT LINE.
	JSR    OUTBYTE
	LDD    CURLINE
	JSR    OUTDECI
	LDAA   #']'
	JSR    OUTBYTE
	JSR    NL
CRUN6:	PSHY                ; SAVE POINTER TO START OF NEW LINE.
	LDAB   2,Y          ; GET LENGTH OF LINE.
	ABY                 ; POINT TO START OF NEXT LINE.
	STY    ADRNXLIN     ; SAVE THE ADDRESS OF THE NEXT LINE.
	PULY
	LDAB   #3           ; BYTE COUNT OF LINE NUMBER & LENGTH.
	ABY                 ; POINT TO THE FIRST TOKEN.
CRUN4:	BSR    RSKIPSPC     ; SKIP SPACES IF PRESENT.
	LDAB   0,Y          ; GET KEYWORD TOKEN.
	INY                 ; POINT PAST THE KEYWORD.
	BSR    RSKIPSPC     ; SKIP SPACES AFTER KEYWORD.
	DECB                ; SUBTRACT ONE FOR INDEXING.
	LSLB                ; MULTIPLY BY THE # OF BYTES PER ADDRESS.
	LDX    #RKEYWORD    ; POINT TO RUN TIME ADDRESS TABLE.
	ABX                 ; POINT TO ADDRESS
	LDX    0,X          ; POINT TO RUNTIME ROUTINE.
	JSR    0,X          ; GO DO IT.
*
*
CRUN2:	DEC    BREAKCNT     ; SHOULD WE CHECK FOR A BREAK YET?
	BNE    CRUN7        ; NO. CONTINUE.
	JSR    CHCKBRK      ; CHECK FOR BREAK FROM CONSOLE.
*
CRUN7:	BSR    RSKIPSPC     ; SKIP ANY SPACES.
	LDAA   0,Y          ; GET THE NEXT TOKEN IN THE LINE.
	CMPA   #EOLTOK      ; ARE WE AT THE END OF THE LINE?
	BNE    CRUN3
	INY                 ; YES. POINT TO START OF THE NEXT LINE.
CRUN1:	CPY    BASEND       ; HAVE WE REACHED THE END OF THE BASIC PROGRAM?
	BNE    CRUN5        ; NO. GO EXECUTE THE NEXT LINE.
	JMP    REND         ; GO DO  AN "END".
CRUN3:	INY                 ; MUST BE A MID EOL.
	BRA    CRUN4        ; GO DO NEXT KEYWORD.
*
*
*
RSKIPSPC:	LDAA   0,Y          ; GET A CHARACTER.
	BMI    RSKIP2
	CMPA   #SSCNTOK     ; IS IT A SINGLE SPACE?
	BEQ    RSKIP1       ; YES. BUMP IP BY 1.
	BLO    RSKIP2
	INY                 ; BUMP IP BY 2 FOR MULTIPLE SPACES.
RSKIP1:	INY                 ; BUMP IP.
RSKIP2:	RTS                 ; RETURN.
*
*
RKEYWORD:	EQU    *
	FDB    RLET
	FDB    RLET
	FDB    RPRINT
	FDB    RFOR
	FDB    RNEXT
	FDB    RTRON
	FDB    RTROFF
	FDB    RPOKE
	FDB    RDIM
	FDB    RREM
	FDB    RPACC
	FDB    RDATA
	FDB    RREAD
	FDB    RRESTOR
	FDB    RGOSUB
	FDB    0
	FDB    0
	FDB    RGOTO
	FDB    RON
	FDB    RRETURN
	FDB    RIF
	FDB    RINPUT
	FDB    RSTOP
	FDB    REND
	FDB    RWHILE
	FDB    RENDWH
	FDB    REEP
	FDB    RPORTA
	FDB    RPORTB
	FDB    RPORTC
	FDB    RPORTD
	FDB    0
	FDB    0
	FDB    0
	FDB    RINBYTE
	FDB    RTIME
	FDB    RONTIME
	FDB    RONIRQ
	FDB    RRETI
	FDB    RONPACC
	FDB    RSLEEP
	FDB    RRTIME
*
*
RUNLINE:	JSR    NL2
	LDY    TKNBUFS      ; POINT TO THE TOKEN BUFFER.
	LDD    0,Y          ; GET CURRENT LINE NUMBER.
	STD    CURLINE      ; MAKE "0" THE CURRENT LINE #.
	LDAB   #3           ; POINT PAST THE LINE NUMBER & LENGTH.
	ABY
RUNLINE2:	BSR    RSKIPSPC     ; SKIP SPACES.
	LDAB   0,Y          ; GET KEYWORD.
	INY                 ; POINT PAST KEYWORD.
	BSR    RSKIPSPC     ; SKIP SPACES.
	DECB                ; SUBTRACT ONE FOR INDEXING.
	LSLB                ; MULT BY THE # OF BYTES/ADDRESS.
	LDX    #RKEYWORD    ; POINT TO ADDRESS TABLE.
	ABX                 ; POINT TO ADDRESS OF RUN TIME ROUTINE.
	LDX    0,X          ; GET ADDRESS.
	JSR    0,X          ; GO DO IT.
	JSR    RSKIPSPC     ; SKIP SPACES.
	LDAA   0,Y
	CMPA   #EOLTOK      ; ARE WE AT THE END OF THE LINE?
	BNE    RUNLINE1
	RTS
RUNLINE1:	INY                 ; MUST BE A MID EOL.
	BRA    RUNLINE2
*
*
CHCKBRK:	EQU    *
	LDAA   #10          ; RELOAD THE BREAK CHECK COUNT.
	STAA   BREAKCNT
	JSR    CONSTAT      ; GET CONSOLE STATUS. CHARACTER TYPED?
	BNE    CHCKBRK1     ; YES. GO CHECK IT OUT.
	RTS                 ; NO. RETURN.
CHCKBRK1:	JSR    INCONNE      ; GET BYTE FROM CONSOLE BUT DON'T ECHO.
	CMPA   #$03         ; WAS IT A CONTROL-C?
	BEQ    CHCKBRK2     ; YES. GO DO A BREAK.
	RTS                 ; NO. RETURN.
CHCKBRK2:	STY    IPSAVE       ; SAVE THE IP POINTER IN CASE OF A CONTINUE.
	JSR    NL
	LDX    #BREAKS      ; POINT TO BREAK STRING.
	JSR    PL
	LDD    CURLINE
	JSR    OUTDECI
	JSR    NL
	JMP    MAINW
*
*
*
*
RUNINIT:	EQU    *
	JSR    CCLEAR       ; GO CLEAR ALL VARIABLE STORAGE.
RUNINIT1:	LDX    STNUMS      ; GET START OF NUMERIC OPERAND STACK.
	STX    NUMSTACK     ; INITALIZE THE OPERAND STACK POINTER.
	LDX    STOPS       ; GET THE START OF THE OPERATOR STACK.
	STX    OPSTACK      ; INITALIZE THE OPREATOR STACK POINTER.
	LDX    STFORSTK    ; GET THE START OF THE FOR-NEXT STACK.
	STX    FORSTACK     ; INITALIZE THE FOR NEXT STACK POINTER.
	LDX    STWHSTK     ; GET THE START OF THE WHILE STACK.
	STX    WHSTACK      ; INITALIZE THE WHILE STACK POINTER.
	LDX    STGOSTK     ; GET THE START OF THE GOSUB STACK.
	STX    GOSTACK      ; SET THE START OF THE GOSUB STACK.
	LDX    VAREND       ; GET THE VARIABLE END POINTER.
	INX                 ; POINT TO THE NEXT AVAILABLE BYTE.
	STX    STRASTG      ; INITALIZE THE STRING/ARRAY STORAGE POINTER.
	CLR    PRINTPOS     ; SET THE CURRENT PRINT POSITION TO 0.
	LDAA   #10          ; SET COUNT FOR BREAK CHECK.
	STAA   BREAKCNT
	CLR    CONTFLAG     ; CLEAR THE CONTINUE FLAG.
	LDX    #0           ; CLEAR THE DATA POINTER.
	STX    DATAPTR
	RTS
*
*
CCONT:	EQU    *
	JSR    NL2
	TST    CONTFLAG
	BNE    CCONT1
	LDY    IPSAVE
	JMP    CRUN7
CCONT1:	LDAA   #CNTCNERR
	STAA   ERRCODE
	JMP    RPTERR5
*
*
CNEW:	EQU    *
	ldx    EEStart
	LDAA   AUTOSTF,X   ;  GET THE AUTO START FLAG.
	CMPA   #$55         ; IS IT SET?
	BNE    CNEW1        ; NO. GO INITIALIZE EVERYTHING.
	LDAA   #$FF         ; YES. RESET (ERASE) IT.
	STAA   AUTOSTF,X
	JSR    DLY10MS
CNEW1:	JSR    INITVARS     ; INITIALIZE EVERYTHING.
	RTS                 ; RETURN.
*
*
CCLEAR:	EQU    *
	JSR    RUNINIT1     ; GO INITALIZE ALL STACKS ETC.
CCLEAR3:	LDX    VARBEGIN
CCLEAR1:	LDAA   0,X
	BEQ    CCLEAR2
	INX
	INX
	INX
	JSR    CLRVAR
	BRA    CCLEAR1
CCLEAR2:	LDX    VAREND
	INX
	STX    STRASTG
	RTS
*
*

⌨️ 快捷键说明

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