📄 runtime3.asm
字号:
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 + -