📄 calc.sdi
字号:
,,, ;
0426,,LOAD_POINTERS,LOAD_POINTERS: ; Load the ARG_STACK into R0 and bump R1
,,, ;
,,, ;***************************************************************
,,, ;
0426,75 A0 01,, MOV P2,#ARG_STACK_PAGE
0429,A8 24,, MOV R0,ARG_STACK
042B,74 06,, MOV A,#FP_NUMBER_SIZE
042D,28,, ADD A,R0
042E,F9,, MOV R1,A
042F,22,, RET
,,, ;
,,, ;***************************************************************
,,, ;
0430,,MUL_DIV_EXP_AND_SIGN,MUL_DIV_EXP_AND_SIGN:
,,, ;
,,, ; Load the sign into R7, R6. R5 gets the sign for
,,, ; multiply and divide.
,,, ;
,,, ;***************************************************************
,,, ;
0430,71 7A,, ACALL FP_CLEAR ;CLEAR INTERNAL MEMORY
,,, ;
0432,91 26,MDES1,MDES1: ACALL LOAD_POINTERS ;LOAD REGISTERS
0434,E2,, MOVX A,@R0 ;ARG 1 EXP
0435,FF,, MOV R7,A ;SAVED IN R7
0436,E3,, MOVX A,@R1 ;ARG 2 EXP
0437,FE,, MOV R6,A ;SAVED IN R6
0438,18,, DEC R0 ;BUMP POINTERS TO SIGN
0439,19,, DEC R1
043A,E2,, MOVX A,@R0 ;GET THE SIGN
043B,FC,, MOV R4,A ;SIGN OF ARG1
043C,E3,, MOVX A,@R1 ;GET SIGN OF NEXT ARG
043D,FB,, MOV R3,A ;SIGN OF ARG2
043E,6C,, XRL A,R4 ;ACC GETS THE NEW SIGN
043F,FD,, MOV R5,A ;R5 GETS THE NEW SIGN
,,, ;
,,, ; Bump the pointers to point at the LS digit
,,, ;
0440,18,, DEC R0
0441,19,, DEC R1
,,, ;
0442,22,, RET
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
0443,,LOADR1_MANTISSA,LOADR1_MANTISSA:
,,, ;
,,, ; Load the mantissa of R0 into FP_Digits
,,, ;
,,, ;***************************************************************
,,, ;
0443,C0 00,, PUSH R0B0 ;SAVE REGISTER 1
0445,78 2E,, MOV R0,#FP_DIG78 ;SET UP THE POINTER
,,, ;
0447,E3,LOADR1,LOADR1: MOVX A,@R1
0448,F6,, MOV @R0,A
0449,19,, DEC R1
044A,18,, DEC R0
044B,B8 2A F9,, CJNE R0,#FP_CARRY,LOADR1
,,, ;
044E,D0 00,, POP R0B0
0450,22,, RET
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
0451,,HEXSCAN,HEXSCAN: ; Scan a string to determine if it is a hex number
,,, ; set carry if hex, else carry = 0
,,, ;
,,, ;***************************************************************
,,, ;
0451,B1 27,, ACALL GET_DPTR_CHARACTER
0453,C0 83,, PUSH DPH
0455,C0 82,, PUSH DPL ;SAVE THE POINTER
,,, ;
0457,E0,HEXSC1,HEXSC1: MOVX A,@DPTR ;GET THE CHARACTER
0458,F1 35,, ACALL DIGIT_CHECK ;SEE IF A DIGIT
045A,40 12,, JC HS1 ;CONTINUE IF A DIGIT
045C,91 71,, ACALL HEX_CHECK ;SEE IF HEX
045E,40 0E,, JC HS1
,,, ;
0460,C2 E5,, CLR ACC.5 ;NO LOWER CASE
0462,B4 48 03,, CJNE A,#'H',HEXDON
0465,D3,, SETB C
0466,80 01,, SJMP HEXDO1 ;NUMBER IS VALID HEX, MAYBE
,,, ;
0468,C3,HEXDON,HEXDON: CLR C
,,, ;
0469,D0 82,HEXDO1,HEXDO1: POP DPL ;RESTORE POINTER
046B,D0 83,, POP DPH
046D,22,, RET
,,, ;
046E,A3,HS1,HS1: INC DPTR ;BUMP TO NEXT CHARACTER
046F,80 E6,, SJMP HEXSC1 ;LOOP
,,, ;
0471,,HEX_CHECK,HEX_CHECK: ;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
,,, ;
0471,C2 E5,, CLR ACC.5 ;WASTE LOWER CASE
0473,B4 47 00,, CJNE A,#'F'+1,$+3 ;SEE IF F OR LESS
0476,40 01,, JC HC1
0478,22,, RET
,,, ;
0479,B4 41 00,HC1,HC1: CJNE A,#'A',$+3 ;SEE IF A OR GREATER
047C,B3,, CPL C
047D,22,, RET
,,, ;
,,,$EJECT
,,, ;
047E,,PUSHR2R0,PUSHR2R0:
,,, ;
047E,7B 00,, MOV R3,#HIGH CONVT ;CONVERSION LOCATION
0480,79 48,, MOV R1,#LOW CONVT
0482,D1 BF,, ACALL CONVERT_BINARY_TO_ASCII_STRING
0484,74 0D,, MOV A,#0DH ;A CR TO TERMINATE
0486,F3,, MOVX @R1,A ;SAVE THE CR
0487,90 00 48,, MOV DPTR,#CONVT
,,, ;
,,, ; Falls thru to FLOATING INPUT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
048A,,FLOATING_POINT_INPUT,FLOATING_POINT_INPUT: ; Input a floating point number pointed to by
,,, ; the DPTR
,,, ;
,,, ;***************************************************************
,,, ;
048A,71 7A,, ACALL FP_CLEAR ;CLEAR EVERYTHING
048C,B1 27,, ACALL GET_DPTR_CHARACTER
048E,B1 2D,, ACALL PLUS_MINUS_TEST
0490,92 78,, MOV MSIGN,C ;SAVE THE MANTISSA SIGN
,,, ;
,,, ; Now, set up for input loop
,,, ;
0492,78 34,, MOV R0,#FP_ACCC
0494,7E 7F,, MOV R6,#7FH ;BASE EXPONENT
0496,D2 D5,, SETB F0 ;SET INITIAL FLAG
,,, ;
0498,F1 33,INLOOP,INLOOP: ACALL GET_DIGIT_CHECK
049A,50 07,, JNC GTEST ;IF NOT A CHARACTER, WHAT IS IT?
049C,54 0F,, ANL A,#0FH ;STRIP ASCII
049E,B1 00,, ACALL STDIG ;STORE THE DIGITS
,,, ;
04A0,A3,INLPIK,INLPIK: INC DPTR ;BUMP POINTER FOR LOOP
04A1,80 F5,, SJMP INLOOP ;LOOP FOR INPUT
,,, ;
04A3,B4 2E 0C,GTEST,GTEST: CJNE A,#'.',GT1 ;SEE IF A RADIX
04A6,20 51 63,, JB FOUND_RADIX,INERR
04A9,D2 51,, SETB FOUND_RADIX
04AB,B8 34 F2,, CJNE R0,#FP_ACCC,INLPIK
04AE,D2 52,, SETB FIRST_RADIX ;SET IF FIRST RADIX
04B0,80 EE,, SJMP INLPIK ;GET ADDITIONAL DIGITS
,,, ;
04B2,20 D5 57,GT1,GT1: JB F0,INERR ;ERROR IF NOT CLEARED
04B5,B4 65 02,, CJNE A,#'e',$+5 ;CHECK FOR LOWER CASE
04B8,80 03,, SJMP $+5
04BA,B4 45 33,, CJNE A,#'E',FINISH_UP
04BD,B1 26,, ACALL INC_AND_GET_DPTR_CHARACTER
04BF,B1 2D,, ACALL PLUS_MINUS_TEST
04C1,92 50,, MOV XSIGN,C ;SAVE SIGN STATUS
04C3,F1 33,, ACALL GET_DIGIT_CHECK
04C5,50 45,, JNC INERR
,,, ;
04C7,54 0F,, ANL A,#0FH ;STRIP ASCII BIAS OFF THE CHARACTER
04C9,FD,, MOV R5,A ;SAVE THE CHARACTER IN R5
,,, ;
04CA,A3,GT2,GT2: INC DPTR
04CB,F1 33,, ACALL GET_DIGIT_CHECK
04CD,50 0D,, JNC FINISH1
04CF,54 0F,, ANL A,#0FH ;STRIP OFF BIAS
04D1,CD,, XCH A,R5 ;GET THE LAST DIGIT
04D2,75 F0 0A,, MOV B,#10 ;MULTIPLY BY TEN
04D5,A4,, MUL AB
04D6,2D,, ADD A,R5 ;ADD TO ORIGINAL VALUE
04D7,FD,, MOV R5,A ;SAVE IN R5
04D8,50 F0,, JNC GT2 ;LOOP IF NO CARRY
04DA,7D FF,, MOV R5,#0FFH ;FORCE AN ERROR
,,, ;
04DC,ED,FINISH1,FINISH1:MOV A,R5 ;GET THE SIGN
04DD,30 50 09,, JNB XSIGN,POSNUM ;SEE IF EXPONENT IS POS OR NEG
04E0,C3,, CLR C
04E1,9E,, SUBB A,R6
04E2,F4,, CPL A
04E3,04,, INC A
04E4,40 09,, JC FINISH2
04E6,74 01,, MOV A,#01H
04E8,22,, RET
,,, ;
04E9,2E,POSNUM,POSNUM: ADD A,R6 ;ADD TO EXPONENT
04EA,50 03,, JNC FINISH2
,,, ;
04EC,74 02,POSNM1,POSNM1: MOV A,#02H
04EE,22,, RET
,,, ;
04EF,CE,FINISH2,FINISH2:XCH A,R6 ;SAVE THE EXPONENT
,,, ;
04F0,,FINISH_UP,FINISH_UP:
,,, ;
04F0,8E 30,, MOV FP_EXP,R6 ;SAVE EXPONENT
04F2,B8 34 02,, CJNE R0,#FP_ACCC,$+5
04F5,71 7A,, ACALL FP_CLEAR ;CLEAR THE MEMORY IF 0
04F7,E5 24,, MOV A,ARG_STACK ;GET THE ARG STACK
04F9,C3,, CLR C
04FA,94 0C,, SUBB A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
04FC,F5 24,, MOV ARG_STACK,A ;ADJUST FOR STORE
04FE,41 EB,, AJMP PACK
,,, ;
0500,C2 D5,STDIG,STDIG: CLR F0 ;CLEAR INITIAL DESIGNATOR
0502,70 0B,, JNZ STDIG1 ;CONTINUE IF NOT ZERO
0504,B8 34 08,, CJNE R0,#FP_ACCC,STDIG1
0507,30 52 04,, JNB FIRST_RADIX,RET_X
,,, ;
050A,DE 02,DECX,DECX: DJNZ R6,RET_X
,,, ;
050C,74 FF,INERR,INERR: MOV A,#0FFH
,,, ;
050E,22,RET_X,RET_X: RET
,,, ;
050F,20 53 02,STDIG1,STDIG1: JB DONE_LOAD,FRTEST
0512,C2 52,, CLR FIRST_RADIX
,,, ;
0514,20 52 F3,FRTEST,FRTEST: JB FIRST_RADIX,DECX
,,, ;
0517,20 51 01,FDTEST,FDTEST: JB FOUND_RADIX,FDT1
051A,0E,, INC R6
,,, ;
051B,20 53 F0,FDT1,FDT1: JB DONE_LOAD,RET_X
051E,B8 3D 02,, CJNE R0,#FP_ACC8+1,FDT2
0521,D2 53,, SETB DONE_LOAD
,,, ;
0523,F6,FDT2,FDT2: MOV @R0,A ;SAVE THE STRIPPED ACCUMULATOR
0524,08,, INC R0 ;BUMP THE POINTER
0525,22,, RET ;EXIT
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
,,, ; I/O utilities
,,, ;
,,, ;***************************************************************
,,, ;
0526,,INC_AND_GET_DPTR_CHARACTER,INC_AND_GET_DPTR_CHARACTER:
,,, ;
0526,A3,, INC DPTR
,,, ;
0527,,GET_DPTR_CHARACTER,GET_DPTR_CHARACTER:
,,, ;
0527,E0,, MOVX A,@DPTR ;GET THE CHARACTER
0528,B4 20 16,, CJNE A,#' ',PMT1 ;SEE IF A SPACE
,,, ;
,,, ; Kill spaces
,,, ;
052B,80 F9,, SJMP INC_AND_GET_DPTR_CHARACTER
,,, ;
052D,,PLUS_MINUS_TEST,PLUS_MINUS_TEST:
,,, ;
052D,B4 E3 02,, CJNE A,#0E3H,$+5 ;SEE IF A PLUS, PLUS TOKEN FROM BASIC
0530,80 0E,, SJMP PMT3
0532,B4 2B 02,, CJNE A,#'+',$+5
0535,80 09,, SJMP PMT3
0537,B4 E5 02,, CJNE A,#0E5H,$+5 ;SEE IF MINUS, MINUS TOKEN FROM BASIC
053A,80 03,, SJMP PMT2
053C,B4 2D 02,, CJNE A,#'-',PMT1
,,, ;
053F,D3,PMT2,PMT2: SETB C
,,, ;
0540,A3,PMT3,PMT3: INC DPTR
,,, ;
0541,22,PMT1,PMT1: RET
,,, ;
,,,$EJECT
,,, ;***************************************************************
,,, ;
0542,,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
,,, ;
,,, ;***************************************************************
,,, ;
0542,91 32,, ACALL MDES1 ;GET THE NUMBER TO OUTPUT, R0 IS POINTER
0544,31 83,, ACALL POP_AND_EXIT ;OUTPUT POPS THE STACK
0546,EF,, MOV A,R7
0547,FE,, MOV R6,A ;PUT THE EXPONENT IN R6
0548,71 46,, ACALL UNPACK_R0 ;UNPACK THE NUMBER
054A,78 2B,, MOV R0,#FP_NIB1 ;POINT AT THE NUMBER
054C,E5 25,, MOV A,FORMAT ;GET THE FORMAT
054E,FB,, MOV R3,A ;SAVE IN CASE OF EXP FORMAT
054F,60 49,, JZ FREE ;FREE FLOATING?
0551,B4 F0 00,, CJNE A,#0F0H,$+3 ;SEE IF EXPONENTIAL
0554,50 73,, JNC EXPOUT
,,, ;
,,, ; If here, must be integer USING format
,,, ;
0556,EE,, MOV A,R6 ;GET THE EXPONENT
0557,70 02,, JNZ $+4
0559,7E 80,, MOV R6,#80H
055B,EB,, MOV A,R3 ;GET THE FORMAT
055C,C4,, SWAP A ;SPLIT INTEGER AND FRACTION
055D,54 0F,, ANL A,#0FH
055F,FA,, MOV R2,A ;SAVE INTEGER
0560,D1 2F,, ACALL NUM_LT ;GET THE NUMBER OF INTEGERS
0562,CA,, XCH A,R2 ;FLIP FOR SUBB
0563,C3,, CLR C
0564,9A,, SUBB A,R2
0565,FF,, MOV R7,A
0566,50 06,, JNC $+8
0568,7D 3F,, MOV R5,#'?' ;OUTPUT A QUESTION MARK
056A,D1 64,, ACALL SOUT1 ;NUMBER IS TOO LARGE FOR FORMAT
056C,A1 9A,, AJMP FREE
056E,BA 00 07,, CJNE R2,#00,USING0 ;SEE IF ZERO
0571,1F,, DEC R7
0572,D1 51,, ACALL SS7
0574,D1 5E,, ACALL ZOUT ;OUTPUT A ZERO
0576,80 06,, SJMP USING1
,,, ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -