?? basic-52.asm
字號:
; First the tokens for statements
;
DB 80H ;LET TOKEN
DB 'LET'
;
DB 81H ;CLEAR TOKEN
DB 'CLEAR'
;
DB 82H ;PUSH TOKEN
DB 'PUSH'
;
T_GOTO EQU 83H
;
DB 83H ;GO TO TOKEN
DB 'GOTO'
;
DB 84H ;TOGGLE TOKEN
DB 'PWM'
;
DB 85H ;PRINT HEX MODE 0
DB 'PH0.'
;
DB 86H ;USER IN TOKEN
DB 'UI'
;
DB 87H ;USER OUT TOKEN
DB 'UO'
;
DB 88H ;POP TOKEN
DB 'POP'
;
$EJECT
DB 89H ;PRINT TOKEN
DB 'PRINT'
DB 89H
DB 'P.' ;P. ALSO MEANS PRINT
DB 89H ;? ALSO
DB '?'
;
DB 8AH ;CALL TOKEN
DB 'CALL'
;
DB 8BH ;DIMENSION TOKEN
DB 'DIM'
;
DB 8CH ;STRING TOKEN
DB 'STRING'
;
DB 8DH ;SET BAUD RATE
DB 'BAUD'
;
DB 8EH ;CLOCK
DB 'CLOCK'
;
DB 8FH ;PRINT HEX MODE 1
DB 'PH1.'
;
T_STOP EQU 90H ;STOP TOKEN
DB T_STOP
DB 'STOP'
;
T_DIR EQU T_STOP ;NO DIRECT FROM HERE ON
;
DB T_STOP+1 ;ON TIMER INTERRUPT
DB 'ONTIME'
;
DB T_STOP+2 ;ON EXTERNAL INTERRUPT
DB 'ONEX1'
;
DB T_STOP+3 ;RETURN FROM INTERRUPT
DB 'RETI'
;
DB T_STOP+4 ;DO TOKEN
DB 'DO'
;
DB T_STOP+5 ;RESTORE TOKEN
DB 'RESTORE'
;
$EJECT
T_REM EQU T_STOP+6 ;REMARK TOKEN
DB T_REM
DB 'REM'
;
DB T_REM+1 ;NEXT TOKEN
DB 'NEXT'
;
DB T_REM+2 ;ON ERROR TOKEN
DB 'ONERR'
;
DB T_REM+3 ;ON TOKEN
DB 'ON'
;
DB T_REM+4 ;INPUT
DB 'INPUT'
;
DB T_REM+5 ;READ
DB 'READ'
;
T_DATA EQU T_REM+6 ;DATA
DB T_DATA
DB 'DATA'
;
DB T_DATA+1 ;RETURN
DB 'RETURN'
;
DB T_DATA+2 ;IF
DB 'IF'
;
T_GOSB EQU T_DATA+3 ;GOSUB
DB T_GOSB
DB 'GOSUB'
;
DB T_GOSB+1 ;FOR
DB 'FOR'
;
DB T_GOSB+2 ;WHILE
DB 'WHILE'
;
DB T_GOSB+3 ;UNTIL
DB 'UNTIL'
;
DB T_GOSB+4 ;END
DB 'END'
;
$EJECT
T_LAST EQU T_GOSB+5 ;LAST INITIAL TOKEN
;
T_TAB EQU T_LAST ;TAB TOKEN
DB T_TAB
DB 'TAB'
;
T_THEN EQU T_LAST+1 ;THEN TOKEN
DB T_THEN
DB 'THEN'
;
T_TO EQU T_LAST+2 ;TO TOKEN
DB T_TO
DB 'TO'
;
T_STEP EQU T_LAST+3 ;STEP TOKEN
DB T_STEP
DB 'STEP'
;
T_ELSE EQU T_LAST+4 ;ELSE TOKEN
DB T_ELSE
DB 'ELSE'
;
T_SPC EQU T_LAST+5 ;SPACE TOKEN
DB T_SPC
DB 'SPC'
;
T_CR EQU T_LAST+6
DB T_CR
DB 'CR'
;
DB T_CR+1
DB 'IDLE'
;
DB T_CR+2
DB 'ST@'
;
DB T_CR+3
DB 'LD@'
;
DB T_CR+4
DB 'PGM'
;
DB T_CR+5
DB 'RROM'
;
$EJECT
; Operator tokens
;
T_LPAR EQU 0E0H ;LEFT PAREN
DB T_LPAR
DB '('
;
DB T_LPAR+1 ;EXPONENTIAN
DB '**'
;
DB T_LPAR+2 ;FP MULTIPLY
DB '*'
;
T_ADD EQU T_LPAR+3
DB T_LPAR+3 ;ADD TOKEN
DB '+'
;
DB T_LPAR+4 ;DIVIDE TOKEN
DB '/'
;
T_SUB EQU T_LPAR+5 ;SUBTRACT TOKEN
DB T_SUB
DB '-'
;
DB T_LPAR+6 ;LOGICAL EXCLUSIVE OR
DB '.XOR.'
;
DB T_LPAR+7 ;LOGICAL AND
DB '.AND.'
;
DB T_LPAR+8 ;LOGICAL OR
DB '.OR.'
;
T_NEG EQU T_LPAR+9
;
T_EQU EQU T_LPAR+10 ;EQUAL
DB T_EQU
DB '='
;
DB T_LPAR+11 ;GREATER THAN OR EQUAL
DB '>='
;
DB T_LPAR+12 ;LESS THAN OR EQUAL
DB '<='
;
DB T_LPAR+13 ;NOT EQUAL
DB '<>'
;
DB T_LPAR+14 ;LESS THAN
DB '<'
;
DB T_LPAR+15 ;GREATER THAN
DB '>'
;
;
T_UOP EQU 0B0H ;UNARY OP BASE TOKEN
;
DB T_UOP ;ABS TOKEN
DB 'ABS'
;
DB T_UOP+1 ;INTEGER TOKEN
DB 'INT'
;
DB T_UOP+2 ;SIGN TOKEN
DB 'SGN'
;
DB T_UOP+3 ;GET TOKEN
DB 'NOT'
;
DB T_UOP+4 ;COSINE TOKEN
DB 'COS'
;
DB T_UOP+5 ;TANGENT TOKEN
DB 'TAN'
;
DB T_UOP+6 ;SINE TOKEN
DB 'SIN'
;
DB T_UOP+7 ;SQUARE ROOT TOKEN
DB 'SQR'
;
DB T_UOP+8 ;CBYTE TOKEN
DB 'CBY'
;
DB T_UOP+9 ;EXP (E TO THE X) TOKEN
DB 'EXP'
;
DB T_UOP+10
DB 'ATN'
;
DB T_UOP+11
DB 'LOG'
;
DB T_UOP+12 ;DBYTE TOKEN
DB 'DBY'
;
DB T_UOP+13 ;XBYTE TOKEN
DB 'XBY'
;
T_ULAST EQU T_UOP+14 ;LAST OPERATOR NEEDING PARENS
;
DB T_ULAST
DB 'PI'
;
DB T_ULAST+1 ;RND TOKEN
DB 'RND'
;
DB T_ULAST+2 ;GET TOKEN
DB 'GET'
;
DB T_ULAST+3 ;FREE TOKEN
DB 'FREE'
;
DB T_ULAST+4 ;LEN TOKEN
DB 'LEN'
;
T_XTAL EQU T_ULAST+5 ;CRYSTAL TOKEN
DB T_XTAL
DB 'XTAL'
;
T_MTOP EQU T_ULAST+6 ;MTOP
DB T_MTOP
DB 'MTOP'
;
T_IE EQU T_ULAST+8 ;IE REGISTER
DB T_IE
DB 'IE'
;
T_IP EQU T_ULAST+9 ;IP REGISTER
DB T_IP
DB 'IP'
;
TMR0 EQU T_ULAST+10 ;TIMER 0
DB TMR0
DB 'TIMER0'
;
TMR1 EQU T_ULAST+11 ;TIMER 1
DB TMR1
DB 'TIMER1'
;
TMR2 EQU T_ULAST+12 ;TIMER 2
DB TMR2
DB 'TIMER2'
;
T_TIME EQU T_ULAST+7 ;TIME
DB T_TIME
DB 'TIME'
;
TT2C EQU T_ULAST+13 ;T2CON
DB TT2C
DB 'T2CON'
;
TTC EQU T_ULAST+14 ;TCON
DB TTC
DB 'TCON'
;
TTM EQU T_ULAST+15 ;TMOD
DB TTM
DB 'TMOD'
;
TRC2 EQU T_ULAST+16 ;RCAP2
DB TRC2
DB 'RCAP2'
;
T_P1 EQU T_ULAST+17 ;P1
DB T_P1
DB 'PORT1'
;
T_PC EQU T_ULAST+18 ;PCON
DB T_PC
DB 'PCON'
;
T_ASC EQU T_ULAST+19 ;ASC TOKEN
DB T_ASC
DB 'ASC('
;
T_USE EQU T_ULAST+20 ;USING TOKEN
DB T_USE
DB 'USING('
DB T_USE
DB 'U.('
;
T_CHR EQU T_ULAST+21 ;CHR TOKEN
DB T_CHR
DB 'CHR('
;
$EJECT
T_CMND EQU 0F0H ;COMMAND BASE
;
DB 0F0H ;RUN TOKEN
DB 'RUN'
;
DB 0F1H ;LIST TOKEN
DB 'LIST'
;
DB 0F2H ;NULL TOKEN
DB 'NULL'
;
DB 0F3H ;NEW TOKEN
DB 'NEW'
;
DB 0F4H ;CONTINUE TOKEN
DB 'CONT'
;
DB 0F5H ;PROGRAM TOKEN
DB 'PROG'
;
DB 0F6H ;TRANSFER TOKEN
DB 'XFER'
;
DB 0F7H ;RAM MODE
DB 'RAM'
;
DB 0F8H ;ROM MODE
DB 'ROM'
;
DB 0F9H ;INTELLIGENT PROM PROGRAMMING
DB 'FPROG'
;
DB 0FFH ;END OF TABLE
;
; END OF INCLUDE LOOK52
;$INCLUDE(:F2:LOOK52.SRC)
;
EIG: DB 'EXTRA IGNORED"'
;
EXA: DB 'A-STACK"'
;
EXC: DB 'C-STACK"'
;
$EJECT
;$INCLUDE(:F2:BAS52.RST)
; BEGINNING
;**************************************************************
;
CRST: ; This performs system initialzation, it was moved here so the
; new power on reset functions could be tested in an 8751.
;
;**************************************************************
;
; First, initialize SFR's
;
MOV SCON,#5AH ;INITIALIZE SFR'S
MOV TMOD,#10H
MOV TCON,#54H
DB 75H ;MOV DIRECT, # OP CODE
DB 0C8H ;T2CON LOCATION
DB 34H ;CONFIGURATION BYTE
;
MOV DPTR,#2001H ;READ CODE AT 2001H
CLR A
MOVC A,@A+DPTR
CJNE A,#0AAH,$+6 ;IF IT IS AN AAH, DO USER RESET
LCALL 2090H
;
MOV R0,#IRAMTOP ;PUT THE TOP OF RAM IN R0
CLR A ;ZERO THE ACC
;
MOV @R0,A ;CLEAR INTERNAL MEMORY
DJNZ R0,$-1 ;LOOP TIL DONE
;
; Now, test the external memory
;
MOV SPSAV,#CMNDSP ;SET UP THE STACK
MOV SP,SPSAV
;
MOV BOFAH,#HIGH ROMADR
MOV BOFAL,#LOW ROMADR+17
MOV DPTR,#ROMADR ;GET THE BYTE AT 8000H
MOVX A,@DPTR
CLR C
SUBB A,#31H ;FOR BIAS
MOV MT1,A ;SAVE IN DIRECT MATH LOC
CLR ACC.2 ;SAVE FOR RESET
MOV R7,A ;SAVE IT IN R7
INC DPTR
ACALL L31DPI ;GET SAVED BAUD RATE
LCALL RCL
INC DPTR ;GET MEMTOP
ACALL L31DPI
MOV DPTR,#5FH ;READ THE EXTERNAL BYTE
MOVX A,@DPTR
MOV DPTR,#0 ;ESTABLISH BASE FOR CLEAR
CJNE A,#0A5H,CRS
MOV A,MT1
CLR ACC.0 ;CLEAR BIT ONE
XRL A,#4H
JZ CR2
;
CRS: CJNE R7,#2,$+5
SJMP $+5
CJNE R7,#3,$+7
ACALL CL_1
SJMP CR1
;
CR0: MOV R3,DPH ;SAVE THE DPTR
MOV R1,DPL
INC DPTR
MOV A,#5AH
MOVX @DPTR,A
MOVX A,@DPTR
CJNE A,#5AH,CR1
CLR A
MOVX @DPTR,A
CJNE R3,#0E0H,CR0
;
CR1: CJNE R3,#03H,$+3 ;NEED THIS MUCH RAM
JC CRST
MOV DPTR,#MEMTOP ;SAVE MEMTOP
ACALL S31DP2 ;SAVE MEMTOP AND SEED RCELL
ACALL CNEW ;CLEAR THE MEMORY AND SET UP POINTERS
;
CR2: ACALL RC1 ;SET UP STACKS IF NOT DONE
;
LCALL AXTAL0 ;DO THE CRYSTAL
MOV A,MT1 ;GET THE RESET BYTE
CJNE A,#5,$+6
LCALL 4039H
JNC BG1 ;CHECK FOR 0,1,2,3, OR 4
JNB ACC.0,BG3 ;NO RUN IF WRONG TYPE
MOV DPTR,#ROMADR+16
MOVX A,@DPTR ;READ THE BYTE
CJNE A,#55H,BG3
LJMP CRUN
;
BG1: CLR A ;DO BAUD RATE
MOV R3,A
MOV R1,A
MOV R0,#4
JB RXD,$ ;LOOP UNTIL A CHARACTER IS RECEIVED
;
BG2: DJNZ R0,$ ;FOUR CLOCKS, IN LOOP
CALL DEC3210+4 ;NINE CLOCKS
MOV R0,#2 ;ONE CLOCK
JNB RXD,BG2 ;TWO CLOCKS, LOOP UNTIL DONE
JB RXD,$ ;WAIT FOR STOP CHARACTER TO END
JNB RXD,$
CALL RCL ;LOAD THE TIMER
;
BG3: MOV DPTR,#S_N ;GET THE MESSAGE
ACALL CRP ;PRINT IT
LJMP CRAM
; END
;$INCLUDE(:F2:BAS52.RST)
;
$EJECT
;***************************************************************
;
; CIPROG AND CPROG - Program a prom
;
;***************************************************************
;
;$INCLUDE(:F2:BAS52.PGM)
;BEGINNING
PG8: MOV R7,#00H ;PROGRAM ONE BYTE AT A TIME
MOV R6,#01H
MOV R2,#HIGH ROMADR-1
MOV R0,#LOW ROMADR-1;LOAD PROM ADDRESS
ACALL PG1+3
INC R6
DB 0E5H ;MOV A DIRECT OP CODE
DB 0CBH ;ADDRESS OF R2CAP HIGH
ACALL PG1+3
DB 0E5H ;MOV A, DIRECT OP CODE
DB 0CAH ;R2CAP LOW
MOV R6,#3
MOV R1,#LOW MEMTOP-1
MOV R3,#HIGH MEMTOP
ACALL PG1+3 ;SAVE MEMTOP
SJMP PGR
;
CIPROG: MOV DPTR,#IPROGS ;LOAD IPROG LOCATION
SETB INTELB
SJMP $+7 ;GO DO PROG
;
CPROG: MOV DPTR,#PROGS ;LOAD PROG LOCATION
CLR INTELB
;
ACALL LD_T ;LOAD THE TIMER
CLR PROMV ;TURN ON THE PROM VOLTAGE
CALL DELTST ;SEE IF A CR
JNZ PG8 ;SAVE TIMER IF SO
MOV R4,#0FEH
SETB INBIT
ACALL ROMFD ;GET THE ROM ADDRESS OF THE LAST LOCATION
CALL TEMPD ;SAVE THE ADDRESS
MOV A,R4 ;GET COUNT
CPL A
CALL TWO_R2 ;PUT IT ON THE STACK
CALL FP_BASE+14 ;OUTPUT IT
ACALL CCAL ;GET THE PROGRAM
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -