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

📄 inits.asm

📁 在单片机内嵌BASIC语言解释程序的完整代码
💻 ASM
字号:
*       title   Inits.Asm
*
*
*/***** initvars() *****/
*
*initvars()
*{
* char *x;
* varbegin=varend=0x7000;
* varmend=0x7FFF;
* for(x=varbegin; x<=varmend; x++) *x=0;
* basbeg=basend=0x4000;
* basmend=0x6FFF;
* for(x=basbeg; x<=basmend; x++) *x=0;
* hiline=0;
* return;
*}
*
*
INITVARS:	EQU    *
	LDX    RAMStart     ; YES. VARIABLES START AT RAMBEG.
	STX    VARBEGIN     ; SET POINTERS TO BOTH START AND END OF VARIABLE
	STX    VAREND       ; STORAGE.
	STX    BASBEG       ; SET POINTERS TO BOTH THE START AND END OF THE
	STX    BASEND       ; BASIC PROGRAM.
	XGDX		; GET THE START OF RAM INTO D
	ADDD   RAMSize	; add the size of the RAM to it.
	SUBD   #SWSTKSize+1	; subtract the size of the software stack, token & input buffers.
	STD    VARMEND      ; SAVE THE POINTER.
	STD    BASMEND      ; MAKE IT THE END OF BASIC PROGRAM MEMORY.
	addd   #1		; Set up a pointer to the input buffer.
	std    INBUFFS	; Save the pointer.
	addd   #IBUFLEN     ; add the length of the input buffer to create a pointer to the token buffer.
	std    TKNBUFS	; save the pointer.
	addd   #TBUFLEN     ; add the length of the token buffer to create a pointer to the end of the operand stack.
	std    EOPSTK       ; save the pointer to the end of the operator stack.
	addd   #OPSLEN	; add the length of the operand stack.
	std    STOPS	; save the pointer to the start of the operator stack.
	std    ENUMSTK	; also make it the end of the operand stack.
	addd   #NUMSLEN     ; add the length of the operand stack.
	std    STNUMS	; save the result as the start of the operand stack.
	std    EFORSTK	; also make it the end of the FOR stack.
	addd   #FORSLEN     ; Add the length of the FOR stack.
	std    STFORSTK     ; save the result as the start of the FOR stack.
	std    EWHSTK	; also make it the end of the while stack.
	addd   #WHSLEN	; add the length of the while stack.
	std    STWHSTK	; save the pointer as the start of the while stack.
	std    EGOSTK	; also make it the end of the GOSUB stack.
	addd   #GOSLEN	; add the length of the GOSUB stack.
	std    STGOSTK	; save it as the start of the GOSUB stack.
	LDX    BASBEG	; point to the start of the basic program buffer.
INIT1:	CLR    0,X          ; CLEAR THE STORAGE TO ZERO.
	INX                 ; POINT TO THE NEXT LOCATION.
	CPX    BASMEND      ; ARE WE DONE?
	BLS    INIT1        ; NO. KEEP CLEARING.
*                             ; YES. POINT TO THE PHYSICAL END OF MEMORY.
	ldx    EEStart
	LDAA   AUTOSTF,X    ; GET THE AUTO START FLAG AGAIN.
	CMPA   #$55         ; IS THE AUTO START MODE SET?
	BNE    INIT5        ; NO. DO A NORMAL INIT.
*
	JSR    AUTOLOAD     ; GO LOAD the program and VARIABLES INTO RAM.
INIT5:	LDD    #0           ; MAKE THE HIGHEST LINE IN THE PROGRAM 0.
	STD    HILINE
	STD    CURLINE      ; MAKE THE CURRENT LINE #0.
	JSR    RUNINIT      ; GO INITALIZE ALL THE SOFTWARE STACKS.
	CLR    TRFLAG       ; TURN THE TRACE MODE OFF.
	LDAA   #1           ; "CONT" COMMAND NOT ALLOWED.
	STAA   CONTFLAG
;JKJ : Not present!
;        LDX    DFLOPADR     ; point to the D-Flip flop address.
;        STAA   0,X          ; CONNECT SCI RX PIN TO THE HOST CONNECTOR.
	CLR    DEVNUM       ; MAKE THE DEFAULT DEVICE NUMBER 0 (CONSOLE).
	clr    IMMID        ; clear the immediate mode flag (added 9/17/90).
	LDX    VAREND	; GET THE POINTER TO THE END OF VARIABLE STORAGE.
	INX		; BUMP IT BY 1.
	STX    STRASTG	; POINT TO THE DYNAMIC ARRAY STORAGE.
	RTS                 ; RETURN.
*
*
*
POWERUP:	EQU    *
	LDD    IOBASE	; GET THE BASE ADDRESS OF THE I/O REGISTERS.
	STD    IOBaseV
	LSRA
	LSRA
	LSRA
	LSRA
	STAA   $103D	; remap the I/0 regs to where the user wants them.
	LDX    IOBaseV      ; point to the I/O Register Base.
	LDAA   #$93         ; TURN ON A/D, USE E CLOCK, SET IRQ LEVEL SENSITIVE
	STAA   OPTION,X     ; DELAY AFTER STOP, DISABLE CLOCK MONITOR, SET COP
*                             ; TIMMER PREIOD TO MAX.
	LDAA   #$03         ; SET THE TIMER PRESCALER TO /16.
	STAA   TMSK2,X
*
	LDD    RAMStart	; Get start of RAM.
	ADDD   RAMSize	; Add the size of the RAM to it.
	XGDX		; Put the calculated address into X.
	TXS		; Transfer the address to the stack pointer.
*
	LDX    #RAMVECTS    ; POINT TO THE RAM INTERRUPT VECTOR TABLE.
	LDY    #RETII       ; GET ADDRESS OF RTI INSTRUCTION.
	LDAB   #20          ; PUT THE "JMP" OPCODE INTO ALL VECTOR LOCATIONS.
	LDAA   #JMPOP       ; GET THE JMP OPCODE.
POWERUP1:	STAA   0,X          ; STORE IT.
	INX                 ; POINT TO THE NEXT VECTOR.
	STY    0,X          ; INITALIZE VECTOR TO "RTI".
	INX
	INX
	DECB                ; DONE?
	BNE    POWERUP1     ; NO. INITALIZE ALL VECTORS.
	LDX    #ILLOP       ; POINT TO THE ILLEGAL OP-CODE VECTOR.
	LDD    #POWERUP     ; GET THE ADDRESS OF THE POWER UP VECTOR.
	STD    1,X          ; INITALIZE ILLEGAL OP-CODE VECTOR.
	STD    4,X          ; INITALIZE WATCH DOG FAIL VECTOR.
	STD    7,X          ; INITALIZE CLOCK MONITOR FAIL VECTOR.
*
*
*
	LDX    #INTABLE     ; POINT TO THE START OF THE I/O VECTOR TABLE.
	LDY    #IOVects     ; point to the default table in ROM.
	LDAB   #32          ; GET NUMBER OF BYTES IN THE TABLE.
POWERUP2:	ldaa   0,Y          ; Move a byte of the table from ROM into RAM.
	staa   0,X
	INX                 ; POINT TO THE NEXT BYTE.
	INY
	DECB                ; DECREMENT THE COUNT.
	BNE    POWERUP2     ; GO TILL WE'RE DONE.
*
*
	LDX    #TIMEINT     ; GET THE ADDRESS OF THE OUTPUT COMPARE 1 ROUTINE.
	STX    TOC1+1       ; PUT IT IN THE INTERRUPT VECTOR.
	LDAA   #SWPRE+1     ; ADD 1 TO NORMAL PRE SCALER.
	STAA   TIMEPRE      ; SET UP THE SOFTWARE PRESCALER.
	clra
	clrb
	std    TIMEREG      ; ZERO THE TIME REGISTER.
	std    TIMECMP      ; zero the time compare register.
	LDX    IOBaseV
	BSR    TIMINTS      ; GO SETUP THE TIMER FOR THE FIRST INTERRUPT.
	LDAA   #$80         ; ENABLE INTERRUPTS FROM OC1.
	STAA   TMSK1,X
	 
	LDX    #IRQINT     ; GET THE ADDRESS OF THE IRQ SERVICE ROUTINE.
	STX    IRQI+1      ; PUT IT IN THE IRQ VECTOR.
	LDX    #PACCINT    ; GET THE ADDRESS OF THE PACC INT ROUTINE.
	STX    PACCIE+1    ; SET ADDRESS IN INPUT EDGE INTERRUPT VECTOR.
	STX    PACCOVF+1   ; SET ADDRESS IN PACC OVERFLOW INTERRUPT VECTOR.
	CLRA
	CLRB
	STD    ONTIMLIN    ; INITALIZE THE LINE POINTERS.
	STD    ONIRQLIN
	STD    ONPACLIN
*
*
*
	LDX    UserInit
	JSR    0,X	; INITALIZE THE ACIA & SCI.
	JMP    MAIN         ; GO TO BASIC.
*
*
*
TIMEINT:	BSR    TIMINTS
RETII:	RTI                 ; RETURN FROM ALL INTERRUPT SOURCES.
*
*
TIMINTS:	LDX    IOBaseV	; Point to the I/O Base Address.
	LDD    TOC1REG,X    ; GET THE VALUE OF THE TIMER/COUNTER.
TIMINTS3:	ADDD   TimeVal      ; ADD IN 62500 FOR NEXT COMPARE ( 2 HZ INT.).
	STD    TOC1REG,X    ; PUT IT IN THE OUTPUT COMPARE REGISTER.
	LDAA   #$80         ; SETUP TO CLEAR THE OC1 FLAG.
	STAA   TFLAG1,X
	DEC    TIMEPRE      ; HAVE TWO OUTPUT COMPARES OCCURED?
	BNE    TIMINTS1     ; NO. JUST RETURN.
	LDAA   #SWPRE       ; YES. RELOAD THE REGISTER.
	STAA   TIMEPRE
	LDD    TIMEREG      ; GET THE CURRENT VALUE OF "TIME".
	ADDD   #1           ; ADD 1 SECOND TO THE COUNT.
	STD    TIMEREG      ; UPDATE THE TIME REGISTER.
	LDD    TIMECMP      ; GET THE VALUE TO COMPARE TO FOR "ONTIME".
	BEQ    TIMINTS1     ; IF IT'S 0, THE "ONTIME" FUNCTION IS OFF.
	CPD    TIMEREG      ; DOES THE COMPARE VALUE MATCH THE TIME REGISTER?
	BNE    TIMINTS1     ; NO. JUST RETURN.
	LDY    ONTIMLIN     ; MAKE THE POINTER TO THE LINE NUMBER THE NEW IP.
	INS                 ; GET RID OF THE RETURN ADDRESS.
	INS
TIMINTS2:	INC    IMMID        ; FAKE THE GOTO ROUTINE OUT.
	LDD    CURLINE      ; SAVE THE CURRENT LINE NUMBER IN MAIN PROGRAM.
	STD    SCURLINE
	LDD    ADRNXLIN     ; SAVE THE ADDRESS OF THE NEXT LINE IN MAIN PROG.
	STD    SADRNXLN
	JMP    RGOTO3       ; GOTO THE SERVICE ROUTINE.
TIMINTS1:	RTS                 ; RETURN.
*
*
*
IRQINT:	EQU    *
	LDY    ONIRQLIN     ; GET POINTER TO LINE NUMBER OF THE IRQ SERVICE.
	BNE    TIMINTS2     ; GO DO IT.
	RTI                 ; IF IT'S 0, "ONIRQ" HAS NOT BEEN EXECUTED.
*
*
PACCINT:	EQU    *
	LDX    IOBaseV
	LDAA   #$30         ; RESET BOTH THE TIMER OVERFLOW & INPUT FLAG.
	STAA   TFLG2,X
	LDY    ONPACLIN     ; GET POINTER TO LINE NUMBER OF THE SERVICE ROUT.
	BNE    TIMINTS2
	RTI
*
*

⌨️ 快捷键说明

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