📄 fp52.lst
字号:
1201: 0409 78 2B MOV R0,#FP_NIB1 ;POINT AT THE NUMBER
1202: 040B E5 25 MOV A,FORMAT ;GET THE FORMAT
1203: 040D FB MOV R3,A ;SAVE IN CASE OF EXP FORMAT
1204: 040E 60 49 JZ FREE ;FREE FLOATING?
1205: 0410 B4 F0 00 CJNE A,#0F0H,$+3 ;SEE IF EXPONENTIAL
1206: 0413 50 73 JNC EXPOUT
1207: ;
1208: ; If here, must be integer USING format
1209: ;
1210: 0415 EE MOV A,R6 ;GET THE EXPONENT
1211: 0416 70 02 JNZ $+4
1212: 0418 7E 80 MOV R6,#80H
1213: 041A EB MOV A,R3 ;GET THE FORMAT
1214: 041B C4 SWAP A ;SPLIT INTEGER AND FRACTION
1215: 041C 54 0F ANL A,#0FH
1216: 041E FA MOV R2,A ;SAVE INTEGER
1217: 041F 91 EE ACALL NUM_LT ;GET THE NUMBER OF INTEGERS
1218: 0421 CA XCH A,R2 ;FLIP FOR SUBB
1219: 0422 C3 CLR C
1220: 0423 9A SUBB A,R2
1221: 0424 FF MOV R7,A
1222: 0425 50 06 JNC $+8
1223: 0427 7D 3F MOV R5,#'?' ;OUTPUT A QUESTION MARK
1224: 0429 B1 23 ACALL SOUT1 ;NUMBER IS TOO LARGE FOR FORMAT
1225: 042B 81 59 AJMP FREE
1226: 042D BA 00 07 CJNE R2,#00,USING0 ;SEE IF ZERO
1227: 0430 1F DEC R7
1228: 0431 B1 10 ACALL SS7
1229: 0433 B1 1D ACALL ZOUT ;OUTPUT A ZERO
1230: 0435 80 06 SJMP USING1
1231: ;
1232: 0437 B1 10 USING0: ACALL SS7 ;OUTPUT SPACES, IF NEED TO
1233: 0439 EA MOV A,R2 ;OUTPUT DIGITS
1234: 043A FF MOV R7,A
1235: 043B 91 D2 ACALL OUTR0
1236: ;
1237: 043D EB USING1: MOV A,R3
1238: 043E 54 0F ANL A,#0FH ;GET THE NUMBER RIGHT OF DP
1239: 0440 FA MOV R2,A ;SAVE IT
1240: 0441 60 BD JZ PMT1 ;EXIT IF ZERO
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 34
Line I Addr Code Source
1241: 0443 B1 19 ACALL ROUT ;OUTPUT DP
1242: 0445 91 F7 ACALL NUM_RT
1243: 0447 B5 02 03 CJNE A,2,USINGX ;COMPARE A TO R2
1244: ;
1245: 044A EA USINGY: MOV A,R2
1246: 044B A1 07 AJMP Z7R7
1247: ;
1248: 044D 50 FB USINGX: JNC USINGY
1249: ;
1250: 044F CA USING2: XCH A,R2
1251: 0450 C3 CLR C
1252: 0451 9A SUBB A,R2
1253: 0452 CA XCH A,R2
1254: 0453 B1 07 ACALL Z7R7 ;OUTPUT ZEROS IF NEED TO
1255: 0455 EA MOV A,R2
1256: 0456 FF MOV R7,A
1257: 0457 81 D2 AJMP OUTR0
1258: ;
1259: ; First, force exponential output, if need to
1260: ;
1261: 0459 EE FREE: MOV A,R6 ;GET THE EXPONENT
1262: 045A 70 04 JNZ FREE1 ;IF ZERO, PRINT IT
1263: 045C B1 21 ACALL SOUT
1264: 045E A1 1D AJMP ZOUT
1265: ;
1266: 0460 7B F0 FREE1: MOV R3,#0F0H ;IN CASE EXP NEEDED
1267: 0462 74 77 MOV A,#80H-DIGIT-DIGIT-1
1268: 0464 2E ADD A,R6
1269: 0465 40 21 JC EXPOUT
1270: 0467 94 F7 SUBB A,#0F7H
1271: 0469 40 1D JC EXPOUT
1272: ;
1273: ; Now, just print the number
1274: ;
1275: 046B B1 12 ACALL SINOUT ;PRINT THE SIGN OF THE NUMBER
1276: 046D 91 EE ACALL NUM_LT ;GET THE NUMBER LEFT OF DP
1277: 046F B4 08 02 CJNE A,#8,FREE4
1278: 0472 81 D2 AJMP OUTR0
1279: ;
1280: 0474 91 D2 FREE4: ACALL OUTR0
1281: 0476 91 E4 ACALL ZTEST ;TEST FOR TRAILING ZEROS
1282: 0478 60 57 JZ U_RET ;DONE IF ALL TRAILING ZEROS
1283: 047A B1 19 ACALL ROUT ;OUTPUT RADIX
1284: ;
1285: 047C 7F 01 FREE2: MOV R7,#1 ;OUTPUT ONE DIGIT
1286: 047E 91 D2 ACALL OUTR0
1287: 0480 70 4F JNZ U_RET
1288: 0482 91 E4 ACALL ZTEST
1289: 0484 60 4B JZ U_RET
1290: 0486 80 F4 SJMP FREE2 ;LOOP
1291: ;
1292: 0488 B1 12 EXPOUT: ACALL SINOUT ;PRINT THE SIGN
1293: 048A 7F 01 MOV R7,#1 ;OUTPUT ONE CHARACTER
1294: 048C 91 D2 ACALL OUTR0
1295: 048E B1 19 ACALL ROUT ;OUTPUT RADIX
1296: 0490 EB MOV A,R3 ;GET FORMAT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 35
Line I Addr Code Source
1297: 0491 54 0F ANL A,#0FH ;STRIP INDICATOR
1298: 0493 60 06 JZ EXPOTX
1299: ;
1300: 0495 FF MOV R7,A ;OUTPUT THE NUMBER OF DIGITS
1301: 0496 1F DEC R7 ;ADJUST BECAUSE ONE CHAR ALREADY OUT
1302: 0497 91 D2 ACALL OUTR0
1303: 0499 80 02 SJMP EXPOT4
1304: ;
1305: 049B 91 7C EXPOTX: ACALL FREE2 ;OUTPUT UNTIL TRAILING ZEROS
1306: ;
1307: 049D B1 21 EXPOT4: ACALL SOUT ;OUTPUT A SPACE
1308: 049F 7D 45 MOV R5,#'E'
1309: 04A1 B1 23 ACALL SOUT1 ;OUTPUT AN E
1310: 04A3 EE MOV A,R6 ;GET THE EXPONENT
1311: 04A4 60 04 JZ XOUT0 ;EXIT IF ZERO
1312: 04A6 14 DEC A ;ADJUST FOR THE DIGIT ALREADY OUTPUT
1313: 04A7 B4 80 05 CJNE A,#80H,XOUT2 ;SEE WHAT IT IS
1314: ;
1315: 04AA B1 21 XOUT0: ACALL SOUT
1316: 04AC E4 CLR A
1317: 04AD 80 0C SJMP XOUT4
1318: ;
1319: 04AF 40 06 XOUT2: JC XOUT3 ;NEGATIVE EXPONENT
1320: 04B1 7D 2B MOV R5,#'+' ;OUTPUT A PLUS SIGN
1321: 04B3 B1 23 ACALL SOUT1
1322: 04B5 80 04 SJMP XOUT4
1323: ;
1324: 04B7 B1 15 XOUT3: ACALL MOUT
1325: 04B9 F4 CPL A ;FLIP BITS
1326: 04BA 04 INC A ;BUMP
1327: ;
1328: 04BB C2 E7 XOUT4: CLR ACC.7
1329: 04BD F8 MOV R0,A
1330: 04BE 7A 00 MOV R2,#0
1331: 04C0 79 48 MOV R1,#LOW CONVT ;CONVERSION LOCATION
1332: 04C2 7B 00 MOV R3,#HIGH CONVT
1333: 04C4 B1 7E ACALL CONVERT_BINARY_TO_ASCII_STRING
1334: 04C6 78 48 MOV R0,#LOW CONVT ;NOW, OUTPUT EXPONENT
1335: ;
1336: 04C8 E2 EXPOT5: MOVX A,@R0 ;GET THE CHARACTER
1337: 04C9 FD MOV R5,A ;OUTPUT IT
1338: 04CA B1 23 ACALL SOUT1
1339: 04CC 08 INC R0 ;BUMP THE POINTER
1340: 04CD E8 MOV A,R0 ;GET THE POINTER
1341: 04CE B5 01 F7 CJNE A,R1B0,EXPOT5 ;LOOP
1342: ;
1343: 04D1 22 U_RET: RET ;EXIT
1344: ;
1345: 04D2 OUTR0: ; Output the characters pointed to by R0, also bias ascii
1346: ;
1347: 04D2 EF MOV A,R7 ;GET THE COUNTER
1348: 04D3 60 0E JZ OUTR ;EXIT IF DONE
1349: 04D5 E6 MOV A,@R0 ;GET THE NUMBER
1350: 04D6 44 30 ORL A,#30H ;ASCII BIAS
1351: 04D8 08 INC R0 ;BUMP POINTER AND COUNTER
1352: 04D9 1F DEC R7
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 36
Line I Addr Code Source
1353: 04DA FD MOV R5,A ;PUT CHARACTER IN OUTPUT REGISTER
1354: 04DB B1 23 ACALL SOUT1 ;OUTPUT THE CHARACTER
1355: 04DD E4 CLR A ;JUST FOR TEST
1356: 04DE B8 33 F1 CJNE R0,#FP_NIB8+1,OUTR0
1357: 04E1 74 55 MOV A,#55H ;KNOW WHERE EXIT OCCURED
1358: ;
1359: 04E3 22 OUTR: RET
1360: ;
1361: 04E4 A9 00 ZTEST: MOV R1,R0B0 ;GET POINTER REGISTER
1362: ;
1363: 04E6 E7 ZT0: MOV A,@R1 ;GET THE VALUE
1364: 04E7 70 04 JNZ ZT1
1365: 04E9 09 INC R1 ;BUMP POINTER
1366: 04EA B9 33 F9 CJNE R1,#FP_NIB8+1,ZT0
1367: ;
1368: 04ED 22 ZT1: RET
1369: ;
1370: 04EE EE NUM_LT: MOV A,R6 ;GET EXPONENT
1371: 04EF C3 CLR C ;GET READY FOR SUBB
1372: 04F0 94 80 SUBB A,#80H ;SUB EXPONENT BIAS
1373: 04F2 50 01 JNC NL1 ;OK IF NO CARRY
1374: 04F4 E4 CLR A ;NO DIGITS LEFT
1375: ;
1376: 04F5 FF NL1: MOV R7,A ;SAVE THE COUNT
1377: 04F6 22 RET
1378: ;
1379: 04F7 C3 NUM_RT: CLR C ;SUBB AGAIN
1380: 04F8 74 80 MOV A,#80H ;EXPONENT BIAS
1381: 04FA 9E SUBB A,R6 ;GET THE BIASED EXPONENT
1382: 04FB 50 01 JNC NR1
1383: 04FD E4 CLR A
1384: ;
1385: 04FE 22 NR1: RET ;EXIT
1386: ;
1387: 04FF EF SPACE7: MOV A,R7 ;GET THE NUMBER OF SPACES
1388: 0500 60 FC JZ NR1 ;EXIT IF ZERO
1389: 0502 B1 21 ACALL SOUT ;OUTPUT A SPACE
1390: 0504 1F DEC R7 ;BUMP COUNTER
1391: 0505 80 F8 SJMP SPACE7 ;LOOP
1392: ;
1393: 0507 FF Z7R7: MOV R7,A
1394: ;
1395: 0508 EF ZERO7: MOV A,R7 ;GET COUNTER
1396: 0509 60 F3 JZ NR1 ;EXIT IF ZERO
1397: 050B B1 1D ACALL ZOUT ;OUTPUT A ZERO
1398: 050D 1F DEC R7 ;BUMP COUNTER
1399: 050E 80 F8 SJMP ZERO7 ;LOOP
1400: ;
1401: 0510 91 FF SS7: ACALL SPACE7
1402: ;
1403: 0512 EC SINOUT: MOV A,R4 ;GET THE SIGN
1404: 0513 60 0C JZ SOUT ;OUTPUT A SPACE IF ZERO
1405: ;
1406: 0515 7D 2D MOUT: MOV R5,#'-'
1407: 0517 80 0A SJMP SOUT1 ;OUTPUT A MINUS IF NOT
1408: ;
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 37
Line I Addr Code Source
1409: 0519 7D 2E ROUT: MOV R5,#'.' ;OUTPUT A RADIX
1410: 051B 80 06 SJMP SOUT1
1411: ;
1412: 051D 7D 30 ZOUT: MOV R5,#'0' ;OUTPUT A ZERO
1413: 051F 80 02 SJMP SOUT1
1414: ;
1415: 0521 7D 20 SOUT: MOV R5,#' ' ;OUTPUT A SPACE
1416: ;
1417: 0523 A1 FF SOUT1: AJMP R5OUT
1418: ;
1419: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 38
Line I Addr Code Source
1420: ;***************************************************************
1421: ;
1422: 0525 CONVERT_ASCII_STRING_TO_BINARY:
1423: ;
1424: ;DPTR POINTS TO ASCII STRING
1425: ;PUT THE BINARY NUMBER IN R2:R0, ERROR IF >64K
1426: ;
1427: ;***************************************************************
1428: ;
1429: 0525 71 10 CASB: ACALL HEXSCAN ;SEE IF HEX NUMBER
1430: 0527 92 33 MOV ADD_IN,C ;IF ADD_IN IS SET, THE NUMBER IS HEX
1431: 0529 B1 F2 ACALL GET_DIGIT_CHECK
1432: 052B B3 CPL C ;FLIP FOR EXIT
1433: 052C 40 28 JC RCASB
1434: 052E 7B 00 MOV R3,#00H ;ZERO R3:R1 FOR LOOP
1435: 0530 79 00 MOV R1,#00H
1436: 0532 80 15 SJMP CASB5
1437: ;
1438: 0534 A3 CASB2: INC DPTR
1439: 0535 89 00 MOV R0B0,R1 ;SAVE THE PRESENT CONVERTED VALUE
1440: 0537 8B 02 MOV R0B0+2,R3 ;IN R2:R0
1441: 0539 B1 F2 ACALL GET_DIGIT_CHECK
1442: 053B 40 0C JC CASB5
1443: 053D 30 33 16 JNB ADD_IN,RCASB ;CONVERSION COMPLETE
1444: 0540 71 30 ACALL HEX_CHECK ;SEE IF HEX NUMBER
1445: 0542 40 03 JC CASB4 ;PROCEED IF GOOD
1446: 0544 A3 INC DPTR ;BUMP PAST H
1447: 0545 80 0F SJMP RCASB
1448: ;
1449: 0547 24 09 CASB4: ADD A,#9 ;ADJUST HEX ASCII BIAS
1450: ;
1451: 0549 75 F0 0A CASB5: MOV B,#10
1452: 054C 30 33 03 JNB ADD_IN,CASB6
1453: 054F 75 F0 10 MOV B,#16 ;HEX MODE
1454: ;
1455: 0552 B1 5D CASB6: ACALL MULNUM ;ACCUMULATE THE DIGITS
1456: 0554 50 DE JNC CASB2 ;LOOP IF NO CARRY
1457: ;
1458: 0556 E4 RCASB: CLR A ;RESET ACC
1459: 0557 92 E1 MOV ACC.OVERFLOW,C ;IF OVERFLOW, SAY SO
1460: 0559 22 RET ;EXIT
1461: ;
1462: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 39
Line I Addr Code Source
1463: ;
1464: 055A 75 F0 0A MULNUM10:MOV B,#10
1465: ;
1466: ;***************************************************************
1467: ;
1468: 055D MULNUM: ; Take the next digit in the acc (masked to 0FH)
1469: ; accumulate in R3:R1
1470: ;
1471: ;***************************************************************
1472: ;
1473: 055D C0 E0 PUSH ACC ;SAVE ACC
1474: 055F C0 F0 PUSH B ;SAVE MULTIPLIER
1475: 0561 E9 MOV A,R1 ;PUT LOW ORDER BITS IN ACC
1476: 0562 A4 MUL AB ;DO THE MULTIPLY
1477: 0563 F9 MOV R1,A ;PUT THE RESULT BACK
1478: 0564 EB MOV A,R3 ;GET THE HIGH ORDER BYTE
1479: 0565 AB F0 MOV R3,B ;SAVE THE OVERFLOW
1480: 0567 D0 F0 POP B ;GET THE MULTIPLIER
1481: 0569 A4 MUL AB ;DO IT
1482: 056A A2 D2 MOV C,OV ;SAVE OVERFLOW IN F0
1483: 056C 92 D5 MOV F0,C
1484: 056E 2B ADD A,R3 ;ADD OVERFLOW TO HIGH RESULT
1485: 056F FB MOV R3,A ;PUT IT BACK
1486: 0570 D0 E0 POP ACC ;GET THE ORIGINAL ACC BACK
1487: 0572 72 D5 ORL C,F0 ;OR CARRY AND OVERFLOW
1488: 0574 40 07 JC MULX ;NO GOOD IF THE CARRY IS SET
1489: ;
1490: 0576 54 0F MUL11: ANL A,#0FH ;MASK OFF HIGH ORDER BITS
1491: 0578 29 ADD A,R1 ;NOW ADD THE ACC
1492: 0579 F9 MOV R1,A ;PUT IT BACK
1493: 057A E4 CLR A ;PROPAGATE THE CARRY
1494: 057B 3B ADDC A,R3
1495: 057C FB MOV R3,A ;PUT IT BACK
1496: ;
1497: 057D 22 MULX: RET ;EXIT WITH OR WITHOUT CARRY
1498: ;
1499: ;***************************************************************
1500: ;
1501: 057E CONVERT_BINARY_TO_ASCII_STRING:
1502: ;
1503: ;R3:R1 contains the address of the string
1504: ;R2:R0 contains the value to convert
1505: ;DPTR, R7, R6, and ACC gets clobbered
1506: ;
1507: ;***************************************************************
1508: ;
1509: 057E E4 CLR A ;NO LEADING ZEROS
1510: 057F 90 27 10 MOV DPTR,#10000 ;SUBTRACT 10000
1511: 0582 B1 9B ACALL RSUB ;DO THE SUBTRACTION
1512: 0584 90 03 E8 MOV DPTR,#1000 ;NOW 1000
1513: 0587 B1 9B ACALL RSUB
1514: 0589 90 00 64 MOV DPTR,#100 ;NOW 100
1515: 058
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -