📄 fp-52.sdi
字号:
1C93,D0 00,, POP R0B0
1C95,22,, RET
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
1C96,,HEXSCAN,HEXSCAN: ; Scan a string to determine if it is a hex number
,,, ; set carry if hex, else carry = 0
,,, ;
,,, ;***************************************************************
,,, ;
1C96,B1 6C,, ACALL GET_DPTR_CHARACTER
1C98,C0 83,, PUSH DPH
1C9A,C0 82,, PUSH DPL ;SAVE THE POINTER
,,, ;
1C9C,E0,HEXSC1,HEXSC1: MOVX A,@DPTR ;GET THE CHARACTER
1C9D,F1 ED,, ACALL DIGIT_CHECK ;SEE IF A DIGIT
1C9F,40 12,, JC HS1 ;CONTINUE IF A DIGIT
1CA1,91 B6,, ACALL HEX_CHECK ;SEE IF HEX
1CA3,40 0E,, JC HS1
,,, ;
1CA5,C2 E5,, CLR ACC.5 ;NO LOWER CASE
1CA7,B4 48 03,, CJNE A,#'H',HEXDON
1CAA,D3,, SETB C
1CAB,80 01,, SJMP HEXDO1 ;NUMBER IS VALID HEX, MAYBE
,,, ;
1CAD,C3,HEXDON,HEXDON: CLR C
,,, ;
1CAE,D0 82,HEXDO1,HEXDO1: POP DPL ;RESTORE POINTER
1CB0,D0 83,, POP DPH
1CB2,22,, RET
,,, ;
1CB3,A3,HS1,HS1: INC DPTR ;BUMP TO NEXT CHARACTER
1CB4,80 E6,, SJMP HEXSC1 ;LOOP
,,, ;
1CB6,,HEX_CHECK,HEX_CHECK: ;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
,,, ;
1CB6,C2 E5,, CLR ACC.5 ;WASTE LOWER CASE
1CB8,B4 47 00,, CJNE A,#'F'+1,$+3 ;SEE IF F OR LESS
1CBB,40 01,, JC HC1
1CBD,22,, RET
,,, ;
1CBE,B4 41 00,HC1,HC1: CJNE A,#'A',$+3 ;SEE IF A OR GREATER
1CC1,B3,, CPL C
1CC2,22,, RET
,,, ;
,,,$EJECT
,,, ;
1CC3,,PUSHR2R0,PUSHR2R0:
,,, ;
1CC3,7B 00,, MOV R3,#HIGH CONVT ;CONVERSION LOCATION
1CC5,79 58,, MOV R1,#LOW CONVT
1CC7,F1 04,, ACALL CONVERT_BINARY_TO_ASCII_STRING
1CC9,74 0D,, MOV A,#0DH ;A CR TO TERMINATE
1CCB,F3,, MOVX @R1,A ;SAVE THE CR
1CCC,90 00 58,, MOV DPTR,#CONVT
,,, ;
,,, ; Falls thru to FLOATING INPUT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
1CCF,,FLOATING_POINT_INPUT,FLOATING_POINT_INPUT: ; Input a floating point number pointed to by
,,, ; the DPTR
,,, ;
,,, ;***************************************************************
,,, ;
1CCF,71 BF,, ACALL FP_CLEAR ;CLEAR EVERYTHING
1CD1,B1 6C,, ACALL GET_DPTR_CHARACTER
1CD3,B1 72,, ACALL PLUS_MINUS_TEST
1CD5,92 78,, MOV MSIGN,C ;SAVE THE MANTISSA SIGN
,,, ;
,,, ; Now, set up for input loop
,,, ;
1CD7,78 34,, MOV R0,#FP_ACCC
1CD9,7E 7F,, MOV R6,#7FH ;BASE EXPONENT
1CDB,D2 D5,, SETB F0 ;SET INITIAL FLAG
,,, ;
1CDD,F1 EB,INLOOP,INLOOP: ACALL GET_DIGIT_CHECK
1CDF,50 07,, JNC GTEST ;IF NOT A CHARACTER, WHAT IS IT?
1CE1,54 0F,, ANL A,#0FH ;STRIP ASCII
1CE3,B1 45,, ACALL STDIG ;STORE THE DIGITS
,,, ;
1CE5,A3,INLPIK,INLPIK: INC DPTR ;BUMP POINTER FOR LOOP
1CE6,80 F5,, SJMP INLOOP ;LOOP FOR INPUT
,,, ;
1CE8,B4 2E 0C,GTEST,GTEST: CJNE A,#'.',GT1 ;SEE IF A RADIX
1CEB,20 51 63,, JB FOUND_RADIX,INERR
1CEE,D2 51,, SETB FOUND_RADIX
1CF0,B8 34 F2,, CJNE R0,#FP_ACCC,INLPIK
1CF3,D2 52,, SETB FIRST_RADIX ;SET IF FIRST RADIX
1CF5,80 EE,, SJMP INLPIK ;GET ADDITIONAL DIGITS
,,, ;
1CF7,20 D5 57,GT1,GT1: JB F0,INERR ;ERROR IF NOT CLEARED
1CFA,B4 65 02,, CJNE A,#'e',$+5 ;CHECK FOR LOWER CASE
1CFD,80 03,, SJMP $+5
1CFF,B4 45 33,, CJNE A,#'E',FINISH_UP
1D02,B1 6B,, ACALL INC_AND_GET_DPTR_CHARACTER
1D04,B1 72,, ACALL PLUS_MINUS_TEST
1D06,92 50,, MOV XSIGN,C ;SAVE SIGN STATUS
1D08,F1 EB,, ACALL GET_DIGIT_CHECK
1D0A,50 45,, JNC INERR
,,, ;
1D0C,54 0F,, ANL A,#0FH ;STRIP ASCII BIAS OFF THE CHARACTER
1D0E,FD,, MOV R5,A ;SAVE THE CHARACTER IN R5
,,, ;
1D0F,A3,GT2,GT2: INC DPTR
1D10,F1 EB,, ACALL GET_DIGIT_CHECK
1D12,50 0D,, JNC FINISH1
1D14,54 0F,, ANL A,#0FH ;STRIP OFF BIAS
1D16,CD,, XCH A,R5 ;GET THE LAST DIGIT
1D17,75 F0 0A,, MOV B,#10 ;MULTIPLY BY TEN
1D1A,A4,, MUL AB
1D1B,2D,, ADD A,R5 ;ADD TO ORIGINAL VALUE
1D1C,FD,, MOV R5,A ;SAVE IN R5
1D1D,50 F0,, JNC GT2 ;LOOP IF NO CARRY
1D1F,7D FF,, MOV R5,#0FFH ;FORCE AN ERROR
,,, ;
1D21,ED,FINISH1,FINISH1:MOV A,R5 ;GET THE SIGN
1D22,30 50 09,, JNB XSIGN,POSNUM ;SEE IF EXPONENT IS POS OR NEG
1D25,C3,, CLR C
1D26,9E,, SUBB A,R6
1D27,F4,, CPL A
1D28,04,, INC A
1D29,40 09,, JC FINISH2
1D2B,74 01,, MOV A,#01H
1D2D,22,, RET
,,, ;
1D2E,2E,POSNUM,POSNUM: ADD A,R6 ;ADD TO EXPONENT
1D2F,50 03,, JNC FINISH2
,,, ;
1D31,74 02,POSNM1,POSNM1: MOV A,#02H
1D33,22,, RET
,,, ;
1D34,CE,FINISH2,FINISH2:XCH A,R6 ;SAVE THE EXPONENT
,,, ;
1D35,,FINISH_UP,FINISH_UP:
,,, ;
1D35,8E 30,, MOV FP_EXP,R6 ;SAVE EXPONENT
1D37,B8 34 02,, CJNE R0,#FP_ACCC,$+5
1D3A,71 BF,, ACALL FP_CLEAR ;CLEAR THE MEMORY IF 0
1D3C,E5 09,, MOV A,ARG_STACK ;GET THE ARG STACK
1D3E,C3,, CLR C
1D3F,94 0C,, SUBB A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
1D41,F5 09,, MOV ARG_STACK,A ;ADJUST FOR STORE
1D43,61 30,, AJMP PACK
,,, ;
1D45,C2 D5,STDIG,STDIG: CLR F0 ;CLEAR INITIAL DESIGNATOR
1D47,70 0B,, JNZ STDIG1 ;CONTINUE IF NOT ZERO
1D49,B8 34 08,, CJNE R0,#FP_ACCC,STDIG1
1D4C,30 52 04,, JNB FIRST_RADIX,RET_X
,,, ;
1D4F,DE 02,DECX,DECX: DJNZ R6,RET_X
,,, ;
1D51,74 FF,INERR,INERR: MOV A,#0FFH
,,, ;
1D53,22,RET_X,RET_X: RET
,,, ;
1D54,20 53 02,STDIG1,STDIG1: JB DONE_LOAD,FRTEST
1D57,C2 52,, CLR FIRST_RADIX
,,, ;
1D59,20 52 F3,FRTEST,FRTEST: JB FIRST_RADIX,DECX
,,, ;
1D5C,20 51 01,FDTEST,FDTEST: JB FOUND_RADIX,FDT1
1D5F,0E,, INC R6
,,, ;
1D60,20 53 F0,FDT1,FDT1: JB DONE_LOAD,RET_X
1D63,B8 3D 02,, CJNE R0,#FP_ACC8+1,FDT2
1D66,D2 53,, SETB DONE_LOAD
,,, ;
1D68,F6,FDT2,FDT2: MOV @R0,A ;SAVE THE STRIPPED ACCUMULATOR
1D69,08,, INC R0 ;BUMP THE POINTER
1D6A,22,, RET ;EXIT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
,,, ; I/O utilities
,,, ;
,,, ;***************************************************************
,,, ;
1D6B,,INC_AND_GET_DPTR_CHARACTER,INC_AND_GET_DPTR_CHARACTER:
,,, ;
1D6B,A3,, INC DPTR
,,, ;
1D6C,,GET_DPTR_CHARACTER,GET_DPTR_CHARACTER:
,,, ;
1D6C,E0,, MOVX A,@DPTR ;GET THE CHARACTER
1D6D,B4 20 16,, CJNE A,#' ',PMT1 ;SEE IF A SPACE
,,, ;
,,, ; Kill spaces
,,, ;
1D70,80 F9,, SJMP INC_AND_GET_DPTR_CHARACTER
,,, ;
1D72,,PLUS_MINUS_TEST,PLUS_MINUS_TEST:
,,, ;
1D72,B4 E3 02,, CJNE A,#0E3H,$+5 ;SEE IF A PLUS, PLUS TOKEN FROM BASIC
1D75,80 0E,, SJMP PMT3
1D77,B4 2B 02,, CJNE A,#'+',$+5
1D7A,80 09,, SJMP PMT3
1D7C,B4 E5 02,, CJNE A,#0E5H,$+5 ;SEE IF MINUS, MINUS TOKEN FROM BASIC
1D7F,80 03,, SJMP PMT2
1D81,B4 2D 02,, CJNE A,#'-',PMT1
,,, ;
1D84,D3,PMT2,PMT2: SETB C
,,, ;
1D85,A3,PMT3,PMT3: INC DPTR
,,, ;
1D86,22,PMT1,PMT1: RET
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
1D87,,FLOATING_POINT_OUTPUT,FLOATING_POINT_OUTPUT: ; Output the number, format is in location 23
,,, ;
,,, ; 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
,,, ;
,,, ;***************************************************************
,,, ;
1D87,91 77,, ACALL MDES1 ;GET THE NUMBER TO OUTPUT, R0 IS POINTER
1D89,31 C9,, ACALL POP_AND_EXIT ;OUTPUT POPS THE STACK
1D8B,EF,, MOV A,R7
1D8C,FE,, MOV R6,A ;PUT THE EXPONENT IN R6
1D8D,71 8B,, ACALL UNPACK_R0 ;UNPACK THE NUMBER
1D8F,78 2B,, MOV R0,#FP_NIB1 ;POINT AT THE NUMBER
1D91,E5 17,, MOV A,FORMAT ;GET THE FORMAT
1D93,FB,, MOV R3,A ;SAVE IN CASE OF EXP FORMAT
1D94,60 49,, JZ FREE ;FREE FLOATING?
1D96,B4 F0 00,, CJNE A,#0F0H,$+3 ;SEE IF EXPONENTIAL
1D99,50 73,, JNC EXPOUT
,,, ;
,,, ; If here, must be integer USING format
,,, ;
1D9B,EE,, MOV A,R6 ;GET THE EXPONENT
1D9C,70 02,, JNZ $+4
1D9E,7E 80,, MOV R6,#80H
1DA0,EB,, MOV A,R3 ;GET THE FORMAT
1DA1,C4,, SWAP A ;SPLIT INTEGER AND FRACTION
1DA2,54 0F,, ANL A,#0FH
1DA4,FA,, MOV R2,A ;SAVE INTEGER
1DA5,D1 74,, ACALL NUM_LT ;GET THE NUMBER OF INTEGERS
1DA7,CA,, XCH A,R2 ;FLIP FOR SUBB
1DA8,C3,, CLR C
1DA9,9A,, SUBB A,R2
1DAA,FF,, MOV R7,A
1DAB,50 06,, JNC $+8
1DAD,7D 3F,, MOV R5,#'?' ;OUTPUT A QUESTION MARK
1DAF,D1 A9,, ACALL SOUT1 ;NUMBER IS TOO LARGE FOR FORMAT
1DB1,A1 DF,, AJMP FREE
1DB3,BA 00 07,, CJNE R2,#00,USING0 ;SEE IF ZERO
1DB6,1F,, DEC R7
1DB7,D1 96,, ACALL SS7
1DB9,D1 A3,, ACALL ZOUT ;OUTPUT A ZERO
1DBB,80 06,, SJMP USING1
,,, ;
1DBD,D1 96,USING0,USING0: ACALL SS7 ;OUTPUT SPACES, IF NEED TO
1DBF,EA,, MOV A,R2 ;OUTPUT DIGITS
1DC0,FF,, MOV R7,A
1DC1,D1 58,, ACALL OUTR0
,,, ;
1DC3,EB,USING1,USING1: MOV A,R3
1DC4,54 0F,, ANL A,#0FH ;GET THE NUMBER RIGHT OF DP
1DC6,FA,, MOV R2,A ;SAVE IT
1DC7,60 BD,, JZ PMT1 ;EXIT IF ZERO
1DC9,D1 9F,, ACALL ROUT ;OUTPUT DP
1DCB,D1 7D,, ACALL NUM_RT
1DCD,B5 02 03,, CJNE A,2,USINGX ;COMPARE A TO R2
,,, ;
1DD0,EA,USINGY,USINGY: MOV A,R2
1DD1,C1 8D,, AJMP Z7R7
,,, ;
1DD3,50 FB,USINGX,USINGX: JNC USINGY
,,, ;
1DD5,CA,USING2,USING2: XCH A,R2
1DD6,C3,, CLR C
1DD7,9A,, SUBB A,R2
1DD8,CA,, XCH A,R2
1DD9,D1 8D,, ACALL Z7R7 ;OUTPUT ZEROS IF NEED TO
1DDB,EA,, MOV A,R2
1DDC,FF,, MOV R7,A
1DDD,C1 58,, AJMP OUTR0
,,, ;
,,, ; First, force exponential output, if need to
,,, ;
1DDF,EE,FREE,FREE: MOV A,R6 ;GET THE EXPONENT
1DE0,70 04,, JNZ FREE1 ;IF ZERO, PRINT IT
1DE2,D1 A7,, ACALL SOUT
1DE4,C1 A3,, AJMP ZOUT
,,, ;
1DE6,7B F0,FREE1,FREE1: MOV R3,#0F0H ;IN CASE EXP NEEDED
1DE8,74 77,, MOV A,#80H-DIGIT-DIGIT-1
1DEA,2E,, ADD A,R6
1DEB,40 21,, JC EXPOUT
1DED,94 F7,, SUBB A,#0F7H
1DEF,40 1D,, JC EXPOUT
,,, ;
,,, ; Now, just print the number
,,, ;
1DF1,D1 98,, ACALL SINOUT ;PRINT THE SIGN OF THE NUMBER
1DF3,D1 74,, ACALL NUM_LT ;GET THE NUMBER LEFT OF DP
1DF5,B4 08 02,, CJNE A,#8,FREE4
1DF8,C1 58,, AJMP OUTR0
,,, ;
1DFA,D1 58,FREE4,FREE4: ACALL OUTR0
1DFC,D1 6A,, ACALL ZTEST ;TEST FOR TRAILING ZEROS
1DFE,60 57,, JZ U_RET ;DONE IF ALL TRAILING ZEROS
1E00,D1 9F,, ACALL ROUT ;OUTPUT RADIX
,,, ;
1E02,7F 01,FREE2,FREE2: MOV R7,#1 ;OUTPUT ONE DIGIT
1E04,D1 58,, ACALL OUTR0
1E06,70 4F,, JNZ U_RET
1E08,D1 6A,, ACALL ZTEST
1E0A,60 4B,, JZ U_RET
1E0C,80 F4,, SJMP FREE2 ;LOOP
,,, ;
1E0E,D1 98,EXPOUT,EXPOUT: ACALL SINOUT ;PRINT THE SIGN
1E10,7F 01,, MOV R7,#1 ;OUTPUT ONE CHARACTER
1E12,D1 58,, ACALL OUTR0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -