📄 fp-52.lst
字号:
1198: ; If here, must be integer USING format
1199: ;
1200: 1D9B EE MOV A,R6 ;GET THE EXPONENT
1201: 1D9C 70 02 JNZ $+4
1202: 1D9E 7E 80 MOV R6,#80H
1203: 1DA0 EB MOV A,R3 ;GET THE FORMAT
1204: 1DA1 C4 SWAP A ;SPLIT INTEGER AND FRACTION
1205: 1DA2 54 0F ANL A,#0FH
1206: 1DA4 FA MOV R2,A ;SAVE INTEGER
1207: 1DA5 D1 74 ACALL NUM_LT ;GET THE NUMBER OF INTEGERS
1208: 1DA7 CA XCH A,R2 ;FLIP FOR SUBB
1209: 1DA8 C3 CLR C
1210: 1DA9 9A SUBB A,R2
1211: 1DAA FF MOV R7,A
1212: 1DAB 50 06 JNC $+8
1213: 1DAD 7D 3F MOV R5,#'?' ;OUTPUT A QUESTION MARK
1214: 1DAF D1 A9 ACALL SOUT1 ;NUMBER IS TOO LARGE FOR FORMAT
1215: 1DB1 A1 DF AJMP FREE
1216: 1DB3 BA 00 07 CJNE R2,#00,USING0 ;SEE IF ZERO
1217: 1DB6 1F DEC R7
1218: 1DB7 D1 96 ACALL SS7
1219: 1DB9 D1 A3 ACALL ZOUT ;OUTPUT A ZERO
1220: 1DBB 80 06 SJMP USING1
1221: ;
1222: 1DBD D1 96 USING0: ACALL SS7 ;OUTPUT SPACES, IF NEED TO
1223: 1DBF EA MOV A,R2 ;OUTPUT DIGITS
1224: 1DC0 FF MOV R7,A
1225: 1DC1 D1 58 ACALL OUTR0
1226: ;
1227: 1DC3 EB USING1: MOV A,R3
1228: 1DC4 54 0F ANL A,#0FH ;GET THE NUMBER RIGHT OF DP
1229: 1DC6 FA MOV R2,A ;SAVE IT
1230: 1DC7 60 BD JZ PMT1 ;EXIT IF ZERO
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 35
Line I Addr Code Source
1231: 1DC9 D1 9F ACALL ROUT ;OUTPUT DP
1232: 1DCB D1 7D ACALL NUM_RT
1233: 1DCD B5 02 03 CJNE A,2,USINGX ;COMPARE A TO R2
1234: ;
1235: 1DD0 EA USINGY: MOV A,R2
1236: 1DD1 C1 8D AJMP Z7R7
1237: ;
1238: 1DD3 50 FB USINGX: JNC USINGY
1239: ;
1240: 1DD5 CA USING2: XCH A,R2
1241: 1DD6 C3 CLR C
1242: 1DD7 9A SUBB A,R2
1243: 1DD8 CA XCH A,R2
1244: 1DD9 D1 8D ACALL Z7R7 ;OUTPUT ZEROS IF NEED TO
1245: 1DDB EA MOV A,R2
1246: 1DDC FF MOV R7,A
1247: 1DDD C1 58 AJMP OUTR0
1248: ;
1249: ; First, force exponential output, if need to
1250: ;
1251: 1DDF EE FREE: MOV A,R6 ;GET THE EXPONENT
1252: 1DE0 70 04 JNZ FREE1 ;IF ZERO, PRINT IT
1253: 1DE2 D1 A7 ACALL SOUT
1254: 1DE4 C1 A3 AJMP ZOUT
1255: ;
1256: 1DE6 7B F0 FREE1: MOV R3,#0F0H ;IN CASE EXP NEEDED
1257: 1DE8 74 77 MOV A,#80H-DIGIT-DIGIT-1
1258: 1DEA 2E ADD A,R6
1259: 1DEB 40 21 JC EXPOUT
1260: 1DED 94 F7 SUBB A,#0F7H
1261: 1DEF 40 1D JC EXPOUT
1262: ;
1263: ; Now, just print the number
1264: ;
1265: 1DF1 D1 98 ACALL SINOUT ;PRINT THE SIGN OF THE NUMBER
1266: 1DF3 D1 74 ACALL NUM_LT ;GET THE NUMBER LEFT OF DP
1267: 1DF5 B4 08 02 CJNE A,#8,FREE4
1268: 1DF8 C1 58 AJMP OUTR0
1269: ;
1270: 1DFA D1 58 FREE4: ACALL OUTR0
1271: 1DFC D1 6A ACALL ZTEST ;TEST FOR TRAILING ZEROS
1272: 1DFE 60 57 JZ U_RET ;DONE IF ALL TRAILING ZEROS
1273: 1E00 D1 9F ACALL ROUT ;OUTPUT RADIX
1274: ;
1275: 1E02 7F 01 FREE2: MOV R7,#1 ;OUTPUT ONE DIGIT
1276: 1E04 D1 58 ACALL OUTR0
1277: 1E06 70 4F JNZ U_RET
1278: 1E08 D1 6A ACALL ZTEST
1279: 1E0A 60 4B JZ U_RET
1280: 1E0C 80 F4 SJMP FREE2 ;LOOP
1281: ;
1282: 1E0E D1 98 EXPOUT: ACALL SINOUT ;PRINT THE SIGN
1283: 1E10 7F 01 MOV R7,#1 ;OUTPUT ONE CHARACTER
1284: 1E12 D1 58 ACALL OUTR0
1285: 1E14 D1 9F ACALL ROUT ;OUTPUT RADIX
1286: 1E16 EB MOV A,R3 ;GET FORMAT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 36
Line I Addr Code Source
1287: 1E17 54 0F ANL A,#0FH ;STRIP INDICATOR
1288: 1E19 60 06 JZ EXPOTX
1289: ;
1290: 1E1B FF MOV R7,A ;OUTPUT THE NUMBER OF DIGITS
1291: 1E1C 1F DEC R7 ;ADJUST BECAUSE ONE CHAR ALREADY OUT
1292: 1E1D D1 58 ACALL OUTR0
1293: 1E1F 80 02 SJMP EXPOT4
1294: ;
1295: 1E21 D1 02 EXPOTX: ACALL FREE2 ;OUTPUT UNTIL TRAILING ZEROS
1296: ;
1297: 1E23 D1 A7 EXPOT4: ACALL SOUT ;OUTPUT A SPACE
1298: 1E25 7D 45 MOV R5,#'E'
1299: 1E27 D1 A9 ACALL SOUT1 ;OUTPUT AN E
1300: 1E29 EE MOV A,R6 ;GET THE EXPONENT
1301: 1E2A 60 04 JZ XOUT0 ;EXIT IF ZERO
1302: 1E2C 14 DEC A ;ADJUST FOR THE DIGIT ALREADY OUTPUT
1303: 1E2D B4 80 05 CJNE A,#80H,XOUT2 ;SEE WHAT IT IS
1304: ;
1305: 1E30 D1 A7 XOUT0: ACALL SOUT
1306: 1E32 E4 CLR A
1307: 1E33 80 0C SJMP XOUT4
1308: ;
1309: 1E35 40 06 XOUT2: JC XOUT3 ;NEGATIVE EXPONENT
1310: 1E37 7D 2B MOV R5,#'+' ;OUTPUT A PLUS SIGN
1311: 1E39 D1 A9 ACALL SOUT1
1312: 1E3B 80 04 SJMP XOUT4
1313: ;
1314: 1E3D D1 9B XOUT3: ACALL MOUT
1315: 1E3F F4 CPL A ;FLIP BITS
1316: 1E40 04 INC A ;BUMP
1317: ;
1318: 1E41 C2 E7 XOUT4: CLR ACC.7
1319: 1E43 F8 MOV R0,A
1320: 1E44 7A 00 MOV R2,#0
1321: 1E46 79 58 MOV R1,#LOW CONVT ;CONVERSION LOCATION
1322: 1E48 7B 00 MOV R3,#HIGH CONVT
1323: 1E4A F1 04 ACALL CONVERT_BINARY_TO_ASCII_STRING
1324: 1E4C 78 58 MOV R0,#LOW CONVT ;NOW, OUTPUT EXPONENT
1325: ;
1326: 1E4E E2 EXPOT5: MOVX A,@R0 ;GET THE CHARACTER
1327: 1E4F FD MOV R5,A ;OUTPUT IT
1328: 1E50 D1 A9 ACALL SOUT1
1329: 1E52 08 INC R0 ;BUMP THE POINTER
1330: 1E53 E8 MOV A,R0 ;GET THE POINTER
1331: 1E54 B5 01 F7 CJNE A,R1B0,EXPOT5 ;LOOP
1332: ;
1333: 1E57 22 U_RET: RET ;EXIT
1334: ;
1335: 1E58 OUTR0: ; Output the characters pointed to by R0, also bias ascii
1336: ;
1337: 1E58 EF MOV A,R7 ;GET THE COUNTER
1338: 1E59 60 0E JZ OUTR ;EXIT IF DONE
1339: 1E5B E6 MOV A,@R0 ;GET THE NUMBER
1340: 1E5C 44 30 ORL A,#30H ;ASCII BIAS
1341: 1E5E 08 INC R0 ;BUMP POINTER AND COUNTER
1342: 1E5F 1F DEC R7
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 37
Line I Addr Code Source
1343: 1E60 FD MOV R5,A ;PUT CHARACTER IN OUTPUT REGISTER
1344: 1E61 D1 A9 ACALL SOUT1 ;OUTPUT THE CHARACTER
1345: 1E63 E4 CLR A ;JUST FOR TEST
1346: 1E64 B8 33 F1 CJNE R0,#FP_NIB8+1,OUTR0
1347: 1E67 74 55 MOV A,#55H ;KNOW WHERE EXIT OCCURED
1348: ;
1349: 1E69 22 OUTR: RET
1350: ;
1351: 1E6A A9 00 ZTEST: MOV R1,R0B0 ;GET POINTER REGISTER
1352: ;
1353: 1E6C E7 ZT0: MOV A,@R1 ;GET THE VALUE
1354: 1E6D 70 04 JNZ ZT1
1355: 1E6F 09 INC R1 ;BUMP POINTER
1356: 1E70 B9 33 F9 CJNE R1,#FP_NIB8+1,ZT0
1357: ;
1358: 1E73 22 ZT1: RET
1359: ;
1360: 1E74 EE NUM_LT: MOV A,R6 ;GET EXPONENT
1361: 1E75 C3 CLR C ;GET READY FOR SUBB
1362: 1E76 94 80 SUBB A,#80H ;SUB EXPONENT BIAS
1363: 1E78 50 01 JNC NL1 ;OK IF NO CARRY
1364: 1E7A E4 CLR A ;NO DIGITS LEFT
1365: ;
1366: 1E7B FF NL1: MOV R7,A ;SAVE THE COUNT
1367: 1E7C 22 RET
1368: ;
1369: 1E7D C3 NUM_RT: CLR C ;SUBB AGAIN
1370: 1E7E 74 80 MOV A,#80H ;EXPONENT BIAS
1371: 1E80 9E SUBB A,R6 ;GET THE BIASED EXPONENT
1372: 1E81 50 01 JNC NR1
1373: 1E83 E4 CLR A
1374: ;
1375: 1E84 22 NR1: RET ;EXIT
1376: ;
1377: 1E85 EF SPACE7: MOV A,R7 ;GET THE NUMBER OF SPACES
1378: 1E86 60 FC JZ NR1 ;EXIT IF ZERO
1379: 1E88 D1 A7 ACALL SOUT ;OUTPUT A SPACE
1380: 1E8A 1F DEC R7 ;BUMP COUNTER
1381: 1E8B 80 F8 SJMP SPACE7 ;LOOP
1382: ;
1383: 1E8D FF Z7R7: MOV R7,A
1384: ;
1385: 1E8E EF ZERO7: MOV A,R7 ;GET COUNTER
1386: 1E8F 60 F3 JZ NR1 ;EXIT IF ZERO
1387: 1E91 D1 A3 ACALL ZOUT ;OUTPUT A ZERO
1388: 1E93 1F DEC R7 ;BUMP COUNTER
1389: 1E94 80 F8 SJMP ZERO7 ;LOOP
1390: ;
1391: 1E96 D1 85 SS7: ACALL SPACE7
1392: ;
1393: 1E98 EC SINOUT: MOV A,R4 ;GET THE SIGN
1394: 1E99 60 0C JZ SOUT ;OUTPUT A SPACE IF ZERO
1395: ;
1396: 1E9B 7D 2D MOUT: MOV R5,#'-'
1397: 1E9D 80 0A SJMP SOUT1 ;OUTPUT A MINUS IF NOT
1398: ;
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 38
Line I Addr Code Source
1399: 1E9F 7D 2E ROUT: MOV R5,#'.' ;OUTPUT A RADIX
1400: 1EA1 80 06 SJMP SOUT1
1401: ;
1402: 1EA3 7D 30 ZOUT: MOV R5,#'0' ;OUTPUT A ZERO
1403: 1EA5 80 02 SJMP SOUT1
1404: ;
1405: 1EA7 7D 20 SOUT: MOV R5,#' ' ;OUTPUT A SPACE
1406: ;
1407: 1EA9 21 90 SOUT1: AJMP OUTPUT
1408: ;
1409: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 39
Line I Addr Code Source
1410: ;***************************************************************
1411: ;
1412: 1EAB CONVERT_ASCII_STRING_TO_BINARY:
1413: ;
1414: ;DPTR POINTS TO ASCII STRING
1415: ;PUT THE BINARY NUMBER IN R2:R0, ERROR IF >64K
1416: ;
1417: ;***************************************************************
1418: ;
1419: 1EAB 91 96 CASB: ACALL HEXSCAN ;SEE IF HEX NUMBER
1420: 1EAD 92 23 MOV ADD_IN,C ;IF ADD_IN IS SET, THE NUMBER IS HEX
1421: 1EAF F1 EB ACALL GET_DIGIT_CHECK
1422: 1EB1 B3 CPL C ;FLIP FOR EXIT
1423: 1EB2 40 28 JC RCASB
1424: 1EB4 7B 00 MOV R3,#00H ;ZERO R3:R1 FOR LOOP
1425: 1EB6 79 00 MOV R1,#00H
1426: 1EB8 80 15 SJMP CASB5
1427: ;
1428: 1EBA A3 CASB2: INC DPTR
1429: 1EBB 89 00 MOV R0B0,R1 ;SAVE THE PRESENT CONVERTED VALUE
1430: 1EBD 8B 02 MOV R0B0+2,R3 ;IN R2:R0
1431: 1EBF F1 EB ACALL GET_DIGIT_CHECK
1432: 1EC1 40 0C JC CASB5
1433: 1EC3 30 23 16 JNB ADD_IN,RCASB ;CONVERSION COMPLETE
1434: 1EC6 91 B6 ACALL HEX_CHECK ;SEE IF HEX NUMBER
1435: 1EC8 40 03 JC CASB4 ;PROCEED IF GOOD
1436: 1ECA A3 INC DPTR ;BUMP PAST H
1437: 1ECB 80 0F SJMP RCASB
1438: ;
1439: 1ECD 24 09 CASB4: ADD A,#9 ;ADJUST HEX ASCII BIAS
1440: ;
1441: 1ECF 75 F0 0A CASB5: MOV B,#10
1442: 1ED2 30 23 03 JNB ADD_IN,CASB6
1443: 1ED5 75 F0 10 MOV B,#16 ;HEX MODE
1444: ;
1445: 1ED8 D1 E3 CASB6: ACALL MULNUM ;ACCUMULATE THE DIGITS
1446: 1EDA 50 DE JNC CASB2 ;LOOP IF NO CARRY
1447: ;
1448: 1EDC E4 RCASB: CLR A ;RESET ACC
1449: 1EDD 92 E1 MOV ACC.OVERFLOW,C ;IF OVERFLOW, SAY SO
1450: 1EDF 22 RET ;EXIT
1451: ;
1452: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 40
Line I Addr Code Source
1453: ;
1454: 1EE0 75 F0 0A MULNUM10:MOV B,#10
1455: ;
1456: ;***************************************************************
1457: ;
1458: 1EE3 MULNUM: ; Take the next digit in the acc (masked to 0FH)
1459: ; accumulate in R3:R1
1460: ;
1461: ;***************************************************************
1462: ;
1463: 1EE3 C0 E0 PUSH ACC ;SAVE ACC
1464: 1EE5 C0 F0 PUSH B ;SAVE MULTIPLIER
1465: 1EE7 E9 MOV A,R1 ;PUT LOW ORDER BITS IN ACC
1466: 1EE8 A4 MUL AB ;DO THE MULTIPLY
1467: 1EE9 F9 MOV R1,A ;PUT THE RESULT BACK
1468: 1EEA EB MOV A,R3 ;GET THE HIGH ORDER BYTE
1469: 1EEB AB F0 MOV R3,B ;SAVE THE OVERFLOW
1470: 1EED D0 F0 POP B ;GET THE MULTIPLIER
1471: 1EEF A4 MUL AB ;DO IT
1472: 1EF0 A2 D2 MOV C,OV ;SAVE OVERFLOW IN F0
1473: 1EF2 92 D5 MOV F0,C
1474: 1EF4 2B ADD A,R3 ;ADD OVERFLOW TO HIGH RESULT
1475: 1EF5 FB MOV R3,A ;PUT IT BACK
1476: 1EF6 D0 E0 POP ACC ;GET THE ORIGINAL ACC BACK
1477: 1EF8 72 D5 ORL C,F0 ;OR CARRY AND OVERFLOW
1478: 1EFA 40 07 JC MULX ;NO GOOD IF THE CARRY IS SET
1479: ;
1480: 1EFC 54 0F MUL11: ANL A,#0FH ;MASK OFF HIGH ORDER BITS
1481: 1EFE 29 ADD A,R1 ;NOW ADD THE ACC
1482: 1EFF F9 MOV R1,A ;PUT IT BACK
1483: 1F00 E4 CLR A ;PROPAGATE THE CARRY
1484: 1F01 3B ADDC A,R3
1485: 1F02 FB MOV R3,A ;PUT IT BACK
1486: ;
1487: 1F03 22 MULX: RET ;EXIT WITH OR WITHOUT CARRY
1488: ;
1489: ;***************************************************************
1490: ;
1491: 1F04 CONVERT_BINARY_TO_ASCII_STRING:
1492: ;
1493: ;R3:R1 contains the address of the string
1494: ;R2:R0 contains the value to convert
1495: ;DPTR, R7, R6, and ACC gets clobbered
1496: ;
1497: ;***************************************************************
1498: ;
1499: 1F04 E4 CLR A ;NO LEADING ZEROS
1500: 1F05 90 27 10 MOV DPTR,#10000 ;SUBTRACT 10000
1501: 1F08 F1 21 ACALL RSUB ;DO THE SUBTRACTION
1502: 1F0A 90 03 E8 MOV DPTR,#1000 ;NOW 1000
1503: 1F0D F1 21 ACALL RSUB
1504: 1F0F 90 00 64 MOV DPTR,#100 ;NOW 100
1505: 1F12 F1 21 ACALL RSUB
1506: 1F14 90 00 0A MOV DPTR,#10 ;NOW 10
1507: 1F17 F1 21 ACALL RSUB
1508: 1F19 90 00 01 MOV DPTR,#1 ;NOW 1
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 41
Line I Addr Code Source
1509: 1F1C F1 21 ACALL RSUB
151
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -