📄 calc.lst
字号:
1184: 1 0514 20 52 F3 FRTEST: JB FIRST_RADIX,DECX
1185: 1 ;
1186: 1 0517 20 51 01 FDTEST: JB FOUND_RADIX,FDT1
1187: 1 051A 0E INC R6
1188: 1 ;
1189: 1 051B 20 53 F0 FDT1: JB DONE_LOAD,RET_X
1190: 1 051E B8 3D 02 CJNE R0,#FP_ACC8+1,FDT2
1191: 1 0521 D2 53 SETB DONE_LOAD
1192: 1 ;
1193: 1 0523 F6 FDT2: MOV @R0,A ;SAVE THE STRIPPED ACCUMULATOR
1194: 1 0524 08 INC R0 ;BUMP THE POINTER
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 32
Line I Addr Code Source
1195: 1 0525 22 RET ;EXIT
1196: 1 ;
1197: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 33
Line I Addr Code Source
1198: 1 ;***************************************************************
1199: 1 ;
1200: 1 ; I/O utilities
1201: 1 ;
1202: 1 ;***************************************************************
1203: 1 ;
1204: 1 0526 INC_AND_GET_DPTR_CHARACTER:
1205: 1 ;
1206: 1 0526 A3 INC DPTR
1207: 1 ;
1208: 1 0527 GET_DPTR_CHARACTER:
1209: 1 ;
1210: 1 0527 E0 MOVX A,@DPTR ;GET THE CHARACTER
1211: 1 0528 B4 20 16 CJNE A,#' ',PMT1 ;SEE IF A SPACE
1212: 1 ;
1213: 1 ; Kill spaces
1214: 1 ;
1215: 1 052B 80 F9 SJMP INC_AND_GET_DPTR_CHARACTER
1216: 1 ;
1217: 1 052D PLUS_MINUS_TEST:
1218: 1 ;
1219: 1 052D B4 E3 02 CJNE A,#0E3H,$+5 ;SEE IF A PLUS, PLUS TOKEN FROM BASIC
1220: 1 0530 80 0E SJMP PMT3
1221: 1 0532 B4 2B 02 CJNE A,#'+',$+5
1222: 1 0535 80 09 SJMP PMT3
1223: 1 0537 B4 E5 02 CJNE A,#0E5H,$+5 ;SEE IF MINUS, MINUS TOKEN FROM BASIC
1224: 1 053A 80 03 SJMP PMT2
1225: 1 053C B4 2D 02 CJNE A,#'-',PMT1
1226: 1 ;
1227: 1 053F D3 PMT2: SETB C
1228: 1 ;
1229: 1 0540 A3 PMT3: INC DPTR
1230: 1 ;
1231: 1 0541 22 PMT1: RET
1232: 1 ;
1233: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 34
Line I Addr Code Source
1234: 1 ;***************************************************************
1235: 1 ;
1236: 1 0542 FLOATING_POINT_OUTPUT: ; Output the number, format is in location 25
1237: 1 ;
1238: 1 ; IF FORMAT = 00 - FREE FLOATING
1239: 1 ; = FX - EXPONENTIAL (X IS THE NUMBER OF SIG DIGITS)
1240: 1 ; = NX - N = NUM BEFORE RADIX, X = NUM AFTER RADIX
1241: 1 ; N + X = 8 MAX
1242: 1 ;
1243: 1 ;***************************************************************
1244: 1 ;
1245: 1 0542 91 32 ACALL MDES1 ;GET THE NUMBER TO OUTPUT, R0 IS POINTER
1246: 1 0544 31 83 ACALL POP_AND_EXIT ;OUTPUT POPS THE STACK
1247: 1 0546 EF MOV A,R7
1248: 1 0547 FE MOV R6,A ;PUT THE EXPONENT IN R6
1249: 1 0548 71 46 ACALL UNPACK_R0 ;UNPACK THE NUMBER
1250: 1 054A 78 2B MOV R0,#FP_NIB1 ;POINT AT THE NUMBER
1251: 1 054C E5 25 MOV A,FORMAT ;GET THE FORMAT
1252: 1 054E FB MOV R3,A ;SAVE IN CASE OF EXP FORMAT
1253: 1 054F 60 49 JZ FREE ;FREE FLOATING?
1254: 1 0551 B4 F0 00 CJNE A,#0F0H,$+3 ;SEE IF EXPONENTIAL
1255: 1 0554 50 73 JNC EXPOUT
1256: 1 ;
1257: 1 ; If here, must be integer USING format
1258: 1 ;
1259: 1 0556 EE MOV A,R6 ;GET THE EXPONENT
1260: 1 0557 70 02 JNZ $+4
1261: 1 0559 7E 80 MOV R6,#80H
1262: 1 055B EB MOV A,R3 ;GET THE FORMAT
1263: 1 055C C4 SWAP A ;SPLIT INTEGER AND FRACTION
1264: 1 055D 54 0F ANL A,#0FH
1265: 1 055F FA MOV R2,A ;SAVE INTEGER
1266: 1 0560 D1 2F ACALL NUM_LT ;GET THE NUMBER OF INTEGERS
1267: 1 0562 CA XCH A,R2 ;FLIP FOR SUBB
1268: 1 0563 C3 CLR C
1269: 1 0564 9A SUBB A,R2
1270: 1 0565 FF MOV R7,A
1271: 1 0566 50 06 JNC $+8
1272: 1 0568 7D 3F MOV R5,#'?' ;OUTPUT A QUESTION MARK
1273: 1 056A D1 64 ACALL SOUT1 ;NUMBER IS TOO LARGE FOR FORMAT
1274: 1 056C A1 9A AJMP FREE
1275: 1 056E BA 00 07 CJNE R2,#00,USING0 ;SEE IF ZERO
1276: 1 0571 1F DEC R7
1277: 1 0572 D1 51 ACALL SS7
1278: 1 0574 D1 5E ACALL ZOUT ;OUTPUT A ZERO
1279: 1 0576 80 06 SJMP USING1
1280: 1 ;
1281: 1 0578 D1 51 USING0: ACALL SS7 ;OUTPUT SPACES, IF NEED TO
1282: 1 057A EA MOV A,R2 ;OUTPUT DIGITS
1283: 1 057B FF MOV R7,A
1284: 1 057C D1 13 ACALL OUTR0
1285: 1 ;
1286: 1 057E EB USING1: MOV A,R3
1287: 1 057F 54 0F ANL A,#0FH ;GET THE NUMBER RIGHT OF DP
1288: 1 0581 FA MOV R2,A ;SAVE IT
1289: 1 0582 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
1290: 1 0584 D1 5A ACALL ROUT ;OUTPUT DP
1291: 1 0586 D1 38 ACALL NUM_RT
1292: 1 0588 B5 02 03 CJNE A,2,USINGX ;COMPARE A TO R2
1293: 1 ;
1294: 1 058B EA USINGY: MOV A,R2
1295: 1 058C C1 48 AJMP Z7R7
1296: 1 ;
1297: 1 058E 50 FB USINGX: JNC USINGY
1298: 1 ;
1299: 1 0590 CA USING2: XCH A,R2
1300: 1 0591 C3 CLR C
1301: 1 0592 9A SUBB A,R2
1302: 1 0593 CA XCH A,R2
1303: 1 0594 D1 48 ACALL Z7R7 ;OUTPUT ZEROS IF NEED TO
1304: 1 0596 EA MOV A,R2
1305: 1 0597 FF MOV R7,A
1306: 1 0598 C1 13 AJMP OUTR0
1307: 1 ;
1308: 1 ; First, force exponential output, if need to
1309: 1 ;
1310: 1 059A EE FREE: MOV A,R6 ;GET THE EXPONENT
1311: 1 059B 70 04 JNZ FREE1 ;IF ZERO, PRINT IT
1312: 1 059D D1 62 ACALL SOUT
1313: 1 059F C1 5E AJMP ZOUT
1314: 1 ;
1315: 1 05A1 7B F0 FREE1: MOV R3,#0F0H ;IN CASE EXP NEEDED
1316: 1 05A3 74 77 MOV A,#80H-DIGIT-DIGIT-1
1317: 1 05A5 2E ADD A,R6
1318: 1 05A6 40 21 JC EXPOUT
1319: 1 05A8 94 F7 SUBB A,#0F7H
1320: 1 05AA 40 1D JC EXPOUT
1321: 1 ;
1322: 1 ; Now, just print the number
1323: 1 ;
1324: 1 05AC D1 53 ACALL SINOUT ;PRINT THE SIGN OF THE NUMBER
1325: 1 05AE D1 2F ACALL NUM_LT ;GET THE NUMBER LEFT OF DP
1326: 1 05B0 B4 08 02 CJNE A,#8,FREE4
1327: 1 05B3 C1 13 AJMP OUTR0
1328: 1 ;
1329: 1 05B5 D1 13 FREE4: ACALL OUTR0
1330: 1 05B7 D1 25 ACALL ZTEST ;TEST FOR TRAILING ZEROS
1331: 1 05B9 60 57 JZ U_RET ;DONE IF ALL TRAILING ZEROS
1332: 1 05BB D1 5A ACALL ROUT ;OUTPUT RADIX
1333: 1 ;
1334: 1 05BD 7F 01 FREE2: MOV R7,#1 ;OUTPUT ONE DIGIT
1335: 1 05BF D1 13 ACALL OUTR0
1336: 1 05C1 70 4F JNZ U_RET
1337: 1 05C3 D1 25 ACALL ZTEST
1338: 1 05C5 60 4B JZ U_RET
1339: 1 05C7 80 F4 SJMP FREE2 ;LOOP
1340: 1 ;
1341: 1 05C9 D1 53 EXPOUT: ACALL SINOUT ;PRINT THE SIGN
1342: 1 05CB 7F 01 MOV R7,#1 ;OUTPUT ONE CHARACTER
1343: 1 05CD D1 13 ACALL OUTR0
1344: 1 05CF D1 5A ACALL ROUT ;OUTPUT RADIX
1345: 1 05D1 EB MOV A,R3 ;GET FORMAT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 36
Line I Addr Code Source
1346: 1 05D2 54 0F ANL A,#0FH ;STRIP INDICATOR
1347: 1 05D4 60 06 JZ EXPOTX
1348: 1 ;
1349: 1 05D6 FF MOV R7,A ;OUTPUT THE NUMBER OF DIGITS
1350: 1 05D7 1F DEC R7 ;ADJUST BECAUSE ONE CHAR ALREADY OUT
1351: 1 05D8 D1 13 ACALL OUTR0
1352: 1 05DA 80 02 SJMP EXPOT4
1353: 1 ;
1354: 1 05DC B1 BD EXPOTX: ACALL FREE2 ;OUTPUT UNTIL TRAILING ZEROS
1355: 1 ;
1356: 1 05DE D1 62 EXPOT4: ACALL SOUT ;OUTPUT A SPACE
1357: 1 05E0 7D 45 MOV R5,#'E'
1358: 1 05E2 D1 64 ACALL SOUT1 ;OUTPUT AN E
1359: 1 05E4 EE MOV A,R6 ;GET THE EXPONENT
1360: 1 05E5 60 04 JZ XOUT0 ;EXIT IF ZERO
1361: 1 05E7 14 DEC A ;ADJUST FOR THE DIGIT ALREADY OUTPUT
1362: 1 05E8 B4 80 05 CJNE A,#80H,XOUT2 ;SEE WHAT IT IS
1363: 1 ;
1364: 1 05EB D1 62 XOUT0: ACALL SOUT
1365: 1 05ED E4 CLR A
1366: 1 05EE 80 0C SJMP XOUT4
1367: 1 ;
1368: 1 05F0 40 06 XOUT2: JC XOUT3 ;NEGATIVE EXPONENT
1369: 1 05F2 7D 2B MOV R5,#'+' ;OUTPUT A PLUS SIGN
1370: 1 05F4 D1 64 ACALL SOUT1
1371: 1 05F6 80 04 SJMP XOUT4
1372: 1 ;
1373: 1 05F8 D1 56 XOUT3: ACALL MOUT
1374: 1 05FA F4 CPL A ;FLIP BITS
1375: 1 05FB 04 INC A ;BUMP
1376: 1 ;
1377: 1 05FC C2 E7 XOUT4: CLR ACC.7
1378: 1 05FE F8 MOV R0,A
1379: 1 05FF 7A 00 MOV R2,#0
1380: 1 0601 79 48 MOV R1,#LOW CONVT ;CONVERSION LOCATION
1381: 1 0603 7B 00 MOV R3,#HIGH CONVT
1382: 1 0605 D1 BF ACALL CONVERT_BINARY_TO_ASCII_STRING
1383: 1 0607 78 48 MOV R0,#LOW CONVT ;NOW, OUTPUT EXPONENT
1384: 1 ;
1385: 1 0609 E2 EXPOT5: MOVX A,@R0 ;GET THE CHARACTER
1386: 1 060A FD MOV R5,A ;OUTPUT IT
1387: 1 060B D1 64 ACALL SOUT1
1388: 1 060D 08 INC R0 ;BUMP THE POINTER
1389: 1 060E E8 MOV A,R0 ;GET THE POINTER
1390: 1 060F B5 01 F7 CJNE A,R1B0,EXPOT5 ;LOOP
1391: 1 ;
1392: 1 0612 22 U_RET: RET ;EXIT
1393: 1 ;
1394: 1 0613 OUTR0: ; Output the characters pointed to by R0, also bias ascii
1395: 1 ;
1396: 1 0613 EF MOV A,R7 ;GET THE COUNTER
1397: 1 0614 60 0E JZ OUTR ;EXIT IF DONE
1398: 1 0616 E6 MOV A,@R0 ;GET THE NUMBER
1399: 1 0617 44 30 ORL A,#30H ;ASCII BIAS
1400: 1 0619 08 INC R0 ;BUMP POINTER AND COUNTER
1401: 1 061A 1F DEC R7
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 37
Line I Addr Code Source
1402: 1 061B FD MOV R5,A ;PUT CHARACTER IN OUTPUT REGISTER
1403: 1 061C D1 64 ACALL SOUT1 ;OUTPUT THE CHARACTER
1404: 1 061E E4 CLR A ;JUST FOR TEST
1405: 1 061F B8 33 F1 CJNE R0,#FP_NIB8+1,OUTR0
1406: 1 0622 74 55 MOV A,#55H ;KNOW WHERE EXIT OCCURED
1407: 1 ;
1408: 1 0624 22 OUTR: RET
1409: 1 ;
1410: 1 0625 A9 00 ZTEST: MOV R1,R0B0 ;GET POINTER REGISTER
1411: 1 ;
1412: 1 0627 E7 ZT0: MOV A,@R1 ;GET THE VALUE
1413: 1 0628 70 04 JNZ ZT1
1414: 1 062A 09 INC R1 ;BUMP POINTER
1415: 1 062B B9 33 F9 CJNE R1,#FP_NIB8+1,ZT0
1416: 1 ;
1417: 1 062E 22 ZT1: RET
1418: 1 ;
1419: 1 062F EE NUM_LT: MOV A,R6 ;GET EXPONENT
1420: 1 0630 C3 CLR C ;GET READY FOR SUBB
1421: 1 0631 94 80 SUBB A,#80H ;SUB EXPONENT BIAS
1422: 1 0633 50 01 JNC NL1 ;OK IF NO CARRY
1423: 1 0635 E4 CLR A ;NO DIGITS LEFT
1424: 1 ;
1425: 1 0636 FF NL1: MOV R7,A ;SAVE THE COUNT
1426: 1 0637 22 RET
1427: 1 ;
1428: 1 0638 C3 NUM_RT: CLR C ;SUBB AGAIN
1429: 1 0639 74 80 MOV A,#80H ;EXPONENT BIAS
1430: 1 063B 9E SUBB A,R6 ;GET THE BIASED EXPONENT
1431: 1 063C 50 01 JNC NR1
1432: 1 063E E4 CLR A
1433: 1 ;
1434: 1 063F 22 NR1: RET ;EXIT
1435: 1 ;
1436: 1 0640 EF SPACE7: MOV A,R7 ;GET THE NUMBER OF SPACES
1437: 1 0641 60 FC JZ NR1 ;EXIT IF ZERO
1438: 1 0643 D1 62 ACALL SOUT ;OUTPUT A SPACE
1439: 1 0645 1F DEC R7 ;BUMP COUNTER
1440: 1 0646 80 F8 SJMP SPACE7 ;LOOP
1441: 1 ;
1442: 1 0648 FF Z7R7: MOV R7,A
1443: 1 ;
1444: 1 0649 EF ZERO7: MOV A,R7 ;GET COUNTER
1445: 1 064A 60 F3 JZ NR1 ;EXIT IF ZERO
1446: 1 064C D1 5E ACALL ZOUT ;OUTPUT A ZERO
1447: 1 064E 1F DEC R7 ;BUMP COUNTER
1448: 1 064F 80 F8 SJMP ZERO7 ;LOOP
1449: 1 ;
1450: 1 0651 D1 40 SS7: ACALL SPACE7
1451: 1 ;
1452: 1 0653 EC SINOUT: MOV A,R4 ;GET THE SIGN
1453: 1 0654 60 0C JZ SOUT ;OUTPUT A SPACE IF ZERO
1454: 1 ;
1455: 1 0656 7D 2D MOUT: MOV R5,#'-'
1456: 1 0658 80 0A SJMP SOUT1 ;OUTPUT A MINUS IF NOT
1457: 1 ;
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 38
Line I Addr Code Source
1458: 1 065A 7D 2E ROUT: MOV R5,#'.' ;OUTPUT A RADIX
1459: 1 065C 80 06 SJMP SOUT1
1460: 1 ;
1461: 1 065E 7D 30 ZOUT: MOV R5,#'0' ;OUTPUT A ZERO
1462: 1 0660 80 02 SJMP SOUT1
1463: 1 ;
1464: 1 0662 7D 20 SOUT: MOV R5,#' ' ;OUTPUT A SPACE
1465: 1 ;
1466: 1 0664 E1 40 SOUT1: AJMP R5OUT
1467: 1 ;
1468: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 39
Line I Addr Code Source
1469: 1 ;***************************************************************
1470: 1 ;
1471: 1 0666 CONVERT_ASCII_STRING_TO_BINARY:
1472: 1 ;
1473: 1 ;DPTR POINTS TO ASCII STRING
1474: 1 ;PUT THE BINARY NUMBER IN R2:R0, ERROR IF >64K
1475: 1 ;
1476: 1 ;***************************************************************
1477: 1 ;
1478: 1 0666 91 51 CASB: ACALL HEXSCAN ;SEE IF HEX NUMBER
1479: 1 0668 92 33 MOV ADD_IN,C ;IF ADD_IN IS SET, THE NUMBER IS HEX
1480: 1 066A F1 33 ACALL GET_DIGIT_CHECK
1481: 1 066C B3 CPL C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -