?? basic-52.asm
字號(hào):
ACALL CRLF ;DO CRLF
MOV R0,TEMP4 ;GET ADDRESS
MOV R2,TEMP5
MOV A,#55H ;LOAD SIGNIFIER
INC R6 ;LOAD LEN + 1
CJNE R6,#00,$+4
INC R7
ACALL PG2-2
;
$EJECT
PGR: SETB PROMV
AJMP C_K
;
PG1: MOV P2,R3 ;GET THE BYTE TO PROGRAM
MOVX A,@R1
LCALL INC3210 ;BUMP POINTERS
MOV R5,#1 ;SET UP INTELLIGENT COUMTER
;
PG2: MOV R4,A ;SAVE THE BYTE IN R4
ACALL PG7 ;PROGRAM THE BYTE
ACALL PG9
JB INTELB,PG4 ;SEE IF INTELLIGENT PROGRAMMING
;
PG3: XRL A,R4
JNZ PG6 ;ERROR IF NOT THE SAME
CALL DEC76 ;BUMP THE COUNTERS
JNZ PG1 ;LOOP IF NOT DONE
ANL PSW,#11100111B ;INSURE RB0
RET
;
PG4: XRL A,R4 ;SEE IF PROGRAMMED
JNZ PG5 ;JUMP IF NOT
MOV A,R4 ;GET THE DATA BACK
ACALL PG7 ;PROGRAM THE LOCATION
ACALL ZRO ;AGAIN
ACALL ZRO ;AND AGAIN
ACALL ZRO ;AND AGAIN
DJNZ R5,$-6 ;KEEP DOING IT
ACALL PG9 ;RESET PROG
SJMP PG3 ;FINISH THE LOOP
;
PG5: INC R5 ;BUMP THE COUNTER
MOV A,R4 ;GET THE BYTE
CJNE R5,#25,PG2 ;SEE IF TRIED 25 TIMES
;
PG6: SETB PROMV ;TURN OFF PROM VOLTAGE
MOV PSW,#0 ;INSURE RB0
JNB DIRF,PG4-1 ;EXIT IF IN RUN MODE
MOV DPTR,#E16X ;PROGRAMMING ERROR
;
ERRLK: LJMP ERROR ;PROCESS THE ERROR
;
$EJECT
PG7: MOV P0,R0 ;SET UP THE PORTS
MOV P2,R2 ;LATCH LOW ORDER ADDRESS
ACALL PG11 ;DELAY FOR 8748/9
CLR ALED
MOV P0,A ;PUT DATA ON THE PORT
;
ZRO: NOP ;SETTLEING TIME + FP ZERO
NOP
NOP
NOP
NOP
NOP
ACALL PG11 ;DELAY A WHILE
CLR PROMP ;START PROGRAMMING
ACALL TIMER_LOAD ;START THE TIMER
JNB TF1,$ ;WAIT FOR PART TO PROGRAM
RET ;EXIT
;
PG9: SETB PROMP
ACALL PG11 ;DELAY FOR A WHILE
JNB P3.2,$ ;LOOP FOR EEPROMS
MOV P0,#0FFH
CLR P3.7 ;LOWER READ
ACALL PG11
MOV A,P0 ;READ THE PORT
SETB P3.7
SETB ALED
RET
;
PG11: MOV TEMP5,#12 ;DELAY 30uS AT 12 MHZ
DJNZ TEMP5,$
RET
;
;END
;$INCLUDE(:F2:BAS52.PGM)
$EJECT
;**************************************************************
;
PGU: ;PROGRAM A PROM FOR THE USER
;
;**************************************************************
;
CLR PROMV ;TURN ON THE VOLTAGE
MOV PSW,#00011000B ;SELECT RB3
ACALL PG1 ;DO IT
SETB PROMV ;TURN IT OFF
RET
;
;
;*************************************************************
;
CCAL: ; Set up for prom moves
; R3:R1 gets source
; R7:R6 gets # of bytes
;
;*************************************************************
;
ACALL GETEND ;GET THE LAST LOCATION
INC DPTR ;BUMP TO LOAD EOF
MOV R3,BOFAH
MOV R1,BOFAL ;RESTORE START
CLR C ;PREPARE FOR SUBB
MOV A,DPL ;SUB DPTR - BOFA > R7:R6
SUBB A,R1
MOV R6,A
MOV A,DPH
SUBB A,R3
MOV R7,A
RET
;
;
;$INCLUDE(:F2:BAS52.TL)
;BEGINNING
;**************************************************************
;
TIMER_LOAD:; Load the timer
;
;*************************************************************
;
ACALL $-1 ;DELAY FOUR CLOCKS
CLR TR1 ;STOP IT WHILE IT'S LOADED
MOV TH1,T_HH
MOV TL1,T_LL
CLR TF1 ;CLEAR THE OVERFLOW FLAG
SETB TR1 ;START IT NOW
RET
;
;END
;$INCLUDE(:F2:BAS52.TL)
$EJECT
;***************************************************************
;
CROM: ; The command action routine - ROM - Run out of rom
;
;***************************************************************
;
CLR CONB ;CAN'T CONTINUE IF MODE CHANGE
ACALL RO1 ;DO IT
;
C_K: LJMP CL3 ;EXIT
;
RO1: CALL INTGER ;SEE IF INTGER PRESENT
MOV R4,R0B0 ;SAVE THE NUMBER
JNC $+4
MOV R4,#01H ;ONE IF NO INTEGER PRESENT
ACALL ROMFD ;FIND THE PROGRAM
CJNE R4,#0,RFX ;EXIT IF R4 <> 0
INC DPTR ;BUMP PAST TAG
MOV BOFAH,DPH ;SAVE THE ADDRESS
MOV BOFAL,DPL
RET
;
ROMFD: MOV DPTR,#ROMADR+16 ;START OF USER PROGRAM
;
RF1: MOVX A,@DPTR ;GET THE BYTE
CJNE A,#55H,RF3 ;SEE IF PROPER TAG
DJNZ R4,RF2 ;BUMP COUNTER
;
RFX: RET ;DPTR HAS THE START ADDRESS
;
RF2: INC DPTR ;BUMP PAST TAG
ACALL G5
INC DPTR ;BUMP TO NEXT PROGRAM
SJMP RF1 ;DO IT AGAIN
;
RF3: JBC INBIT,RFX ;EXIT IF SET
;
NOGO: MOV DPTR,#NOROM
AJMP ERRLK
;
$EJECT
;***************************************************************
;
L20DPI: ; load R2:R0 with the location the DPTR is pointing to
;
;***************************************************************
;
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R0,A
RET ;DON'T BUMP DPTR
;
;***************************************************************
;
X31DP: ; swap R3:R1 with DPTR
;
;***************************************************************
;
XCH A,R3
XCH A,DPH
XCH A,R3
XCH A,R1
XCH A,DPL
XCH A,R1
RET
;
;***************************************************************
;
LD_T: ; Load the timer save location with the value the DPTR is
; pointing to.
;
;****************************************************************
;
MOVX A,@DPTR
MOV T_HH,A
INC DPTR
MOVX A,@DPTR
MOV T_LL,A
RET
;
$EJECT
;
;***************************************************************
;
;GETLIN - FIND THE LOCATION OF THE LINE NUMBER IN R3:R1
; IF ACC = 0 THE LINE WAS NOT FOUND I.E. R3:R1
; WAS TOO BIG, ELSE ACC <> 0 AND THE DPTR POINTS
; AT THE LINE THAT IS GREATER THAN OR EQUAL TO THE
; VALUE IN R3:R1.
;
;***************************************************************
;
GETEND: SETB ENDBIT ;GET THE END OF THE PROGRAM
;
GETLIN: CALL DP_B ;GET BEGINNING ADDRESS
;
G1: CALL B_C
JZ G3 ;EXIT WITH A ZERO IN A IF AT END
INC DPTR ;POINT AT THE LINE NUMBER
JB ENDBIT,G2 ;SEE IF WE WANT TO FIND THE END
ACALL DCMPX ;SEE IF (DPTR) = R3:R1
ACALL DECDP ;POINT AT LINE COUNT
MOVX A,@DPTR ;PUT LINE LENGTH INTO ACC
JB UBIT,G3 ;EXIT IF EQUAL
JC G3 ;SEE IF LESS THAN OR ZERO
;
G2: ACALL ADDPTR ;ADD IT TO DPTR
SJMP G1 ;LOOP
;
G3: CLR ENDBIT ;RESET ENDBIT
RET ;EXIT
;
G4: MOV DPTR,#PSTART ;DO RAM
;
G5: SETB ENDBIT
SJMP G1 ;NOW DO TEST
;
$EJECT
;***************************************************************
;
; LDPTRI - Load the DATA POINTER with the value it is pointing
; to - DPH = (DPTR) , DPL = (DPTR+1)
;
; acc gets wasted
;
;***************************************************************
;
LDPTRI: MOVX A,@DPTR ;GET THE HIGH BYTE
PUSH ACC ;SAVE IT
INC DPTR ;BUMP THE POINTER
MOVX A,@DPTR ;GET THE LOW BYTE
MOV DPL,A ;PUT IT IN DPL
POP DPH ;GET THE HIGH BYTE
RET ;GO BACK
;
;***************************************************************
;
;L31DPI - LOAD R3 WITH (DPTR) AND R1 WITH (DPTR+1)
;
;ACC GETS CLOBBERED
;
;***************************************************************
;
L31DPI: MOVX A,@DPTR ;GET THE HIGH BYTE
MOV R3,A ;PUT IT IN THE REG
INC DPTR ;BUMP THE POINTER
MOVX A,@DPTR ;GET THE NEXT BYTE
MOV R1,A ;SAVE IT
RET
;
;***************************************************************
;
;DECDP - DECREMENT THE DATA POINTER - USED TO SAVE SPACE
;
;***************************************************************
;
DECDP2: ACALL DECDP
;
DECDP: XCH A,DPL ;GET DPL
JNZ $+4 ;BUMP IF ZERO
DEC DPH
DEC A ;DECREMENT IT
XCH A,DPL ;GET A BACK
RET ;EXIT
;
$EJECT
;***************************************************************
;
;DCMPX - DOUBLE COMPARE - COMPARE (DPTR) TO R3:R1
;R3:R1 - (DPTR) = SET CARRY FLAG
;
;IF R3:R1 > (DPTR) THEN C = 0
;IF R3:R1 < (DPTR) THEN C = 1
;IF R3:R1 = (DPTR) THEN C = 0
;
;***************************************************************
;
DCMPX: CLR UBIT ;ASSUME NOT EQUAL
MOVX A,@DPTR ;GET THE BYTE
CJNE A,R3B0,D1 ;IF A IS GREATER THAN R3 THEN NO CARRY
;WHICH IS R3<@DPTR = NO CARRY AND
;R3>@DPTR CARRY IS SET
INC DPTR ;BUMP THE DATA POINTER
MOVX A,@DPTR ;GET THE BYTE
ACALL DECDP ;PUT DPTR BACK
CJNE A,R1B0,D1 ;DO THE COMPARE
CPL C ;FLIP CARRY
;
CPL UBIT ;SET IT
D1: CPL C ;GET THE CARRY RIGHT
RET ;EXIT
;
;***************************************************************
;
; ADDPTR - Add acc to the dptr
;
; acc gets wasted
;
;***************************************************************
;
ADDPTR: ADD A,DPL ;ADD THE ACC TO DPL
MOV DPL,A ;PUT IT IN DPL
JNC $+4 ;JUMP IF NO CARRY
INC DPH ;BUMP DPH
RET ;EXIT
;
$EJECT
;*************************************************************
;
LCLR: ; Set up the storage allocation
;
;*************************************************************
;
ACALL ICLR ;CLEAR THE INTERRUPTS
ACALL G4 ;PUT END ADDRESS INTO DPTR
MOV A,#6 ;ADJUST MATRIX SPACE
ACALL ADDPTR ;ADD FOR PROPER BOUNDS
ACALL X31DP ;PUT MATRIX BOUNDS IN R3:R1
MOV DPTR,#MT_ALL ;SAVE R3:R1 IN MATRIX FREE SPACE
ACALL S31DP ;DPTR POINTS TO MEMTOP
ACALL L31DPI ;LOAD MEMTOP INTO R3:R1
MOV DPTR,#STR_AL ;GET MEMORY ALLOCATED FOR STRINGS
ACALL LDPTRI
CALL DUBSUB ;R3:R1 = MEMTOP - STRING ALLOCATION
MOV DPTR,#VARTOP ;SAVE R3:R1 IN VARTOP
;
; FALL THRU TO S31DP2
;
;***************************************************************
;
;S31DP - STORE R3 INTO (DPTR) AND R1 INTO (DPTR+1)
;
;ACC GETS CLOBBERED
;
;***************************************************************
;
S31DP2: ACALL S31DP ;DO IT TWICE
;
S31DP: MOV A,R3 ;GET R3 INTO ACC
MOVX @DPTR,A ;STORE IT
INC DPTR ;BUMP DPTR
MOV A,R1 ;GET R1
MOVX @DPTR,A ;STORE IT
INC DPTR ;BUMP IT AGAIN TO SAVE PROGRAM SPACE
RET ;GO BACK
;
;
;***************************************************************
;
STRING: ; Allocate memory for strings
;
;***************************************************************
;
LCALL TWO ;R3:R1 = NUMBER, R2:R0 = LEN
MOV DPTR,#STR_AL ;SAVE STRING ALLOCATION
ACALL S31DP
INC R6 ;BUMP
MOV S_LEN,R6 ;SAVE STRING LENGTH
AJMP RCLEAR ;CLEAR AND SET IT UP
;
$EJECT
;***************************************************************
;
; F_VAR - Find the variable in symbol table
; R7:R6 contain the variable name
; If not found create a zero entry and set the carry
; R2:R0 has the address of variable on return
;
;***************************************************************
;
F_VAR: MOV DPTR,#VARTOP ;PUT VARTOP IN DPTR
ACALL LDPTRI
ACALL DECDP2 ;ADJUST DPTR FOR LOOKUP
;
F_VAR0: MOVX A,@DPTR ;LOAD THE VARIABLE
JZ F_VAR2 ;TEST IF AT THE END OF THE TABLE
INC DPTR ;BUMP FOR NEXT BYTE
CJNE A,R7B0,F_VAR1 ;SEE IF MATCH
MOVX A,@DPTR ;LOAD THE NAME
CJNE A,R6B0,F_VAR1
;
; Found the variable now adjust and put in R2:R0
;
DLD: MOV A,DPL ;R2:R0 = DPTR-2
SUBB A,#2
MOV R0,A
MOV A,DPH
SUBB A,#0 ;CARRY IS CLEARED
MOV R2,A
RET
;
F_VAR1: MOV A,DPL ;SUBTRACT THE STACK SIZE+ADJUST
CLR C
SUBB A,#STESIZ
MOV DPL,A ;RESTORE DPL
JNC F_VAR0
DEC DPH
SJMP F_VAR0 ;CONTINUE COMPARE
;
$EJECT
;
; Add the entry to the symbol table
;
F_VAR2: LCALL R76S ;SAVE R7 AND R6
CLR C
ACALL DLD ;BUMP THE POINTER TO GET ENTRY ADDRESS
;
; Adjust pointer and save storage allocation
; and make sure we aren't wiping anything out
; First calculate new storage allocation
;
MOV A,R0
SUBB A,#STESIZ-3 ;NEED THIS MUCH RAM
MOV R1,A
MOV A,R2
SUBB A,#0
MOV R3,A
;
; Now save the new storage allocation
;
MOV DPTR,#ST_ALL
CALL S31DP ;SAVE STORAGE ALLOCATION
;
; Now make sure we didn't blow it, by wiping out MT_ALL
;
ACALL DCMPX ;COMPARE STORAGE ALLOCATION
JC CCLR3 ;ERROR IF CARRY
SETB C ;DID NOT FIND ENTRY
RET ;EXIT IF TEST IS OK
;
$EJECT
;***************************************************************
;
; Command action routine - NEW
;
;***************************************************************
;
CNEW: MOV DPTR,#PSTART ;SAVE THE START OF PROGRAM
MOV A,#EOF ;END OF FILE
MOVX @DPTR,A ;PUT IT IN MEMORY
;
; falls thru
;
;*****************************************************************
;
; The statement action routine - CLEAR
;
;*****************************************************************
;
CLR LINEB ;SET UP FOR RUN AND GOTO
;
RCLEAR: ACALL LCLR ;CLEAR THE INTERRUPTS, SET UP MATRICES
MOV DPTR,#MEMTOP ;PUT MEMTOP IN R3:R1
ACALL L31DPI
ACALL G4 ;DPTR GETS END ADDRESS
ACALL CL_1 ;CLEAR THE MEMORY
;
RC1: MOV DPTR,#STACKTP ;POINT AT CONTROL STACK TOP
CLR A ;CONTROL UNDERFLOW
;
RC2: MOVX @DPTR,A ;SAVE IN MEMORY
MOV CSTKA,#STACKTP
MOV ASTKA,#STACKTP
CLR CONB ;CAN'T CONTINUE
RET
;
$EJECT
;***************************************************************
;
; Loop until the memory is cleared
;
;***************************************************************
;
CL_1: INC DPTR ;BUMP MEMORY POINTER
CLR A ;CLEAR THE MEMORY
MOVX @DPTR,A ;CLEAR THE RAM
MOVX A,@DPTR ;READ IT
JNZ CCLR3 ;MAKE SURE IT IS CLEARED
MOV A,R3 ;GET POINTER FOR COMPARE
CJNE A,DPH,CL_1 ;SEE TO LOOP
MOV A,R1 ;NOW TEST LOW BYTE
CJNE A,DPL,CL_1
;
CL_2: RET
;
CCLR3: JMP TB ;ALLOCATED MEMORY DOESN'T EXSIST
;
;**************************************************************
;
SCLR: ;Entry point for clear return
;
;**************************************************************
;
CALL DELTST ;TEST FOR A CR
JNC RCLEAR
CALL GCI1 ;BUMP THE TEST POINTER
CJNE A,#'I',RC1 ;SEE IF I, ELSE RESET THE STACK
;
;**************************************************************
;
ICLR: ; Clear interrupts and system garbage
;
;**************************************************************
;
JNB INTBIT,$+5 ;SEE IF BASIC HAS INTERRUPTS
CLR EX1 ;IF SO, CLEAR INTERRUPTS
ANL 34,#00100000B ;SET INTERRUPTS + CONTINUE
RETI
;
$EJECT
;***************************************************************
;
;OUTPUT ROUTINES
;
;***************************************************************
;
CRLF2: ACALL CRLF ;DO TWO CRLF'S
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -