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

📄 runtime3.asm

📁 proteus 仿真实例, 使用了proteus大部分元件
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	INY                 ; SKIP PAST "THEN" TOKEN.
	JSR    RSKIPSPC     ; SKIP SPACES AFTER THEN.
	JSR    PULNUM       ; GET RESULT OF EXPRESSION FROM OPERAND STACK.
	BEQ    RIF1         ; NOT TRUE. SEE IF ELSE CLAUSE PRESENT.
RIF3:	JMP    RGOTO        ; RESULT WAS TRUE. GOTO PROPER LINE NUMBER.
RIF1:	LDAB   #3           ; BUMP IP PAST LINE NUMBER.
	ABY
	JSR    RSKIPSPC     ; SKIP SPACES IF PRESENT.
	LDAA   0,Y          ; GET NEXT TOKEN.
	CMPA   #ELSETOK     ; IS IT THE "ELSE" CLAUSE.
	BNE    RIF2	; NO RETURN.
	INY                 ; PASS ELSE TOKEN.
	JSR    RSKIPSPC     ; SKIP SPACES.
	BRA    RIF3         ; DO A GOTO.
RIF2:	RTS                 ; RETURN.
*
*
REEP:	EQU    *            ; PROGRAM A WORD OF EEPROM.
	INY                 ; PASS UP THE OPEN PAREN.
	JSR    RSKIPSPC     ; PASS UP ANY SPACES.
	JSR    DONEXP       ; GO GET THE "SUBSCRIPT" OF THE EEPROM LOCATION.
	INY                 ; PASS UP THE CLOSING PAREN.
	INY                 ; PASS UP THE EQUALS TOKEN.
	JSR    DONEXP       ; GET VALUE TO FROGRAM INTO EEPROM.
	PSHY                ; SAVE THE Y REG.
	LDY    NUMSTACK     ; POINT TO THE NUMERIC STACK.
	LDD    2,Y          ; GET THE SUBSCRIPT FOR THE EEPROM LOCATION.
	BMI    REEP1        ; NEGATIVE SUBSCRIPTS NOT ALLOWED.
	CPD    #MAXEESUB    ; IS THE SUBSCRIPT WITHIN RANGE?
	BLS    REEP2        ; YES. CONTINUE.
REEP1:	LDAA   #EESUBERR    ; EEPROM SUBSCRIPT ERROR.
	JMP    RPTRERR      ; REPORT IT.
REEP2:	LSLD                ; MULT THE SUBSCRIPT BY 2.
	ADDD   #EEPBASAD    ; ADD IN THE EEPROM BASE ADDRESS.
	XGDX                ; PUT THE ADDRESS INTO X.
	LDAA   0,X          ; GET THE MOST SIGNIFIGANT BYTE OF THE CURRENT NUM.
	CMPA   #$FF         ; DOES IT NEED ERASING?
	BEQ    REEP3        ; NO. SEE IF NEXT BYTE NEEDS ERASING.
	BSR    ERASEBYT     ; YES. GO ERASE IT.
REEP3:	INX                 ; POINT TO NEXT BYTE.
	LDAA   0,X          ; GET NEXT BYTE.
	CMPA   #$FF         ; DOES THIS BYTE NEED TO BE ERASED?
	BEQ    REEP4        ; NO. GO WRITE DATA TO EEPROM.
	BSR    ERASEBYT     ; YES. GO ERASE THE BYTE.
REEP4:	LDAA   1,Y          ; GET LS BYTE OF WORD.
	BSR    PROGBYTE     ; GO PROGRAM THE BYTE.
	DEX                 ; POINT TO THE MOST SIGNIFIGANT EEPROM LOCATION.
	LDAA   0,Y          ; GET THE MS BYTE OF THE WORD.
	BSR    PROGBYTE     ; GO PROGRAM THE BYTE.
	PULY                ; RESTORE Y.
	JSR    PULNUM       ; FIX UP NUM STACK.
	JSR    PULNUM
	RTS                 ; RETURN.
*
*
ERASEBYT:	EQU    *
	PSHY
	LDY	IOBaseV	; Point to the base address of the I/O Registers.
	LDAB   #$16         ; SET UP BYTE ERASE MODE, ADDR LATCH, ERASE
	STAB   PPROG,Y      ; VOLTAGE OFF.
	STAA   0,X          ; LATCH ADDRESS.
	TPA		; GET CURRENT I-BIT STATUS.
	PSHA		; SAVE IT.
	SEI		; INHIBIT INTERRUPTS WHILE ERASING.
	LDAB   #$17         ; TURN ON ERASE VOLTAGE
	STAB   PPROG,Y
	BSR    DLY10MS      ; DELAY ABOUT 10 MS.
	LDAB   #$16         ; TURN PROGRAMING VOLTAGE OFF.
	STAB   PPROG,Y
	PULA                ; GET ORIGINAL I-BIT STATUS.
	TAP                 ; RESTORE IT.
	CLR    PPROG,Y
	PULY
	RTS                 ; RETURN.
*
*
PROGBYTE:	EQU    *
	PSHY
	LDY	IOBaseV	; Point to the base address of the I/O Registers.
PROGBYT2:	LDAB   #$02         ; SET UP NORMAL PROGRAMING MODE, ADDRESS/DATA
	STAB   PPROG,Y      ; LATCHED, PROGRAMING VOLTAGE OFF.
	STAA   0,X          ; LATCH DATA & ADDRESS.
	PSHA                ; SAVE THE DATA FOR COMPARE AFTER PROGRAMING.
	TPA                 ; GET CURRENT I-BIT STATUS.
	PSHA                ; SAVE IT.
	SEI                 ; INHIBIT INTERRUPTS WHILE PROGRAMING.
	LDAB   #$03         ; TURN ON PROGRAMING VOLTAGE.
	STAB   PPROG,Y
	BSR    DLY10MS      ; LEAVE IT ON FOR 10 MS.
	LDAB   #$02         ; NOW, TURN THE PROGRAMMING VOLTAGE OFF.
	STAB   PPROG,Y
	PULA                ; GET ORIGINAL I-BIT STATUS.
	TAP                 ; RESTORE IT.
	CLR    PPROG,Y      ; PUT THE EEPROM BACK IN THE READ MODE.
	PULA                ; RESTORE THE DATA TO SEE IF IT WAS PROGRAMMED.
	CMPA   0,X          ; WAS THE DATA WRITTEN PROPERLY?
	BNE    PROGBYT2     ; NO. TRY AGAIN.
	PULY		; Restore Y.
	RTS                 ; YES. RETURN.
*
*
DLY10MS:	EQU    *
	PSHX                ; SAVE X.
	LDX    #3330        ; GET DELAY CONSTANT.
DLY10MS1:	DEX                 ; DECREMENT THE COUNT. DONE?
	BNE    DLY10MS1     ; NO. DELAY SOME MORE.
	PULX                ; RESTORE X.
	RTS                 ; RETURN.
*
*
RINBYTE:	EQU    *
	JSR    CHCKDEV      ; GO CHECK FOR AN ALTERNATE DEVICE DESIGNATION.
	JSR    RVARPTR      ; GO GET POINTER TO THE BYTE INPUT VARIABLE.
	XGDX                ; PUT THE POINTER INTO X.
	JSR    INBYTE       ; GO GET A BYTE FROM THE SPECIFIED INPUT DEVICE.
	TAB                 ; PUT THE BYTE IN THE L.S.BYTE.
	CLRA                ; ZERO THE UPPER BYTE.
	STD    0,X          ; PUT IT IN THE VARIABLE.
	CLR    DEVNUM       ; RESET TO DEVICE #0.
	RTS                 ; RETURN.
*
*
RTIME:	EQU    *
	INY                 ; POINT PAST THE EQUALS TOKEN.
	JSR    DONEXP       ; GO EVALUATE THE EXPRESSION.
	JSR    PULNUM       ; GET THE NUMBER OFF THE STACK.
	STD    TIMEREG      ; PUT IT IN THE TIME REGISTER.
	RTS                 ; RETURN.
*
*
RRTIME:	equ	*
	sei		; disable interrupts.
	LDAA   #SWPRE+1	; ADD 1 TO NORMAL PRE SCALER.
	STAA   TIMEPRE	; SET UP THE SOFTWARE PRESCALER.
	LDX	IOBaseV	; Point to the I/O Base Address.
	ldd	TCNT,x	; get the current value of the timer counter.
	jsr	TIMINTS3	; go initialize the TOC using the timer interrupt code.
	clra
	clrb
	STD    TIMEREG      ; PUT IT IN THE TIME REGISTER.
	cli
	RTS                 ; RETURN.
*
*
RPACC:	EQU    *
	INY                 ; POINT PAST EQUALS TOKEN.
	JSR    DONEXP       ; EVALUATE THE EXPRESSION.
	JSR    PULNUM       ; GET THE NUMBER OFF THE STACK.
	TSTA                ; IS THE NUMBER WITHIN RANGE?
	BEQ    RPACC1       ; YES. GO SETUP THE PACC REGISTER.
	LDAA   #PACCARGE    ; NO. REPORT AN ERROR.
	JMP    RPTRERR
RPACC1:	LDX    IOBaseV
	STAB   PACNT,X      ; PUT NUMBER IN PULSE ACC.
	RTS                 ; RETURN.
*
*
RONTIME:	EQU    *
	BSR    CHCKIMID    ; NOT ALLOWED IN IMMIDIATE.
	JSR    DONEXP      ; GO EVALUATE THE TIME "MATCH" EXPRESSION.
	JSR    PULNUM      ; GET THE NUMBER OFF THE STACK.
	STD    TIMECMP     ; PUT IN THE COMPARE REGISTER.
	JSR    RSKIPSPC    ; SKIP SPACES.
	INY                ; PASS UP COMMA.
	JSR    RSKIPSPC    ; SKIP SPACES.
	STY    ONTIMLIN    ; SAVE THE POINTER TO THE LINE NUMBER.
	BRA    RONIRQ2     ; GO FINISH UP.
*
*
RONIRQ:	EQU    *
	BSR    CHCKIMID
	JSR    DONEXP      ; GO CHECK TO SEE IF WE ARE TO ENABLE OR DISABLE.
	JSR    RSKIPSPC    ; SKIP SPACES UP TO COMMA.
	INY                ; BYPASS COMMA.
	JSR    RSKIPSPC    ; SKIP SPACES UP TO LINE NUMBER.
	JSR    PULNUM      ; GET MODE. SHOULD WE ENABLE THE FUNCTION?
	BNE    RONIRQ1     ; YES.
	STD    ONIRQLIN    ; NO. MAKE THE LINE NUMBER 0.
	BRA    RONIRQ2     ; GO FINISH UP.
RONIRQ1:	STY    ONIRQLIN    ; SAVE THE POINTER TO THE LINE NUMBER,
RONIRQ2:	LDAB   #3          ; MOVE IP PAST THE LINE NUMBER.
	ABY
	RTS                ; RETURN.
*
*
RRETI:	EQU    *
	BSR    CHCKIMID
	TPA                 ; CHECK TO SEE IF THE INTERRUPT MASK IS SET.
	BITA   #$10         ; ARE WE IN AN INTERRUPT ROUTINE?
	BNE    RRETI1       ; SINCE THE IRQ MASK IS SET WE MUST BE.
	LDAA   #NOTINTER    ; NO. FLAG AN ERROR.
	JMP    RPTRERR      ; GO REPORT IT.
RRETI1:	LDD    SCURLINE     ; RESTORE THE MAIN PROGRAM CURRENT LINE.
	STD    CURLINE
	LDD    SADRNXLN     ; RESTORE MAIN PROGRAM "ADDRESS OF THE NEXT LINE".
	STD    ADRNXLIN
	INS                 ; TAKE THE RETURN ADDRESS OFF THE STACK.
	INS
	RTI                 ; GO BACK TO WHERE WE LEFT OFF.
*
*
CHCKIMID:	EQU    *
	TST    IMMID        ; ARE WE IN THE IMMIDIATE MODE?
	BEQ    CHCKIMI1     ; NO. JUST RETURN.
	LDAA   #NOTALERR    ; YES. THIS COMMAND NOT ALLOWED.
	JMP    RPTRERR      ; REPORT THE ERROR.
CHCKIMI1:	RTS                 ; RETURN.
*
*
RONPACC:	EQU    *
	BSR    CHCKIMID     ; THIS INSTRUCTION NOT ALLOWED IN IMMID MODE.
	JSR    DONEXP       ; GO EVALUATE THE COUNT MODE EXPRESSION.
	JSR    RSKIPSPC     ; SKIP SPACES.
	INY                 ; BYPASS THE COMMA.
	JSR    RSKIPSPC     ; SKIP SPACES AFTER COMMA.
	JSR    DONEXP       ; GO EVALUATE THE INTERRUPT MODE EXPRESSION.
	JSR    RSKIPSPC     ; SKIP SPACES.
	INY                 ; BYPASS THE COMMA.
	JSR    RSKIPSPC     ; SKIP SPACES AFTER THE COMMA.
	TPA		; GET CURRENT I-BIT STATUS.
	PSHA                ; SAVE IT.
	SEI                 ; INHIBIT INTERRUPTS.
	STY    ONPACLIN     ; SAVE POINTER TO INTERRUPT ROUTINE.
	JSR    PULNUM       ; GET INTERRUPT MODE OFF STACK.
RONPACC1:	CPD    #1           ; IS THE ARGUMENT <=1?
	BLS    RONPACC2     ; YES. ARG. OK.
RONPACC5:	LDAA   #INTMODER    ; NO. GET ERROR CODE.
	JMP    RPTRERR
RONPACC2:	LDAA   #$10         ; GET BIT TO ENABLE INTERRUPT.
	TSTB                ; WAS THE ARGUMENT 0?
	BEQ    RONPACC3     ; YES. GO ENABLE INTS. ON EACH COUNT.
	LSLA                ; NO. ENABLE INTS. ON PACC OVERFLOW ONLY.
RONPACC3:	LDX    IOBaseV
	STAA   TMSK2,X
	JSR    PULNUM       ; GET THE COUNT MODE OFF THE STACK.
	BNE    RONPACC4     ; GO SET THE MODE IF NOT 0.
	LDX    IOBaseV
	CLR    PACTL,X      ; TURN OFF THE PULSE ACCUMULATOR.
	STD    ONPACLIN     ; CLEAR POINTER TO LINE NUMBER.
	BRA    RONPACC6     ; GO CLEAN UP & RETURN.
RONPACC4:	CPD    #4           ; IS THE ARGUMENT IN RANGE?
	BHI    RONPACC5     ; YES. REPORT AN ERROR.
	ADDB   #3           ; GET BIT TO ENABLE PACC.
	LSLB
	LSLB
	LSLB
	LSLB
	LDX    IOBaseV
	STAB   PACTL,X      ; ENABLE THE PACC & SET MODE.
RONPACC6:	PULA                ; GET OLD I-BIT STATUS OFF STACK.
	TAP                 ; RESTORE OLD STATUS.
	LDAB   #3
	ABY                 ; PASS UP LINE NUMBER.
	RTS                 ; RETURN.
*
*

⌨️ 快捷键说明

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