📄 basic-52.sdi
字号:
0527,,TIMER_LOAD,TIMER_LOAD:; Load the timer
,,, ;
,,, ;*************************************************************
,,, ;
0527,B1 26,, ACALL $-1 ;DELAY FOUR CLOCKS
0529,C2 8E,, CLR TR1 ;STOP IT WHILE IT'S LOADED
052B,85 40 8D,, MOV TH1,T_HH
052E,85 41 8B,, MOV TL1,T_LL
0531,C2 8F,, CLR TF1 ;CLEAR THE OVERFLOW FLAG
0533,D2 8E,, SETB TR1 ;START IT NOW
0535,22,, RET
,,, ;
,,,
,,,;END
,,,;$INCLUDE(:F2:BAS52.TL)
,,,$EJECT
,,, ;***************************************************************
,,, ;
0536,,CROM,CROM: ; The command action routine - ROM - Run out of rom
,,, ;
,,, ;***************************************************************
,,, ;
0536,C2 17,, CLR CONB ;CAN'T CONTINUE IF MODE CHANGE
0538,B1 3D,, ACALL RO1 ;DO IT
,,, ;
053A,02 10 7E,C_K,C_K: LJMP CL3 ;EXIT
,,, ;
053D,12 0F 3E,RO1,RO1: CALL INTGER ;SEE IF INTGER PRESENT
0540,AC 00,, MOV R4,R0B0 ;SAVE THE NUMBER
0542,50 02,, JNC $+4
0544,7C 01,, MOV R4,#01H ;ONE IF NO INTEGER PRESENT
0546,B1 53,, ACALL ROMFD ;FIND THE PROGRAM
0548,BC 00 11,, CJNE R4,#0,RFX ;EXIT IF R4 <> 0
054B,A3,, INC DPTR ;BUMP PAST TAG
054C,85 83 13,, MOV BOFAH,DPH ;SAVE THE ADDRESS
054F,85 82 14,, MOV BOFAL,DPL
0552,22,, RET
,,, ;
0553,90 80 10,ROMFD,ROMFD: MOV DPTR,#ROMADR+16 ;START OF USER PROGRAM
,,, ;
0556,E0,RF1,RF1: MOVX A,@DPTR ;GET THE BYTE
0557,B4 55 09,, CJNE A,#55H,RF3 ;SEE IF PROPER TAG
055A,DC 01,, DJNZ R4,RF2 ;BUMP COUNTER
,,, ;
055C,22,RFX,RFX: RET ;DPTR HAS THE START ADDRESS
,,, ;
055D,A3,RF2,RF2: INC DPTR ;BUMP PAST TAG
055E,B1 A4,, ACALL G5
0560,A3,, INC DPTR ;BUMP TO NEXT PROGRAM
0561,80 F3,, SJMP RF1 ;DO IT AGAIN
,,, ;
0563,10 1D F6,RF3,RF3: JBC INBIT,RFX ;EXIT IF SET
,,, ;
0566,90 1F C9,NOGO,NOGO: MOV DPTR,#NOROM
0569,81 D3,, AJMP ERRLK
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
056B,,L20DPI,L20DPI: ; load R2:R0 with the location the DPTR is pointing to
,,, ;
,,, ;***************************************************************
,,, ;
056B,E0,, MOVX A,@DPTR
056C,FA,, MOV R2,A
056D,A3,, INC DPTR
056E,E0,, MOVX A,@DPTR
056F,F8,, MOV R0,A
0570,22,, RET ;DON'T BUMP DPTR
,,, ;
,,, ;***************************************************************
,,, ;
0571,,X31DP,X31DP: ; swap R3:R1 with DPTR
,,, ;
,,, ;***************************************************************
,,, ;
0571,CB,, XCH A,R3
0572,C5 83,, XCH A,DPH
0574,CB,, XCH A,R3
0575,C9,, XCH A,R1
0576,C5 82,, XCH A,DPL
0578,C9,, XCH A,R1
0579,22,, RET
,,, ;
,,, ;***************************************************************
,,, ;
057A,,LD_T,LD_T: ; Load the timer save location with the value the DPTR is
,,, ; pointing to.
,,, ;
,,, ;****************************************************************
,,, ;
057A,E0,, MOVX A,@DPTR
057B,F5 40,, MOV T_HH,A
057D,A3,, INC DPTR
057E,E0,, MOVX A,@DPTR
057F,F5 41,, MOV T_LL,A
0581,22,, 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.
,,, ;
,,, ;***************************************************************
,,, ;
0582,D2 29,GETEND,GETEND: SETB ENDBIT ;GET THE END OF THE PROGRAM
,,, ;
0584,12 0E A4,GETLIN,GETLIN: CALL DP_B ;GET BEGINNING ADDRESS
,,, ;
0587,12 0A AC,G1,G1: CALL B_C
058A,60 12,, JZ G3 ;EXIT WITH A ZERO IN A IF AT END
058C,A3,, INC DPTR ;POINT AT THE LINE NUMBER
058D,20 29 0A,, JB ENDBIT,G2 ;SEE IF WE WANT TO FIND THE END
0590,B1 C4,, ACALL DCMPX ;SEE IF (DPTR) = R3:R1
0592,B1 BA,, ACALL DECDP ;POINT AT LINE COUNT
0594,E0,, MOVX A,@DPTR ;PUT LINE LENGTH INTO ACC
0595,20 2A 06,, JB UBIT,G3 ;EXIT IF EQUAL
0598,40 04,, JC G3 ;SEE IF LESS THAN OR ZERO
,,, ;
059A,B1 D6,G2,G2: ACALL ADDPTR ;ADD IT TO DPTR
059C,80 E9,, SJMP G1 ;LOOP
,,, ;
059E,C2 29,G3,G3: CLR ENDBIT ;RESET ENDBIT
05A0,22,, RET ;EXIT
,,, ;
05A1,90 02 00,G4,G4: MOV DPTR,#PSTART ;DO RAM
,,, ;
05A4,D2 29,G5,G5: SETB ENDBIT
05A6,80 DF,, 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
,,, ;
,,, ;***************************************************************
,,, ;
05A8,E0,LDPTRI,LDPTRI: MOVX A,@DPTR ;GET THE HIGH BYTE
05A9,C0 E0,, PUSH ACC ;SAVE IT
05AB,A3,, INC DPTR ;BUMP THE POINTER
05AC,E0,, MOVX A,@DPTR ;GET THE LOW BYTE
05AD,F5 82,, MOV DPL,A ;PUT IT IN DPL
05AF,D0 83,, POP DPH ;GET THE HIGH BYTE
05B1,22,, RET ;GO BACK
,,, ;
,,, ;***************************************************************
,,, ;
,,, ;L31DPI - LOAD R3 WITH (DPTR) AND R1 WITH (DPTR+1)
,,, ;
,,, ;ACC GETS CLOBBERED
,,, ;
,,, ;***************************************************************
,,, ;
05B2,E0,L31DPI,L31DPI: MOVX A,@DPTR ;GET THE HIGH BYTE
05B3,FB,, MOV R3,A ;PUT IT IN THE REG
05B4,A3,, INC DPTR ;BUMP THE POINTER
05B5,E0,, MOVX A,@DPTR ;GET THE NEXT BYTE
05B6,F9,, MOV R1,A ;SAVE IT
05B7,22,, RET
,,, ;
,,, ;***************************************************************
,,, ;
,,, ;DECDP - DECREMENT THE DATA POINTER - USED TO SAVE SPACE
,,, ;
,,, ;***************************************************************
,,, ;
05B8,B1 BA,DECDP2,DECDP2: ACALL DECDP
,,, ;
05BA,C5 82,DECDP,DECDP: XCH A,DPL ;GET DPL
05BC,70 02,, JNZ $+4 ;BUMP IF ZERO
05BE,15 83,, DEC DPH
05C0,14,, DEC A ;DECREMENT IT
05C1,C5 82,, XCH A,DPL ;GET A BACK
05C3,22,, 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
,,, ;
,,, ;***************************************************************
,,, ;
05C4,C2 2A,DCMPX,DCMPX: CLR UBIT ;ASSUME NOT EQUAL
05C6,E0,, MOVX A,@DPTR ;GET THE BYTE
05C7,B5 03 0A,, 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
05CA,A3,, INC DPTR ;BUMP THE DATA POINTER
05CB,E0,, MOVX A,@DPTR ;GET THE BYTE
05CC,B1 BA,, ACALL DECDP ;PUT DPTR BACK
05CE,B5 01 03,, CJNE A,R1B0,D1 ;DO THE COMPARE
05D1,B3,, CPL C ;FLIP CARRY
,,, ;
05D2,B2 2A,, CPL UBIT ;SET IT
05D4,B3,D1,D1: CPL C ;GET THE CARRY RIGHT
05D5,22,, RET ;EXIT
,,, ;
,,, ;***************************************************************
,,, ;
,,, ; ADDPTR - Add acc to the dptr
,,, ;
,,, ; acc gets wasted
,,, ;
,,, ;***************************************************************
,,, ;
05D6,25 82,ADDPTR,ADDPTR: ADD A,DPL ;ADD THE ACC TO DPL
05D8,F5 82,, MOV DPL,A ;PUT IT IN DPL
05DA,50 02,, JNC $+4 ;JUMP IF NO CARRY
05DC,05 83,, INC DPH ;BUMP DPH
05DE,22,, RET ;EXIT
,,, ;
,,,$EJECT
,,, ;*************************************************************
,,, ;
05DF,,LCLR,LCLR: ; Set up the storage allocation
,,, ;
,,, ;*************************************************************
,,, ;
05DF,D1 92,, ACALL ICLR ;CLEAR THE INTERRUPTS
05E1,B1 A1,, ACALL G4 ;PUT END ADDRESS INTO DPTR
05E3,74 06,, MOV A,#6 ;ADJUST MATRIX SPACE
05E5,B1 D6,, ACALL ADDPTR ;ADD FOR PROPER BOUNDS
05E7,B1 71,, ACALL X31DP ;PUT MATRIX BOUNDS IN R3:R1
05E9,90 01 08,, MOV DPTR,#MT_ALL ;SAVE R3:R1 IN MATRIX FREE SPACE
05EC,B1 FD,, ACALL S31DP ;DPTR POINTS TO MEMTOP
05EE,B1 B2,, ACALL L31DPI ;LOAD MEMTOP INTO R3:R1
05F0,90 01 22,, MOV DPTR,#STR_AL ;GET MEMORY ALLOCATED FOR STRINGS
05F3,B1 A8,, ACALL LDPTRI
05F5,12 0A 0A,, CALL DUBSUB ;R3:R1 = MEMTOP - STRING ALLOCATION
05F8,90 01 04,, 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
,,, ;
,,, ;***************************************************************
,,, ;
05FB,B1 FD,S31DP2,S31DP2: ACALL S31DP ;DO IT TWICE
,,, ;
05FD,EB,S31DP,S31DP: MOV A,R3 ;GET R3 INTO ACC
05FE,F0,, MOVX @DPTR,A ;STORE IT
05FF,A3,, INC DPTR ;BUMP DPTR
0600,E9,, MOV A,R1 ;GET R1
0601,F0,, MOVX @DPTR,A ;STORE IT
0602,A3,, INC DPTR ;BUMP IT AGAIN TO SAVE PROGRAM SPACE
0603,22,, RET ;GO BACK
,,, ;
,,, ;
,,, ;***************************************************************
,,, ;
0604,,STRING,STRING: ; Allocate memory for strings
,,, ;
,,, ;***************************************************************
,,, ;
0604,12 0E 8E,, LCALL TWO ;R3:R1 = NUMBER, R2:R0 = LEN
0607,90 01 22,, MOV DPTR,#STR_AL ;SAVE STRING ALLOCATION
060A,B1 FD,, ACALL S31DP
060C,0E,, INC R6 ;BUMP
060D,8E 3F,, MOV S_LEN,R6 ;SAVE STRING LENGTH
060F,C1 5C,, 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
,,, ;
,,, ;***************************************************************
,,, ;
0611,90 01 04,F_VAR,F_VAR: MOV DPTR,#VARTOP ;PUT VARTOP IN DPTR
0614,B1 A8,, ACALL LDPTRI
0616,B1 B8,, ACALL DECDP2 ;ADJUST DPTR FOR LOOKUP
,,, ;
0618,E0,F_VAR0,F_VAR0: MOVX A,@DPTR ;LOAD THE VARIABLE
0619,60 20,, JZ F_VAR2 ;TEST IF AT THE END OF THE TABLE
061B,A3,, INC DPTR ;BUMP FOR NEXT BYTE
061C,B5 07 0F,, CJNE A,R7B0,F_VAR1 ;SEE IF MATCH
061F,E0,, MOVX A,@DPTR ;LOAD THE NAME
0620,B5 06 0B,, CJNE A,R6B0,F_VAR1
,,, ;
,,, ; Found the variable now adjust and put in R2:R0
,,, ;
0623,E5 82,DLD,DLD: MOV A,DPL ;R2:R0 = DPTR-2
0625,94 02,, SUBB A,#2
0627,F8,, MOV R0,A
0628,E5 83,, MOV A,DPH
062A,94 00,, SUBB A,#0 ;CARRY IS CLEARED
062C,FA,, MOV R2,A
062D,22,, RET
,,, ;
062E,E5 82,F_VAR1,F_VAR1: MOV A,DPL ;SUBTRACT THE STACK SIZE+ADJUST
0630,C3,, CLR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -