📄 fp52.sdi
字号:
,,, ;
0302,,LOADR1_MANTISSA,LOADR1_MANTISSA:
,,, ;
,,, ; Load the mantissa of R0 into FP_Digits
,,, ;
,,, ;***************************************************************
,,, ;
0302,C0 00,, PUSH R0B0 ;SAVE REGISTER 1
0304,78 2E,, MOV R0,#FP_DIG78 ;SET UP THE POINTER
,,, ;
0306,E3,LOADR1,LOADR1: MOVX A,@R1
0307,F6,, MOV @R0,A
0308,19,, DEC R1
0309,18,, DEC R0
030A,B8 2A F9,, CJNE R0,#FP_CARRY,LOADR1
,,, ;
030D,D0 00,, POP R0B0
030F,22,, RET
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
0310,,HEXSCAN,HEXSCAN: ; Scan a string to determine if it is a hex number
,,, ; set carry if hex, else carry = 0
,,, ;
,,, ;***************************************************************
,,, ;
0310,71 E6,, ACALL GET_DPTR_CHARACTER
0312,C0 83,, PUSH DPH
0314,C0 82,, PUSH DPL ;SAVE THE POINTER
,,, ;
0316,E0,HEXSC1,HEXSC1: MOVX A,@DPTR ;GET THE CHARACTER
0317,B1 F4,, ACALL DIGIT_CHECK ;SEE IF A DIGIT
0319,40 12,, JC HS1 ;CONTINUE IF A DIGIT
031B,71 30,, ACALL HEX_CHECK ;SEE IF HEX
031D,40 0E,, JC HS1
,,, ;
031F,C2 E5,, CLR ACC.5 ;NO LOWER CASE
0321,B4 48 03,, CJNE A,#'H',HEXDON
0324,D3,, SETB C
0325,80 01,, SJMP HEXDO1 ;NUMBER IS VALID HEX, MAYBE
,,, ;
0327,C3,HEXDON,HEXDON: CLR C
,,, ;
0328,D0 82,HEXDO1,HEXDO1: POP DPL ;RESTORE POINTER
032A,D0 83,, POP DPH
032C,22,, RET
,,, ;
032D,A3,HS1,HS1: INC DPTR ;BUMP TO NEXT CHARACTER
032E,80 E6,, SJMP HEXSC1 ;LOOP
,,, ;
0330,,HEX_CHECK,HEX_CHECK: ;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
,,, ;
0330,C2 E5,, CLR ACC.5 ;WASTE LOWER CASE
0332,B4 47 00,, CJNE A,#'F'+1,$+3 ;SEE IF F OR LESS
0335,40 01,, JC HC1
0337,22,, RET
,,, ;
0338,B4 41 00,HC1,HC1: CJNE A,#'A',$+3 ;SEE IF A OR GREATER
033B,B3,, CPL C
033C,22,, RET
,,, ;
,,,$EJECT
,,, ;
033D,,PUSHR2R0,PUSHR2R0:
,,, ;
033D,7B 00,, MOV R3,#HIGH CONVT ;CONVERSION LOCATION
033F,79 48,, MOV R1,#LOW CONVT
0341,B1 7E,, ACALL CONVERT_BINARY_TO_ASCII_STRING
0343,74 0D,, MOV A,#0DH ;A CR TO TERMINATE
0345,F3,, MOVX @R1,A ;SAVE THE CR
0346,90 00 48,, MOV DPTR,#CONVT
,,, ;
,,, ; Falls thru to FLOATING INPUT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
0349,,FLOATING_POINT_INPUT,FLOATING_POINT_INPUT: ; Input a floating point number pointed to by
,,, ; the DPTR
,,, ;
,,, ;***************************************************************
,,, ;
0349,51 39,, ACALL FP_CLEAR ;CLEAR EVERYTHING
034B,71 E6,, ACALL GET_DPTR_CHARACTER
034D,71 EC,, ACALL PLUS_MINUS_TEST
034F,92 78,, MOV MSIGN,C ;SAVE THE MANTISSA SIGN
,,, ;
,,, ; Now, set up for input loop
,,, ;
0351,78 34,, MOV R0,#FP_ACCC
0353,7E 7F,, MOV R6,#7FH ;BASE EXPONENT
0355,D2 D5,, SETB F0 ;SET INITIAL FLAG
,,, ;
0357,B1 F2,INLOOP,INLOOP: ACALL GET_DIGIT_CHECK
0359,50 07,, JNC GTEST ;IF NOT A CHARACTER, WHAT IS IT?
035B,54 0F,, ANL A,#0FH ;STRIP ASCII
035D,71 BF,, ACALL STDIG ;STORE THE DIGITS
,,, ;
035F,A3,INLPIK,INLPIK: INC DPTR ;BUMP POINTER FOR LOOP
0360,80 F5,, SJMP INLOOP ;LOOP FOR INPUT
,,, ;
0362,B4 2E 0C,GTEST,GTEST: CJNE A,#'.',GT1 ;SEE IF A RADIX
0365,20 51 63,, JB FOUND_RADIX,INERR
0368,D2 51,, SETB FOUND_RADIX
036A,B8 34 F2,, CJNE R0,#FP_ACCC,INLPIK
036D,D2 52,, SETB FIRST_RADIX ;SET IF FIRST RADIX
036F,80 EE,, SJMP INLPIK ;GET ADDITIONAL DIGITS
,,, ;
0371,20 D5 57,GT1,GT1: JB F0,INERR ;ERROR IF NOT CLEARED
0374,B4 65 02,, CJNE A,#'e',$+5 ;CHECK FOR LOWER CASE
0377,80 03,, SJMP $+5
0379,B4 45 33,, CJNE A,#'E',FINISH_UP
037C,71 E5,, ACALL INC_AND_GET_DPTR_CHARACTER
037E,71 EC,, ACALL PLUS_MINUS_TEST
0380,92 50,, MOV XSIGN,C ;SAVE SIGN STATUS
0382,B1 F2,, ACALL GET_DIGIT_CHECK
0384,50 45,, JNC INERR
,,, ;
0386,54 0F,, ANL A,#0FH ;STRIP ASCII BIAS OFF THE CHARACTER
0388,FD,, MOV R5,A ;SAVE THE CHARACTER IN R5
,,, ;
0389,A3,GT2,GT2: INC DPTR
038A,B1 F2,, ACALL GET_DIGIT_CHECK
038C,50 0D,, JNC FINISH1
038E,54 0F,, ANL A,#0FH ;STRIP OFF BIAS
0390,CD,, XCH A,R5 ;GET THE LAST DIGIT
0391,75 F0 0A,, MOV B,#10 ;MULTIPLY BY TEN
0394,A4,, MUL AB
0395,2D,, ADD A,R5 ;ADD TO ORIGINAL VALUE
0396,FD,, MOV R5,A ;SAVE IN R5
0397,50 F0,, JNC GT2 ;LOOP IF NO CARRY
0399,7D FF,, MOV R5,#0FFH ;FORCE AN ERROR
,,, ;
039B,ED,FINISH1,FINISH1:MOV A,R5 ;GET THE SIGN
039C,30 50 09,, JNB XSIGN,POSNUM ;SEE IF EXPONENT IS POS OR NEG
039F,C3,, CLR C
03A0,9E,, SUBB A,R6
03A1,F4,, CPL A
03A2,04,, INC A
03A3,40 09,, JC FINISH2
03A5,74 01,, MOV A,#01H
03A7,22,, RET
,,, ;
03A8,2E,POSNUM,POSNUM: ADD A,R6 ;ADD TO EXPONENT
03A9,50 03,, JNC FINISH2
,,, ;
03AB,74 02,POSNM1,POSNM1: MOV A,#02H
03AD,22,, RET
,,, ;
03AE,CE,FINISH2,FINISH2:XCH A,R6 ;SAVE THE EXPONENT
,,, ;
03AF,,FINISH_UP,FINISH_UP:
,,, ;
03AF,8E 30,, MOV FP_EXP,R6 ;SAVE EXPONENT
03B1,B8 34 02,, CJNE R0,#FP_ACCC,$+5
03B4,51 39,, ACALL FP_CLEAR ;CLEAR THE MEMORY IF 0
03B6,E5 24,, MOV A,ARG_STACK ;GET THE ARG STACK
03B8,C3,, CLR C
03B9,94 0C,, SUBB A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
03BB,F5 24,, MOV ARG_STACK,A ;ADJUST FOR STORE
03BD,21 AA,, AJMP PACK
,,, ;
03BF,C2 D5,STDIG,STDIG: CLR F0 ;CLEAR INITIAL DESIGNATOR
03C1,70 0B,, JNZ STDIG1 ;CONTINUE IF NOT ZERO
03C3,B8 34 08,, CJNE R0,#FP_ACCC,STDIG1
03C6,30 52 04,, JNB FIRST_RADIX,RET_X
,,, ;
03C9,DE 02,DECX,DECX: DJNZ R6,RET_X
,,, ;
03CB,74 FF,INERR,INERR: MOV A,#0FFH
,,, ;
03CD,22,RET_X,RET_X: RET
,,, ;
03CE,20 53 02,STDIG1,STDIG1: JB DONE_LOAD,FRTEST
03D1,C2 52,, CLR FIRST_RADIX
,,, ;
03D3,20 52 F3,FRTEST,FRTEST: JB FIRST_RADIX,DECX
,,, ;
03D6,20 51 01,FDTEST,FDTEST: JB FOUND_RADIX,FDT1
03D9,0E,, INC R6
,,, ;
03DA,20 53 F0,FDT1,FDT1: JB DONE_LOAD,RET_X
03DD,B8 3D 02,, CJNE R0,#FP_ACC8+1,FDT2
03E0,D2 53,, SETB DONE_LOAD
,,, ;
03E2,F6,FDT2,FDT2: MOV @R0,A ;SAVE THE STRIPPED ACCUMULATOR
03E3,08,, INC R0 ;BUMP THE POINTER
03E4,22,, RET ;EXIT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
,,, ; I/O utilities
,,, ;
,,, ;***************************************************************
,,, ;
03E5,,INC_AND_GET_DPTR_CHARACTER,INC_AND_GET_DPTR_CHARACTER:
,,, ;
03E5,A3,, INC DPTR
,,, ;
03E6,,GET_DPTR_CHARACTER,GET_DPTR_CHARACTER:
,,, ;
03E6,E0,, MOVX A,@DPTR ;GET THE CHARACTER
03E7,B4 20 16,, CJNE A,#' ',PMT1 ;SEE IF A SPACE
,,, ;
,,, ; Kill spaces
,,, ;
03EA,80 F9,, SJMP INC_AND_GET_DPTR_CHARACTER
,,, ;
03EC,,PLUS_MINUS_TEST,PLUS_MINUS_TEST:
,,, ;
03EC,B4 E3 02,, CJNE A,#0E3H,$+5 ;SEE IF A PLUS, PLUS TOKEN FROM BASIC
03EF,80 0E,, SJMP PMT3
03F1,B4 2B 02,, CJNE A,#'+',$+5
03F4,80 09,, SJMP PMT3
03F6,B4 E5 02,, CJNE A,#0E5H,$+5 ;SEE IF MINUS, MINUS TOKEN FROM BASIC
03F9,80 03,, SJMP PMT2
03FB,B4 2D 02,, CJNE A,#'-',PMT1
,,, ;
03FE,D3,PMT2,PMT2: SETB C
,,, ;
03FF,A3,PMT3,PMT3: INC DPTR
,,, ;
0400,22,PMT1,PMT1: RET
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
0401,,FLOATING_POINT_OUTPUT,FLOATING_POINT_OUTPUT: ; Output the number, format is in location 25
,,, ;
,,, ; IF FORMAT = 00 - FREE FLOATING
,,, ; = FX - EXPONENTIAL (X IS THE NUMBER OF SIG DIGITS)
,,, ; = NX - N = NUM BEFORE RADIX, X = NUM AFTER RADIX
,,, ; N + X = 8 MAX
,,, ;
,,, ;***************************************************************
,,, ;
0401,51 F1,, ACALL MDES1 ;GET THE NUMBER TO OUTPUT, R0 IS POINTER
0403,11 42,, ACALL POP_AND_EXIT ;OUTPUT POPS THE STACK
0405,EF,, MOV A,R7
0406,FE,, MOV R6,A ;PUT THE EXPONENT IN R6
0407,51 05,, ACALL UNPACK_R0 ;UNPACK THE NUMBER
0409,78 2B,, MOV R0,#FP_NIB1 ;POINT AT THE NUMBER
040B,E5 25,, MOV A,FORMAT ;GET THE FORMAT
040D,FB,, MOV R3,A ;SAVE IN CASE OF EXP FORMAT
040E,60 49,, JZ FREE ;FREE FLOATING?
0410,B4 F0 00,, CJNE A,#0F0H,$+3 ;SEE IF EXPONENTIAL
0413,50 73,, JNC EXPOUT
,,, ;
,,, ; If here, must be integer USING format
,,, ;
0415,EE,, MOV A,R6 ;GET THE EXPONENT
0416,70 02,, JNZ $+4
0418,7E 80,, MOV R6,#80H
041A,EB,, MOV A,R3 ;GET THE FORMAT
041B,C4,, SWAP A ;SPLIT INTEGER AND FRACTION
041C,54 0F,, ANL A,#0FH
041E,FA,, MOV R2,A ;SAVE INTEGER
041F,91 EE,, ACALL NUM_LT ;GET THE NUMBER OF INTEGERS
0421,CA,, XCH A,R2 ;FLIP FOR SUBB
0422,C3,, CLR C
0423,9A,, SUBB A,R2
0424,FF,, MOV R7,A
0425,50 06,, JNC $+8
0427,7D 3F,, MOV R5,#'?' ;OUTPUT A QUESTION MARK
0429,B1 23,, ACALL SOUT1 ;NUMBER IS TOO LARGE FOR FORMAT
042B,81 59,, AJMP FREE
042D,BA 00 07,, CJNE R2,#00,USING0 ;SEE IF ZERO
0430,1F,, DEC R7
0431,B1 10,, ACALL SS7
0433,B1 1D,, ACALL ZOUT ;OUTPUT A ZERO
0435,80 06,, SJMP USING1
,,, ;
0437,B1 10,USING0,USING0: ACALL SS7 ;OUTPUT SPACES, IF NEED TO
0439,EA,, MOV A,R2 ;OUTPUT DIGITS
043A,FF,, MOV R7,A
043B,91 D2,, ACALL OUTR0
,,, ;
043D,EB,USING1,USING1: MOV A,R3
043E,54 0F,, ANL A,#0FH ;GET THE NUMBER RIGHT OF DP
0440,FA,, MOV R2,A ;SAVE IT
0441,60 BD,, JZ PMT1 ;EXIT IF ZERO
0443,B1 19,, ACALL ROUT ;OUTPUT DP
0445,91 F7,, ACALL NUM_RT
0447,B5 02 03,, CJNE A,2,USINGX ;COMPARE A TO R2
,,, ;
044A,EA,USINGY,USINGY: MOV A,R2
044B,A1 07,, AJMP Z7R7
,,, ;
044D,50 FB,USINGX,USINGX: JNC USINGY
,,, ;
044F,CA,USING2,USING2: XCH A,R2
0450,C3,, CLR C
0451,9A,, SUBB A,R2
0452,CA,, XCH A,R2
0453,B1 07,, ACALL Z7R7 ;OUTPUT ZEROS IF NEED TO
0455,EA,, MOV A,R2
0456,FF,, MOV R7,A
0457,81 D2,, AJMP OUTR0
,,, ;
,,, ; First, force exponential output, if need to
,,, ;
0459,EE,FREE,FREE: MOV A,R6 ;GET THE EXPONENT
045A,70 04,, JNZ FREE1 ;IF ZERO, PRINT IT
045C,B1 21,, ACALL SOUT
045E,A1 1D,, AJMP ZOUT
,,, ;
0460,7B F0,FREE1,FREE1: MOV R3,#0F0H ;IN CASE EXP NEEDED
0462,74 77,, MOV A,#80H-DIGIT-DIGIT-1
0464,2E,, ADD A,R6
0465,40 21,, JC EXPOUT
0467,94 F7,, SUBB A,#0F7H
0469,40 1D,, JC EXPOUT
,,, ;
,,, ; Now, just print the number
,,, ;
046B,B1 12,, ACALL SINOUT ;PRINT THE SIGN OF THE NUMBER
046D,91 EE,, ACALL NUM_LT ;GET THE NUMBER LEFT OF DP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -