?? basic-52.asm
字號:
; December 18, 1986
; MS-DOS compatible Source code for MCS BASIC-52 (tm)
; Assembles with ASM51 Macro Assembler Version 2.2
;
; The following source code does not include the floating point math
; routines. These are seperately compiled using FP52.SRC.
;
; Both the BASIC.SRC and FP52.SRC programs assemble into ABSOLUTE
; object files, and do not need to be relocated or linked. The FP52
; object code and the BASIC object code, when compiled without modification
; of the source listings, create the same object code that is found on
; the MCS BASIC-52 Version 1.1 microcontrollers.
;
; The original source code had 7 "include" files that have been incorporated
; into this file for ease of assembly.
; These 7 files are: LOOK52.SRC, BAS52.RST, BAS52.PGM, BAS52.TL, BAS52.OUT,
; BAS52.PWM, and BAS52.CLK.
;
;
; Intel Corporation, Embedded Controller Operations
$EJECT
;**************************************************************
;
; TRAP VECTORS TO MONITOR
;
; RESET TAG (0AAH) ---------2001H
;
; TAG LOCATION (5AH) ------ 2002H
;
; EXTERNAL INTERRUPT 0 ---- 2040H
;
; COMMAND MODE ENTRY ------ 2048H
;
; SERIAL PORT ------------- 2050H
;
; MONITOR (BUBBLE) OUTPUT - 2058H
;
; MONITOR (BUBBLE) INPUT -- 2060H
;
; MONITOR (BUBBLE) CSTS --- 2068H
;
; GET USER JUMP VECTOR ---- 2070H
;
; GET USER LOOKUP VECTOR -- 2078H
;
; PRINT AT VECTOR --------- 2080H
;
; INTERRUPT PWM ----------- 2088H
;
; EXTERNAL RESET ---------- 2090H
;
; USER OUTPUT-------------- 4030H
;
; USER INPUT -------------- 4033H
;
; USER CSTS --------------- 4036H
;
; USER RESET -------------- 4039H
;
; USER DEFINED PRINT @ --- 403CH
;
;***************************************************************
;
$EJECT
;***************************************************************
;
; MCS - 51 - 8K BASIC VERSION 1.1
;
;***************************************************************
;
AJMP CRST ;START THE PROGRAM
;
ORG 3H
;
;***************************************************************
;
;EXTERNAL INTERRUPT 0
;
;***************************************************************
;
JB DRQ,STQ ;SEE IF DMA IS SET
PUSH PSW ;SAVE THE STATUS
LJMP 4003H ;JUMP TO USER IF NOT SET
;
ORG 0BH
;
;***************************************************************
;
;TIMER 0 OVERFLOW INTERRUPT
;
;***************************************************************
;
PUSH PSW ;SAVE THE STATUS
JB C_BIT,STJ ;SEE IF USER WANTS INTERRUPT
LJMP 400BH ;EXIT IF USER WANTS INTERRUPTS
;
ORG 13H
;
;***************************************************************
;
;EXTERNAL INTERRUPT 1
;
;***************************************************************
;
JB INTBIT,STK
PUSH PSW
LJMP 4013H
;
$EJECT
;
ORG 1BH
;
;***************************************************************
;
;TIMER 1 OVERFLOW INTERRUPT
;
;***************************************************************
;
PUSH PSW
LJMP CKS_I
;
STJ: LJMP I_DR ;DO THE INTERRUPT
;
;***************************************************************
;
;SERIAL PORT INTERRUPT
;
;***************************************************************
;
ORG 23H
;
PUSH PSW
JB SPINT,STU ;SEE IF MONITOR EANTS INTERRUPT
LJMP 4023H
;
ORG 2BH
;
;**************************************************************
;
;TIMER 2 OVERFLOW INTERRUPT
;
;**************************************************************
;
PUSH PSW
LJMP 402BH
;
$EJECT
;**************************************************************
;
;USER ENTRY
;
;**************************************************************
;
ORG 30H
;
LJMP IBLK ;LINK TO USER BLOCK
;
STQ: JB I_T0,STS ;SEE IF MONITOR WANTS IT
CLR DACK
JNB P3.2,$ ;WAIT FOR DMA TO END
SETB DACK
RETI
;
STS: LJMP 2040H ;GO TO THE MONITOR
;
STK: SETB INTPEN ;TELL BASIC AN INTERRUPT WAS RECEIVED
RETI
;
STU: LJMP 2050H ;SERIAL PORT INTERRUPT
;
$EJECT
;$INCLUDE(:F2:LOOK52.SRC)
; INCLUDED BELOW
;
;**************************************************************
;
; This is the equate table for 8052 basic.
;
;**************************************************************
;
; The register to direct equates for CJNE instructions.
;
R0B0 EQU 0
R1B0 EQU 1
R2B0 EQU 2
R3B0 EQU 3
R4B0 EQU 4
R5B0 EQU 5
R6B0 EQU 6
R7B0 EQU 7
;
; Register bank 1 contains the text pointer
; and the arg stack pointer.
;
TXAL EQU 8 ;R0 BANK 1 = TEXT POINTER LOW
ASTKA EQU 9 ;R1 BANK 1 = ARG STACK
TXAH EQU 10 ;R2 BANK 1 = TEXT POINTER HIGH
;
; Now five temporary locations that are used by basic.
;
TEMP1 EQU 11
TEMP2 EQU 12
TEMP3 EQU 13
TEMP4 EQU 14
TEMP5 EQU 15
;
$EJECT
; Register bank 2 contains the read text pointer
; and the control stack pointer.
;
RTXAL EQU 16 ;R0 BANK 2 = READ TEXT POINTER LOW
CSTKA EQU 17 ;R1 BANK 2 = CONTROL STACK POINTER
RTXAH EQU 18 ;R2 BANK 2 = READ TEXT POINTER HIGH
;
; Now some internal system equates.
;
BOFAH EQU 19 ;START OF THE BASIC PROGRAM, HIGH BYTE
BOFAL EQU 20 ;START OF THE BASIC PROGRAM, LOW BYTE
NULLCT EQU 21 ;NULL COUNT
PHEAD EQU 22 ;PRINT HEAD POSITION
FORMAT EQU 23
;
; Register bank 3 is for the user and can be loaded
; by basic
;
;
;
; Now everything else is used by basic.
; First the bit locations, these use bytes 34, 35, 36, 37 and 38
;
$EJECT
OTS BIT 16 ;34.0-ON TIME INSTRUCTION EXECUTED
INPROG BIT 17 ;34.1-INTERRUPT IN PROCESS
INTBIT BIT 18 ;34.2-INTERRUPT SET BIT
ON_ERR BIT 19 ;34.3-ON ERROR EXECUTED
OTI BIT 20 ;34.4-ON TIME INTERRUPT IN PROGRESS
LINEB BIT 21 ;34.5-LINE CHANGE OCCURED
INTPEN BIT 22 ;34.6-INTERRUPT PENDING BIT
CONB BIT 23 ;34.7-CAN CONTINUE IF SET
GTRD BIT 24 ;35.0-READ GET LOCATION
LPB BIT 25 ;35.1-PRINT TO LINE PRINTER PORT
CKS_B BIT 26 ;35.2-FOR PWM INTERRUPT
COB BIT 27 ;35.3-CONSOLE OUT BIT
; 0 = SERIAL PORT
; 1 = LINE PRINTER
COUB BIT 28 ;35.4-USER CONSOLE OUT BIT
; 0 = SERIAL PORT
; 1 = USER DRIVER
INBIT BIT 29 ;35.5-INITIALIZATION BIT
CIUB BIT 30 ;35.6-USER CONSOLE IN BIT
; 0 = SERIAL PORT
; 1 = USER ROUTINE
SPINT BIT 31 ;35.7-SERIAL PORT INTERRUPT
STOPBIT BIT 32 ;36.0-PROGRAM STOP ENCOUNTERED
U_IDL BIT 33 ;36.1-USER IDLE BREAK
INP_B BIT 34 ;36.2-SET DURING INPUT INSTRUCTION
;DCMPXZ BIT 35 ;36.3-DCMPX ZERO FLAG
ARGF BIT 36 ;36.4-ARG STACK HAS A VALUE
RETBIT BIT 37 ;36.5-RET FROM INTERRUPT EXECUTED
I_T0 BIT 38 ;36.6-TRAP INTERRUPT ZERO TO MON
UPB BIT 39 ;36.7-SET WHEN @ IS VALID
JKBIT BIT 40 ;37.0-WB TRIGGER
ENDBIT BIT 41 ;37.1-GET END OF PROGRAM
UBIT BIT 42 ;37.2-FOR DIM STATEMENT
ISAV BIT 43 ;37.3-SAVE INTERRUPT STATUS
BO BIT 44 ;37.4-BUBBLE OUTPUT
XBIT BIT 45 ;37.5-EXTERNAL PROGRAM PRESENT
C_BIT BIT 46 ;37.6-SET WHEN CLOCK RUNNING
DIRF BIT 47 ;37.7-DIRECT INPUT MODE
NO_C BIT 48 ;38.0-NO CONTROL C
DRQ BIT 49 ;38.1-DMA ENABLED
BI BIT 50 ;38.2-BUBBLE INPUT
INTELB BIT 51 ;38.3-INTELLIGENT PROM PROGRAMMING
C0ORX1 BIT 52 ;38.4-PRINT FROM ROM OR RAM
CNT_S BIT 53 ;38.5-CONTROL S ENCOUNTERED
ZSURP BIT 54 ;38.6-ZERO SUPRESS
HMODE BIT 55 ;38.7-HEX MODE PRINT
LP BIT P1.7 ;SOFTWARE LINE PRINTER
DACK BIT P1.6 ;DMA ACK
PROMV BIT P1.5 ;TURN ON PROM VOLTAGE
PROMP BIT P1.4 ;PROM PULSE
ALED BIT P1.3 ;ALE DISABLE
T_BIT BIT P1.2 ;I/O TOGGLE BIT
;
$EJECT
;
; The next location is a bit addressable byte counter
;
BABC EQU 39
;
; Now floating point and the other temps
;
; FP Uses to locations 03CH
;
; Now the stack designators.
;
SPSAV EQU 3EH
S_LEN EQU 3FH
T_HH EQU 40H
T_LL EQU 41H
INTXAH EQU 42H
INTXAL EQU 43H
MT1 EQU 45H
MT2 EQU 46H
MILLIV EQU 47H ;TIMER LOCATIONS
TVH EQU 48H
TVL EQU 49H
SAVE_T EQU 4AH
SP_H EQU 4BH ;SERIAL PORT TIME OUT
SP_L EQU 4CH
CMNDSP EQU 4DH ;SYSTEM STACK POINTER
IRAMTOP EQU 0FFH ;TOP OF RAM
STACKTP EQU 0FEH ;ARG AND CONTROL STACK TOPS
;
; The character equates
;
CR EQU 0DH ;CARRIAGE RETURN
LF EQU 0AH ;LINE FEED
BELL EQU 07H ;BELL CHARACTER
BS EQU 08H ;BACK SPACE
CNTRLC EQU 03H ;CONTROL C
CNTRLD EQU 04H ;CONTROL D
NULL EQU 00H ;NULL
;
$EJECT
;
; The internal system equates
;
LINLEN EQU 73 ;THE LENGTH OF AN INPUT LINE
EOF EQU 01 ;END OF FILE CHARACTER
ASTKAH EQU 01 ;ASTKA IS IN PAGE 1 OF RAM
CSTKAH EQU 00 ;CSTKA IS IN PAGE 0 OF RAM
FTYPE EQU 01 ;CONTROL STACK "FOR"
GTYPE EQU 02 ;CONTROL STACK "GOSUB"
DTYPE EQU 03 ;DO-WHILE/UNTIL TYPE
ROMADR EQU 8000H ;LOCATION OF ROM
;
; The floating point equates
;
FPSIZ EQU 6 ;NO. OF BYTES IN A FLOATING NUM
DIGIT EQU FPSIZ-2 ;THE MANTISSA OF A FLOATING NUM
STESIZ EQU FPSIZ+3 ;SIZE OF SYMBOL ADJUSTED TABLE ELEMENT
FP_BASE EQU 1993H ;BASE OF FLOATING POINT ROUTINES
PSTART EQU 512 ;START OF A PROGRAM IN RAM
FSIZE EQU FPSIZ+FPSIZ+2+2+1
;
$EJECT
;**************************************************************
;
USENT: ; User entry jump table
;
;**************************************************************
;
DW CMND1 ;(00, 00H)COMMAND MODE JUMP
DW IFIX ;(01, 01H)CONVERT FP TO INT
DW PUSHAS ;(02, 02H)PUSH VALUE ONTO ARG STACK
DW POPAS ;(03, 03H)POP VALUE OFF ARG STACK
DW PG1 ;(04, 04H)PROGRAM A PROM
DW INLINE ;(05, 05H)INPUT A LINE
DW UPRNT ;(06, 06H)PRINT A LINR
DW CRLF ;(07, 07H)OUTPUT A CRLF
;
;**************************************************************
;
; This is the operation jump table for arithmetics
;
;**************************************************************
;
OPTAB: DW ALPAR ;(08, 08H)LEFT PAREN
DW AEXP ;(09, 09H)EXPONENTAION
DW AMUL ;(10, 0AH)FP MUL
DW AADD ;(11, 0BH)FLOATING POINT ADD
DW ADIV ;(12, 0CH)FLOATING POINT DIVIDE
DW ASUB ;(13, 0DH)FLOATING POINT SUBTRACTION
DW AXRL ;(14, 0EH)XOR
DW AANL ;(15, 0FH)AND
DW AORL ;(16, 10H)OR
DW ANEG ;(17, 11H)NEGATE
DW AEQ ;(18, 12H)EQUAL
DW AGE ;(19, 13H)GREATER THAN OR EQUAL
DW ALE ;(20, 14H)LESS THAN OR EQUAL
DW ANE ;(21, 15H)NOT EQUAL
DW ALT ;(22, 16H)LESS THAN
DW AGT ;(23, 17H)GREATER THAN
;
$EJECT
;***************************************************************
;
; This is the jump table for unary operators
;
;***************************************************************
;
DW AABS ;(24, 18H)ABSOLUTE VALUE
DW AINT ;(25, 19H)INTEGER OPERATOR
DW ASGN ;(26, 1AH)SIGN OPERATOR
DW ANOT ;(27, 1BH)ONE'S COMPLEMENT
DW ACOS ;(28, 1CH)COSINE
DW ATAN ;(29, 1DH)TANGENT
DW ASIN ;(30, 1EH)SINE
DW ASQR ;(31, 1FH)SQUARE ROOT
DW ACBYTE ;(32, 20H)READ CODE
DW AETOX ;(33, 21H)E TO THE X
DW AATAN ;(34, 22H)ARC TANGENT
DW ALN ;(35, 23H)NATURAL LOG
DW ADBYTE ;(36, 24H)READ DATA MEMORY
DW AXBYTE ;(37, 25H)READ EXTERNAL MEMORY
DW PIPI ;(38, 26H)PI
DW ARND ;(39, 27H)RANDOM NUMBER
DW AGET ;(40, 28H)GET INPUT CHARACTER
DW AFREE ;(41, 29H)COMPUTE #BYTES FREE
DW ALEN ;(42, 2AH) COMPUTE LEN OF PORGRAM
DW AXTAL ;(43, 2BH) CRYSTAL
DW PMTOP ;(44, 2CH)TOP OF MEMORY
DW ATIME ;(45, 2DH) TIME
DW A_IE ;(46, 2EH) IE
DW A_IP ;(47, 2FH) IP
DW ATIM0 ;(48, 30H) TIMER 0
DW ATIM1 ;(49, 31H) TIMER 1
DW ATIM2 ;(50, 32H) TIMER 2
DW AT2CON ;(51, 33H) T2CON
DW ATCON ;(52, 34H) TCON
DW ATMOD ;(53, 35H) ATMOD
DW ARCAP2 ;(54, 36H) RCAP2
DW AP1 ;(55, 37H) P1
DW APCON ;(56, 38H) PCON
DW EXPRB ;(57, 39H) EVALUATE AN EXPRESSION
DW AXTAL1 ;(58, 3AH) CALCULATE CRYSTAL
DW LINE ;(59, 3BH) EDIT A LINE
DW PP ;(60, 3CH) PROCESS A LINE
DW UPPL-3 ;(61, 3DH) UNPROCESS A LINE
DW VAR ;(62, 3EH) FIND A VARIABLE
DW GC ;(63, 3FH) GET A CHARACTER
DW GCI ;(64, 40H) GET CHARACTER AND INCREMENT
DW INCHAR ;(65, 41H) INPUT A CHARACTER
DW CRUN ;(66, 42H) RUN A PROGRAM
$EJECT
OPBOL: DB 1 ;
;
DB 15 ;LEFT PAREN
DB 14 ;EXPONENTIAN **
DB 10 ;MUL
DB 8 ;ADD
DB 10 ;DIVIDE
DB 8 ;SUB
DB 3 ;XOR
DB 5 ;AND
DB 4 ;OR
DB 12 ;NEGATE
DB 6 ;EQ
DB 6 ;GT
DB 6 ;LT
DB 6 ;NE
DB 6 ;LE
DB 6 ;GE
;
UOPBOL: DB 15 ;AABS
DB 15 ;AAINT
DB 15 ;ASGN
DB 15 ;ANOT
DB 15 ;ACOS
DB 15 ;ATAN
DB 15 ;ASIN
DB 15 ;ASQR
DB 15 ;ACBYTE
DB 15 ;E TO THE X
DB 15 ;AATAN
DB 15 ;NATURAL LOG
DB 15 ;DBYTE
DB 15 ;XBYTE
;
$EJECT
;***************************************************************
;
; The ASCII printed messages.
;
;***************************************************************
;
STP: DB 'STOP"'
;
IAN: DB 'TRY AGAIN"'
;
RDYS: DB 'READY"'
;
INS: DB ' - IN LINE "'
;
;**************************************************************
;
; This is the command jump table
;
;**************************************************************
;
CMNDD: DW CRUN ;RUN
DW CLIST ;LIST
DW CNULL ;NULL
DW CNEW ;NEW
DW CCONT ;CONTINUE
DW CPROG ;PROGRAM A PROM
DW CXFER ;TRANSFER FROM ROM TO RAM
DW CRAM ;RAM MODE
DW CROM ;ROM MODE
DW CIPROG ;INTELLIGENT PROM PROGRAMMING
;
$EJECT
;***************************************************************
;
; This is the statement jump table.
;
;**************************************************************
;
STATD: ;
DW SLET ;LET 80H
DW SCLR ;CLEAR 81H
DW SPUSH ;PUSH VAR 82H
DW SGOTO ;GO TO 83H
DW STONE ;TONE 84H
DW SPH0 ;PRINT MODE 0 85H
DW SUI ;USER INPUT 86H
DW SUO ;USER OUTPUT 87H
DW SPOP ;POP VAR 88H
DW SPRINT ;PRINT 89H
DW SCALL ;CALL 8AH
DW SDIMX ;DIMENSION 8BH
DW STRING ;STRING ALLO 8CH
DW SBAUD ;SET BAUD 8DH
DW SCLOCK ;CLOCK 8EH
DW SPH1 ;PRINT MODE 1 8FH
;
; No direct mode from here on
;
DW SSTOP ;STOP 90H
DW SOT ;ON TIME 91H
DW SONEXT ;ON EXT INT 92H
DW SRETI ;RET FROM INT 93H
DW S_DO ;DO 94H
DW SRESTR ;RESTOR 95H
DW WCR ;REM 96H
DW SNEXT ;NEXT 97H
DW SONERR ;ON ERROR 98H
DW S_ON ;ON 99H
DW SINPUT ;INPUT 9AH
DW SREAD ;READ 9BH
DW FINDCR ;DATA 9CH
DW SRETRN ;RETURN 9DH
DW SIF ;IF 9EH
DW SGOSUB ;GOSUB 9FH
DW SFOR ;FOR A0H
DW SWHILE ;WHILE A1H
DW SUNTIL ;UNTIL A2H
DW CMND1 ;END A3H
DW I_DL ;IDLE A4H
DW ST_A ;STORE AT A5H
DW LD_A ;LOAD AT A6H
DW PGU ;PGM A7H
DW RROM ;RUN A ROM A9H
;
$EJECT
;**************************************************************
;
TOKTAB: ; This is the basic token table
;
;**************************************************************
;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -