📄 basic-52.sdi
字号:
,,,; 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
,,, ;
,,, ;***************************************************************
,,, ;
0000,61 87,, AJMP CRST ;START THE PROGRAM
,,, ;
,,, ORG 3H
,,, ;
,,, ;***************************************************************
,,, ;
,,, ;EXTERNAL INTERRUPT 0
,,, ;
,,, ;***************************************************************
,,, ;
0003,20 31 2D,, JB DRQ,STQ ;SEE IF DMA IS SET
0006,C0 D0,, PUSH PSW ;SAVE THE STATUS
0008,02 40 03,, LJMP 4003H ;JUMP TO USER IF NOT SET
,,, ;
,,, ORG 0BH
,,, ;
,,, ;***************************************************************
,,, ;
,,, ;TIMER 0 OVERFLOW INTERRUPT
,,, ;
,,, ;***************************************************************
,,, ;
000B,C0 D0,, PUSH PSW ;SAVE THE STATUS
000D,20 2E 10,, JB C_BIT,STJ ;SEE IF USER WANTS INTERRUPT
0010,02 40 0B,, LJMP 400BH ;EXIT IF USER WANTS INTERRUPTS
,,, ;
,,, ORG 13H
,,, ;
,,, ;***************************************************************
,,, ;
,,, ;EXTERNAL INTERRUPT 1
,,, ;
,,, ;***************************************************************
,,, ;
0013,20 12 2B,, JB INTBIT,STK
0016,C0 D0,, PUSH PSW
0018,02 40 13,, LJMP 4013H
,,, ;
,,,$EJECT
,,, ;
,,, ORG 1BH
,,, ;
,,, ;***************************************************************
,,, ;
,,, ;TIMER 1 OVERFLOW INTERRUPT
,,, ;
,,, ;***************************************************************
,,, ;
001B,C0 D0,, PUSH PSW
001D,02 1F 78,, LJMP CKS_I
,,, ;
0020,02 19 03,STJ,STJ: LJMP I_DR ;DO THE INTERRUPT
,,, ;
,,, ;***************************************************************
,,, ;
,,, ;SERIAL PORT INTERRUPT
,,, ;
,,, ;***************************************************************
,,, ;
,,, ORG 23H
,,, ;
0023,C0 D0,, PUSH PSW
0025,20 1F 1C,, JB SPINT,STU ;SEE IF MONITOR EANTS INTERRUPT
0028,02 40 23,, LJMP 4023H
,,, ;
,,, ORG 2BH
,,, ;
,,, ;**************************************************************
,,, ;
,,, ;TIMER 2 OVERFLOW INTERRUPT
,,, ;
,,, ;**************************************************************
,,, ;
002B,C0 D0,, PUSH PSW
002D,02 40 2B,, LJMP 402BH
,,, ;
,,,$EJECT
,,, ;**************************************************************
,,, ;
,,, ;USER ENTRY
,,, ;
,,, ;**************************************************************
,,, ;
,,, ORG 30H
,,, ;
0030,02 19 3D,, LJMP IBLK ;LINK TO USER BLOCK
,,, ;
0033,20 26 08,STQ,STQ: JB I_T0,STS ;SEE IF MONITOR WANTS IT
0036,C2 96,, CLR DACK
0038,30 B2 FD,, JNB P3.2,$ ;WAIT FOR DMA TO END
003B,D2 96,, SETB DACK
003D,32,, RETI
,,, ;
003E,02 20 40,STS,STS: LJMP 2040H ;GO TO THE MONITOR
,,, ;
0041,D2 16,STK,STK: SETB INTPEN ;TELL BASIC AN INTERRUPT WAS RECEIVED
0043,32,, RETI
,,, ;
0044,02 20 50,STU,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
000B,,,LP BIT P1.7 ;SOFTWARE LINE PRINTER
000B,,,DACK BIT P1.6 ;DMA ACK
000B,,,PROMV BIT P1.5 ;TURN ON PROM VOLTAGE
000B,,,PROMP BIT P1.4 ;PROM PULSE
000B,,,ALED BIT P1.3 ;ALE DISABLE
000B,,,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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -