📄 fp52.lst
字号:
903: 02DD B9 2A DC CJNE R1,#FP_NIB1-1,MNLOOP
904: ;
905: 02E0 25 33 ADD A,FP_ACCX ;GET THE OVERFLOW
906: 02E2 D4 DA A ;ADJUST
907: 02E3 F6 MOV @R0,A ;SAVE IT
908: 02E4 22 RET ;EXIT
909: ;
910: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 25
Line I Addr Code Source
911: ;***************************************************************
912: ;
913: 02E5 LOAD_POINTERS: ; Load the ARG_STACK into R0 and bump R1
914: ;
915: ;***************************************************************
916: ;
917: 02E5 75 A0 01 MOV P2,#ARG_STACK_PAGE
918: 02E8 A8 24 MOV R0,ARG_STACK
919: 02EA 74 06 MOV A,#FP_NUMBER_SIZE
920: 02EC 28 ADD A,R0
921: 02ED F9 MOV R1,A
922: 02EE 22 RET
923: ;
924: ;***************************************************************
925: ;
926: 02EF MUL_DIV_EXP_AND_SIGN:
927: ;
928: ; Load the sign into R7, R6. R5 gets the sign for
929: ; multiply and divide.
930: ;
931: ;***************************************************************
932: ;
933: 02EF 51 39 ACALL FP_CLEAR ;CLEAR INTERNAL MEMORY
934: ;
935: 02F1 51 E5 MDES1: ACALL LOAD_POINTERS ;LOAD REGISTERS
936: 02F3 E2 MOVX A,@R0 ;ARG 1 EXP
937: 02F4 FF MOV R7,A ;SAVED IN R7
938: 02F5 E3 MOVX A,@R1 ;ARG 2 EXP
939: 02F6 FE MOV R6,A ;SAVED IN R6
940: 02F7 18 DEC R0 ;BUMP POINTERS TO SIGN
941: 02F8 19 DEC R1
942: 02F9 E2 MOVX A,@R0 ;GET THE SIGN
943: 02FA FC MOV R4,A ;SIGN OF ARG1
944: 02FB E3 MOVX A,@R1 ;GET SIGN OF NEXT ARG
945: 02FC FB MOV R3,A ;SIGN OF ARG2
946: 02FD 6C XRL A,R4 ;ACC GETS THE NEW SIGN
947: 02FE FD MOV R5,A ;R5 GETS THE NEW SIGN
948: ;
949: ; Bump the pointers to point at the LS digit
950: ;
951: 02FF 18 DEC R0
952: 0300 19 DEC R1
953: ;
954: 0301 22 RET
955: ;
956: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 26
Line I Addr Code Source
957: ;***************************************************************
958: ;
959: 0302 LOADR1_MANTISSA:
960: ;
961: ; Load the mantissa of R0 into FP_Digits
962: ;
963: ;***************************************************************
964: ;
965: 0302 C0 00 PUSH R0B0 ;SAVE REGISTER 1
966: 0304 78 2E MOV R0,#FP_DIG78 ;SET UP THE POINTER
967: ;
968: 0306 E3 LOADR1: MOVX A,@R1
969: 0307 F6 MOV @R0,A
970: 0308 19 DEC R1
971: 0309 18 DEC R0
972: 030A B8 2A F9 CJNE R0,#FP_CARRY,LOADR1
973: ;
974: 030D D0 00 POP R0B0
975: 030F 22 RET
976: ;
977: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 27
Line I Addr Code Source
978: ;***************************************************************
979: ;
980: 0310 HEXSCAN: ; Scan a string to determine if it is a hex number
981: ; set carry if hex, else carry = 0
982: ;
983: ;***************************************************************
984: ;
985: 0310 71 E6 ACALL GET_DPTR_CHARACTER
986: 0312 C0 83 PUSH DPH
987: 0314 C0 82 PUSH DPL ;SAVE THE POINTER
988: ;
989: 0316 E0 HEXSC1: MOVX A,@DPTR ;GET THE CHARACTER
990: 0317 B1 F4 ACALL DIGIT_CHECK ;SEE IF A DIGIT
991: 0319 40 12 JC HS1 ;CONTINUE IF A DIGIT
992: 031B 71 30 ACALL HEX_CHECK ;SEE IF HEX
993: 031D 40 0E JC HS1
994: ;
995: 031F C2 E5 CLR ACC.5 ;NO LOWER CASE
996: 0321 B4 48 03 CJNE A,#'H',HEXDON
997: 0324 D3 SETB C
998: 0325 80 01 SJMP HEXDO1 ;NUMBER IS VALID HEX, MAYBE
999: ;
1000: 0327 C3 HEXDON: CLR C
1001: ;
1002: 0328 D0 82 HEXDO1: POP DPL ;RESTORE POINTER
1003: 032A D0 83 POP DPH
1004: 032C 22 RET
1005: ;
1006: 032D A3 HS1: INC DPTR ;BUMP TO NEXT CHARACTER
1007: 032E 80 E6 SJMP HEXSC1 ;LOOP
1008: ;
1009: 0330 HEX_CHECK: ;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND
1010: ;
1011: 0330 C2 E5 CLR ACC.5 ;WASTE LOWER CASE
1012: 0332 B4 47 00 CJNE A,#'F'+1,$+3 ;SEE IF F OR LESS
1013: 0335 40 01 JC HC1
1014: 0337 22 RET
1015: ;
1016: 0338 B4 41 00 HC1: CJNE A,#'A',$+3 ;SEE IF A OR GREATER
1017: 033B B3 CPL C
1018: 033C 22 RET
1019: ;
1020: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 28
Line I Addr Code Source
1021: ;
1022: 033D PUSHR2R0:
1023: ;
1024: 033D 7B 00 MOV R3,#HIGH CONVT ;CONVERSION LOCATION
1025: 033F 79 48 MOV R1,#LOW CONVT
1026: 0341 B1 7E ACALL CONVERT_BINARY_TO_ASCII_STRING
1027: 0343 74 0D MOV A,#0DH ;A CR TO TERMINATE
1028: 0345 F3 MOVX @R1,A ;SAVE THE CR
1029: 0346 90 00 48 MOV DPTR,#CONVT
1030: ;
1031: ; Falls thru to FLOATING INPUT
1032: ;
1033: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 29
Line I Addr Code Source
1034: ;***************************************************************
1035: ;
1036: 0349 FLOATING_POINT_INPUT: ; Input a floating point number pointed to by
1037: ; the DPTR
1038: ;
1039: ;***************************************************************
1040: ;
1041: 0349 51 39 ACALL FP_CLEAR ;CLEAR EVERYTHING
1042: 034B 71 E6 ACALL GET_DPTR_CHARACTER
1043: 034D 71 EC ACALL PLUS_MINUS_TEST
1044: 034F 92 78 MOV MSIGN,C ;SAVE THE MANTISSA SIGN
1045: ;
1046: ; Now, set up for input loop
1047: ;
1048: 0351 78 34 MOV R0,#FP_ACCC
1049: 0353 7E 7F MOV R6,#7FH ;BASE EXPONENT
1050: 0355 D2 D5 SETB F0 ;SET INITIAL FLAG
1051: ;
1052: 0357 B1 F2 INLOOP: ACALL GET_DIGIT_CHECK
1053: 0359 50 07 JNC GTEST ;IF NOT A CHARACTER, WHAT IS IT?
1054: 035B 54 0F ANL A,#0FH ;STRIP ASCII
1055: 035D 71 BF ACALL STDIG ;STORE THE DIGITS
1056: ;
1057: 035F A3 INLPIK: INC DPTR ;BUMP POINTER FOR LOOP
1058: 0360 80 F5 SJMP INLOOP ;LOOP FOR INPUT
1059: ;
1060: 0362 B4 2E 0C GTEST: CJNE A,#'.',GT1 ;SEE IF A RADIX
1061: 0365 20 51 63 JB FOUND_RADIX,INERR
1062: 0368 D2 51 SETB FOUND_RADIX
1063: 036A B8 34 F2 CJNE R0,#FP_ACCC,INLPIK
1064: 036D D2 52 SETB FIRST_RADIX ;SET IF FIRST RADIX
1065: 036F 80 EE SJMP INLPIK ;GET ADDITIONAL DIGITS
1066: ;
1067: 0371 20 D5 57 GT1: JB F0,INERR ;ERROR IF NOT CLEARED
1068: 0374 B4 65 02 CJNE A,#'e',$+5 ;CHECK FOR LOWER CASE
1069: 0377 80 03 SJMP $+5
1070: 0379 B4 45 33 CJNE A,#'E',FINISH_UP
1071: 037C 71 E5 ACALL INC_AND_GET_DPTR_CHARACTER
1072: 037E 71 EC ACALL PLUS_MINUS_TEST
1073: 0380 92 50 MOV XSIGN,C ;SAVE SIGN STATUS
1074: 0382 B1 F2 ACALL GET_DIGIT_CHECK
1075: 0384 50 45 JNC INERR
1076: ;
1077: 0386 54 0F ANL A,#0FH ;STRIP ASCII BIAS OFF THE CHARACTER
1078: 0388 FD MOV R5,A ;SAVE THE CHARACTER IN R5
1079: ;
1080: 0389 A3 GT2: INC DPTR
1081: 038A B1 F2 ACALL GET_DIGIT_CHECK
1082: 038C 50 0D JNC FINISH1
1083: 038E 54 0F ANL A,#0FH ;STRIP OFF BIAS
1084: 0390 CD XCH A,R5 ;GET THE LAST DIGIT
1085: 0391 75 F0 0A MOV B,#10 ;MULTIPLY BY TEN
1086: 0394 A4 MUL AB
1087: 0395 2D ADD A,R5 ;ADD TO ORIGINAL VALUE
1088: 0396 FD MOV R5,A ;SAVE IN R5
1089: 0397 50 F0 JNC GT2 ;LOOP IF NO CARRY
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 30
Line I Addr Code Source
1090: 0399 7D FF MOV R5,#0FFH ;FORCE AN ERROR
1091: ;
1092: 039B ED FINISH1:MOV A,R5 ;GET THE SIGN
1093: 039C 30 50 09 JNB XSIGN,POSNUM ;SEE IF EXPONENT IS POS OR NEG
1094: 039F C3 CLR C
1095: 03A0 9E SUBB A,R6
1096: 03A1 F4 CPL A
1097: 03A2 04 INC A
1098: 03A3 40 09 JC FINISH2
1099: 03A5 74 01 MOV A,#01H
1100: 03A7 22 RET
1101: ;
1102: 03A8 2E POSNUM: ADD A,R6 ;ADD TO EXPONENT
1103: 03A9 50 03 JNC FINISH2
1104: ;
1105: 03AB 74 02 POSNM1: MOV A,#02H
1106: 03AD 22 RET
1107: ;
1108: 03AE CE FINISH2:XCH A,R6 ;SAVE THE EXPONENT
1109: ;
1110: 03AF FINISH_UP:
1111: ;
1112: 03AF 8E 30 MOV FP_EXP,R6 ;SAVE EXPONENT
1113: 03B1 B8 34 02 CJNE R0,#FP_ACCC,$+5
1114: 03B4 51 39 ACALL FP_CLEAR ;CLEAR THE MEMORY IF 0
1115: 03B6 E5 24 MOV A,ARG_STACK ;GET THE ARG STACK
1116: 03B8 C3 CLR C
1117: 03B9 94 0C SUBB A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
1118: 03BB F5 24 MOV ARG_STACK,A ;ADJUST FOR STORE
1119: 03BD 21 AA AJMP PACK
1120: ;
1121: 03BF C2 D5 STDIG: CLR F0 ;CLEAR INITIAL DESIGNATOR
1122: 03C1 70 0B JNZ STDIG1 ;CONTINUE IF NOT ZERO
1123: 03C3 B8 34 08 CJNE R0,#FP_ACCC,STDIG1
1124: 03C6 30 52 04 JNB FIRST_RADIX,RET_X
1125: ;
1126: 03C9 DE 02 DECX: DJNZ R6,RET_X
1127: ;
1128: 03CB 74 FF INERR: MOV A,#0FFH
1129: ;
1130: 03CD 22 RET_X: RET
1131: ;
1132: 03CE 20 53 02 STDIG1: JB DONE_LOAD,FRTEST
1133: 03D1 C2 52 CLR FIRST_RADIX
1134: ;
1135: 03D3 20 52 F3 FRTEST: JB FIRST_RADIX,DECX
1136: ;
1137: 03D6 20 51 01 FDTEST: JB FOUND_RADIX,FDT1
1138: 03D9 0E INC R6
1139: ;
1140: 03DA 20 53 F0 FDT1: JB DONE_LOAD,RET_X
1141: 03DD B8 3D 02 CJNE R0,#FP_ACC8+1,FDT2
1142: 03E0 D2 53 SETB DONE_LOAD
1143: ;
1144: 03E2 F6 FDT2: MOV @R0,A ;SAVE THE STRIPPED ACCUMULATOR
1145: 03E3 08 INC R0 ;BUMP THE POINTER
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 31
Line I Addr Code Source
1146: 03E4 22 RET ;EXIT
1147: ;
1148: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 32
Line I Addr Code Source
1149: ;***************************************************************
1150: ;
1151: ; I/O utilities
1152: ;
1153: ;***************************************************************
1154: ;
1155: 03E5 INC_AND_GET_DPTR_CHARACTER:
1156: ;
1157: 03E5 A3 INC DPTR
1158: ;
1159: 03E6 GET_DPTR_CHARACTER:
1160: ;
1161: 03E6 E0 MOVX A,@DPTR ;GET THE CHARACTER
1162: 03E7 B4 20 16 CJNE A,#' ',PMT1 ;SEE IF A SPACE
1163: ;
1164: ; Kill spaces
1165: ;
1166: 03EA 80 F9 SJMP INC_AND_GET_DPTR_CHARACTER
1167: ;
1168: 03EC PLUS_MINUS_TEST:
1169: ;
1170: 03EC B4 E3 02 CJNE A,#0E3H,$+5 ;SEE IF A PLUS, PLUS TOKEN FROM BASIC
1171: 03EF 80 0E SJMP PMT3
1172: 03F1 B4 2B 02 CJNE A,#'+',$+5
1173: 03F4 80 09 SJMP PMT3
1174: 03F6 B4 E5 02 CJNE A,#0E5H,$+5 ;SEE IF MINUS, MINUS TOKEN FROM BASIC
1175: 03F9 80 03 SJMP PMT2
1176: 03FB B4 2D 02 CJNE A,#'-',PMT1
1177: ;
1178: 03FE D3 PMT2: SETB C
1179: ;
1180: 03FF A3 PMT3: INC DPTR
1181: ;
1182: 0400 22 PMT1: RET
1183: ;
1184: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 33
Line I Addr Code Source
1185: ;***************************************************************
1186: ;
1187: 0401 FLOATING_POINT_OUTPUT: ; Output the number, format is in location 25
1188: ;
1189: ; IF FORMAT = 00 - FREE FLOATING
1190: ; = FX - EXPONENTIAL (X IS THE NUMBER OF SIG DIGITS)
1191: ; = NX - N = NUM BEFORE RADIX, X = NUM AFTER RADIX
1192: ; N + X = 8 MAX
1193: ;
1194: ;***************************************************************
1195: ;
1196: 0401 51 F1 ACALL MDES1 ;GET THE NUMBER TO OUTPUT, R0 IS POINTER
1197: 0403 11 42 ACALL POP_AND_EXIT ;OUTPUT POPS THE STACK
1198: 0405 EF MOV A,R7
1199: 0406 FE MOV R6,A ;PUT THE EXPONENT IN R6
1200: 0407 51 05 ACALL UNPACK_R0 ;UNPACK THE NUMBER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -