📄 fp-52.lst
字号:
899: ;
900: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 26
Line I Addr Code Source
901: ;***************************************************************
902: ;
903: 1C6B LOAD_POINTERS: ; Load the ARG_STACK into R0 and bump R1
904: ;
905: ;***************************************************************
906: ;
907: 1C6B 75 A0 01 MOV P2,#ARG_STACK_PAGE
908: 1C6E A8 09 MOV R0,ARG_STACK
909: 1C70 74 06 MOV A,#FP_NUMBER_SIZE
910: 1C72 28 ADD A,R0
911: 1C73 F9 MOV R1,A
912: 1C74 22 RET
913: ;
914: ;***************************************************************
915: ;
916: 1C75 MUL_DIV_EXP_AND_SIGN:
917: ;
918: ; Load the sign into R7, R6. R5 gets the sign for
919: ; multiply and divide.
920: ;
921: ;***************************************************************
922: ;
923: 1C75 71 BF ACALL FP_CLEAR ;CLEAR INTERNAL MEMORY
924: ;
925: 1C77 91 6B MDES1: ACALL LOAD_POINTERS ;LOAD REGISTERS
926: 1C79 E2 MOVX A,@R0 ;ARG 1 EXP
927: 1C7A FF MOV R7,A ;SAVED IN R7
928: 1C7B E3 MOVX A,@R1 ;ARG 2 EXP
929: 1C7C FE MOV R6,A ;SAVED IN R6
930: 1C7D 18 DEC R0 ;BUMP POINTERS TO SIGN
931: 1C7E 19 DEC R1
932: 1C7F E2 MOVX A,@R0 ;GET THE SIGN
933: 1C80 FC MOV R4,A ;SIGN OF ARG1
934: 1C81 E3 MOVX A,@R1 ;GET SIGN OF NEXT ARG
935: 1C82 FB MOV R3,A ;SIGN OF ARG2
936: 1C83 6C XRL A,R4 ;ACC GETS THE NEW SIGN
937: 1C84 FD MOV R5,A ;R5 GETS THE NEW SIGN
938: ;
939: ; Bump the pointers to point at the LS digit
940: ;
941: 1C85 18 DEC R0
942: 1C86 19 DEC R1
943: ;
944: 1C87 22 RET
945: ;
946: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 27
Line I Addr Code Source
947: ;***************************************************************
948: ;
949: 1C88 LOADR1_MANTISSA:
950: ;
951: ; Load the mantissa of R0 into FP_Digits
952: ;
953: ;***************************************************************
954: ;
955: 1C88 C0 00 PUSH R0B0 ;SAVE REGISTER 1
956: 1C8A 78 2E MOV R0,#FP_DIG78 ;SET UP THE POINTER
957: ;
958: 1C8C E3 LOADR1: MOVX A,@R1
959: 1C8D F6 MOV @R0,A
960: 1C8E 19 DEC R1
961: 1C8F 18 DEC R0
962: 1C90 B8 2A F9 CJNE R0,#FP_CARRY,LOADR1
963: ;
964: 1C93 D0 00 POP R0B0
965: 1C95 22 RET
966: ;
967: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 28
Line I Addr Code Source
968: ;***************************************************************
969: ;
970: 1C96 HEXSCAN: ; Scan a string to determine if it is a hex number
971: ; set carry if hex, else carry = 0
972: ;
973: ;***************************************************************
974: ;
975: 1C96 B1 6C ACALL GET_DPTR_CHARACTER
976: 1C98 C0 83 PUSH DPH
977: 1C9A C0 82 PUSH DPL ;SAVE THE POINTER
978: ;
979: 1C9C E0 HEXSC1: MOVX A,@DPTR ;GET THE CHARACTER
980: 1C9D F1 ED ACALL DIGIT_CHECK ;SEE IF A DIGIT
981: 1C9F 40 12 JC HS1 ;CONTINUE IF A DIGIT
982: 1CA1 91 B6 ACALL HEX_CHECK ;SEE IF HEX
983: 1CA3 40 0E JC HS1
984: ;
985: 1CA5 C2 E5 CLR ACC.5 ;NO LOWER CASE
986: 1CA7 B4 48 03 CJNE A,#'H',HEXDON
987: 1CAA D3 SETB C
988: 1CAB 80 01 SJMP HEXDO1 ;NUMBER IS VALID HEX, MAYBE
989: ;
990: 1CAD C3 HEXDON: CLR C
991: ;
992: 1CAE D0 82 HEXDO1: POP DPL ;RESTORE POINTER
993: 1CB0 D0 83 POP DPH
994: 1CB2 22 RET
995: ;
996: 1CB3 A3 HS1: INC DPTR ;BUMP TO NEXT CHARACTER
997: 1CB4 80 E6 SJMP HEXSC1 ;LOOP
998: ;
999: 1CB6 HEX_CHECK: ;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
1000: ;
1001: 1CB6 C2 E5 CLR ACC.5 ;WASTE LOWER CASE
1002: 1CB8 B4 47 00 CJNE A,#'F'+1,$+3 ;SEE IF F OR LESS
1003: 1CBB 40 01 JC HC1
1004: 1CBD 22 RET
1005: ;
1006: 1CBE B4 41 00 HC1: CJNE A,#'A',$+3 ;SEE IF A OR GREATER
1007: 1CC1 B3 CPL C
1008: 1CC2 22 RET
1009: ;
1010: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 29
Line I Addr Code Source
1011: ;
1012: 1CC3 PUSHR2R0:
1013: ;
1014: 1CC3 7B 00 MOV R3,#HIGH CONVT ;CONVERSION LOCATION
1015: 1CC5 79 58 MOV R1,#LOW CONVT
1016: 1CC7 F1 04 ACALL CONVERT_BINARY_TO_ASCII_STRING
1017: 1CC9 74 0D MOV A,#0DH ;A CR TO TERMINATE
1018: 1CCB F3 MOVX @R1,A ;SAVE THE CR
1019: 1CCC 90 00 58 MOV DPTR,#CONVT
1020: ;
1021: ; Falls thru to FLOATING INPUT
1022: ;
1023: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 30
Line I Addr Code Source
1024: ;***************************************************************
1025: ;
1026: 1CCF FLOATING_POINT_INPUT: ; Input a floating point number pointed to by
1027: ; the DPTR
1028: ;
1029: ;***************************************************************
1030: ;
1031: 1CCF 71 BF ACALL FP_CLEAR ;CLEAR EVERYTHING
1032: 1CD1 B1 6C ACALL GET_DPTR_CHARACTER
1033: 1CD3 B1 72 ACALL PLUS_MINUS_TEST
1034: 1CD5 92 78 MOV MSIGN,C ;SAVE THE MANTISSA SIGN
1035: ;
1036: ; Now, set up for input loop
1037: ;
1038: 1CD7 78 34 MOV R0,#FP_ACCC
1039: 1CD9 7E 7F MOV R6,#7FH ;BASE EXPONENT
1040: 1CDB D2 D5 SETB F0 ;SET INITIAL FLAG
1041: ;
1042: 1CDD F1 EB INLOOP: ACALL GET_DIGIT_CHECK
1043: 1CDF 50 07 JNC GTEST ;IF NOT A CHARACTER, WHAT IS IT?
1044: 1CE1 54 0F ANL A,#0FH ;STRIP ASCII
1045: 1CE3 B1 45 ACALL STDIG ;STORE THE DIGITS
1046: ;
1047: 1CE5 A3 INLPIK: INC DPTR ;BUMP POINTER FOR LOOP
1048: 1CE6 80 F5 SJMP INLOOP ;LOOP FOR INPUT
1049: ;
1050: 1CE8 B4 2E 0C GTEST: CJNE A,#'.',GT1 ;SEE IF A RADIX
1051: 1CEB 20 51 63 JB FOUND_RADIX,INERR
1052: 1CEE D2 51 SETB FOUND_RADIX
1053: 1CF0 B8 34 F2 CJNE R0,#FP_ACCC,INLPIK
1054: 1CF3 D2 52 SETB FIRST_RADIX ;SET IF FIRST RADIX
1055: 1CF5 80 EE SJMP INLPIK ;GET ADDITIONAL DIGITS
1056: ;
1057: 1CF7 20 D5 57 GT1: JB F0,INERR ;ERROR IF NOT CLEARED
1058: 1CFA B4 65 02 CJNE A,#'e',$+5 ;CHECK FOR LOWER CASE
1059: 1CFD 80 03 SJMP $+5
1060: 1CFF B4 45 33 CJNE A,#'E',FINISH_UP
1061: 1D02 B1 6B ACALL INC_AND_GET_DPTR_CHARACTER
1062: 1D04 B1 72 ACALL PLUS_MINUS_TEST
1063: 1D06 92 50 MOV XSIGN,C ;SAVE SIGN STATUS
1064: 1D08 F1 EB ACALL GET_DIGIT_CHECK
1065: 1D0A 50 45 JNC INERR
1066: ;
1067: 1D0C 54 0F ANL A,#0FH ;STRIP ASCII BIAS OFF THE CHARACTER
1068: 1D0E FD MOV R5,A ;SAVE THE CHARACTER IN R5
1069: ;
1070: 1D0F A3 GT2: INC DPTR
1071: 1D10 F1 EB ACALL GET_DIGIT_CHECK
1072: 1D12 50 0D JNC FINISH1
1073: 1D14 54 0F ANL A,#0FH ;STRIP OFF BIAS
1074: 1D16 CD XCH A,R5 ;GET THE LAST DIGIT
1075: 1D17 75 F0 0A MOV B,#10 ;MULTIPLY BY TEN
1076: 1D1A A4 MUL AB
1077: 1D1B 2D ADD A,R5 ;ADD TO ORIGINAL VALUE
1078: 1D1C FD MOV R5,A ;SAVE IN R5
1079: 1D1D 50 F0 JNC GT2 ;LOOP IF NO CARRY
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 31
Line I Addr Code Source
1080: 1D1F 7D FF MOV R5,#0FFH ;FORCE AN ERROR
1081: ;
1082: 1D21 ED FINISH1:MOV A,R5 ;GET THE SIGN
1083: 1D22 30 50 09 JNB XSIGN,POSNUM ;SEE IF EXPONENT IS POS OR NEG
1084: 1D25 C3 CLR C
1085: 1D26 9E SUBB A,R6
1086: 1D27 F4 CPL A
1087: 1D28 04 INC A
1088: 1D29 40 09 JC FINISH2
1089: 1D2B 74 01 MOV A,#01H
1090: 1D2D 22 RET
1091: ;
1092: 1D2E 2E POSNUM: ADD A,R6 ;ADD TO EXPONENT
1093: 1D2F 50 03 JNC FINISH2
1094: ;
1095: 1D31 74 02 POSNM1: MOV A,#02H
1096: 1D33 22 RET
1097: ;
1098: 1D34 CE FINISH2:XCH A,R6 ;SAVE THE EXPONENT
1099: ;
1100: 1D35 FINISH_UP:
1101: ;
1102: 1D35 8E 30 MOV FP_EXP,R6 ;SAVE EXPONENT
1103: 1D37 B8 34 02 CJNE R0,#FP_ACCC,$+5
1104: 1D3A 71 BF ACALL FP_CLEAR ;CLEAR THE MEMORY IF 0
1105: 1D3C E5 09 MOV A,ARG_STACK ;GET THE ARG STACK
1106: 1D3E C3 CLR C
1107: 1D3F 94 0C SUBB A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
1108: 1D41 F5 09 MOV ARG_STACK,A ;ADJUST FOR STORE
1109: 1D43 61 30 AJMP PACK
1110: ;
1111: 1D45 C2 D5 STDIG: CLR F0 ;CLEAR INITIAL DESIGNATOR
1112: 1D47 70 0B JNZ STDIG1 ;CONTINUE IF NOT ZERO
1113: 1D49 B8 34 08 CJNE R0,#FP_ACCC,STDIG1
1114: 1D4C 30 52 04 JNB FIRST_RADIX,RET_X
1115: ;
1116: 1D4F DE 02 DECX: DJNZ R6,RET_X
1117: ;
1118: 1D51 74 FF INERR: MOV A,#0FFH
1119: ;
1120: 1D53 22 RET_X: RET
1121: ;
1122: 1D54 20 53 02 STDIG1: JB DONE_LOAD,FRTEST
1123: 1D57 C2 52 CLR FIRST_RADIX
1124: ;
1125: 1D59 20 52 F3 FRTEST: JB FIRST_RADIX,DECX
1126: ;
1127: 1D5C 20 51 01 FDTEST: JB FOUND_RADIX,FDT1
1128: 1D5F 0E INC R6
1129: ;
1130: 1D60 20 53 F0 FDT1: JB DONE_LOAD,RET_X
1131: 1D63 B8 3D 02 CJNE R0,#FP_ACC8+1,FDT2
1132: 1D66 D2 53 SETB DONE_LOAD
1133: ;
1134: 1D68 F6 FDT2: MOV @R0,A ;SAVE THE STRIPPED ACCUMULATOR
1135: 1D69 08 INC R0 ;BUMP THE POINTER
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 32
Line I Addr Code Source
1136: 1D6A 22 RET ;EXIT
1137: ;
1138: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 33
Line I Addr Code Source
1139: ;***************************************************************
1140: ;
1141: ; I/O utilities
1142: ;
1143: ;***************************************************************
1144: ;
1145: 1D6B INC_AND_GET_DPTR_CHARACTER:
1146: ;
1147: 1D6B A3 INC DPTR
1148: ;
1149: 1D6C GET_DPTR_CHARACTER:
1150: ;
1151: 1D6C E0 MOVX A,@DPTR ;GET THE CHARACTER
1152: 1D6D B4 20 16 CJNE A,#' ',PMT1 ;SEE IF A SPACE
1153: ;
1154: ; Kill spaces
1155: ;
1156: 1D70 80 F9 SJMP INC_AND_GET_DPTR_CHARACTER
1157: ;
1158: 1D72 PLUS_MINUS_TEST:
1159: ;
1160: 1D72 B4 E3 02 CJNE A,#0E3H,$+5 ;SEE IF A PLUS, PLUS TOKEN FROM BASIC
1161: 1D75 80 0E SJMP PMT3
1162: 1D77 B4 2B 02 CJNE A,#'+',$+5
1163: 1D7A 80 09 SJMP PMT3
1164: 1D7C B4 E5 02 CJNE A,#0E5H,$+5 ;SEE IF MINUS, MINUS TOKEN FROM BASIC
1165: 1D7F 80 03 SJMP PMT2
1166: 1D81 B4 2D 02 CJNE A,#'-',PMT1
1167: ;
1168: 1D84 D3 PMT2: SETB C
1169: ;
1170: 1D85 A3 PMT3: INC DPTR
1171: ;
1172: 1D86 22 PMT1: RET
1173: ;
1174: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 34
Line I Addr Code Source
1175: ;***************************************************************
1176: ;
1177: 1D87 FLOATING_POINT_OUTPUT: ; Output the number, format is in location 23
1178: ;
1179: ; IF FORMAT = 00 - FREE FLOATING
1180: ; = FX - EXPONENTIAL (X IS THE NUMBER OF SIG DIGITS)
1181: ; = NX - N = NUM BEFORE RADIX, X = NUM AFTER RADIX
1182: ; N + X = 8 MAX
1183: ;
1184: ;***************************************************************
1185: ;
1186: 1D87 91 77 ACALL MDES1 ;GET THE NUMBER TO OUTPUT, R0 IS POINTER
1187: 1D89 31 C9 ACALL POP_AND_EXIT ;OUTPUT POPS THE STACK
1188: 1D8B EF MOV A,R7
1189: 1D8C FE MOV R6,A ;PUT THE EXPONENT IN R6
1190: 1D8D 71 8B ACALL UNPACK_R0 ;UNPACK THE NUMBER
1191: 1D8F 78 2B MOV R0,#FP_NIB1 ;POINT AT THE NUMBER
1192: 1D91 E5 17 MOV A,FORMAT ;GET THE FORMAT
1193: 1D93 FB MOV R3,A ;SAVE IN CASE OF EXP FORMAT
1194: 1D94 60 49 JZ FREE ;FREE FLOATING?
1195: 1D96 B4 F0 00 CJNE A,#0F0H,$+3 ;SEE IF EXPONENTIAL
1196: 1D99 50 73 JNC EXPOUT
1197: ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -