📄 calc.lst
字号:
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 8
Line I Addr Code Source
290: 1 0198 C8 XCH A,R0 ;FORCE R0 TO POINT AT THE LARGEST
291: 1 0199 C9 XCH A,R1 ;EXPONENT
292: 1 019A C8 XCH A,R0
293: 1 ;
294: 1 019B FF LOAD2: MOV R7,A ;SAVE THE EXPONENT DELTA IN R7
295: 1 019C C2 33 CLR ADD_IN
296: 1 019E BD 00 02 CJNE R5,#0,$+5
297: 1 01A1 D2 33 SETB ADD_IN
298: 1 ;
299: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 9
Line I Addr Code Source
300: 1 ; Load the R1 mantissa
301: 1 ;
302: 1 01A3 91 43 ACALL LOADR1_MANTISSA ;LOAD THE SMALLEST NUMBER
303: 1 ;
304: 1 ; Now align the number to the delta exponent
305: 1 ; R4 points to the string of the last digits lost
306: 1 ;
307: 1 01A5 BF 0B 00 CJNE R7,#DIGIT+DIGIT+3,$+3
308: 1 01A8 40 02 JC $+4
309: 1 01AA 7F 0A MOV R7,#DIGIT+DIGIT+2
310: 1 ;
311: 1 01AC 75 2A 00 MOV FP_CARRY,#00 ;CLEAR THE CARRY
312: 1 01AF 71 83 ACALL RIGHT ;SHIFT THE NUMBER
313: 1 ;
314: 1 ; Set up for addition and subtraction
315: 1 ;
316: 1 01B1 7F 04 MOV R7,#DIGIT ;LOOP COUNT
317: 1 01B3 79 2E MOV R1,#FP_DIG78
318: 1 01B5 74 9E MOV A,#9EH
319: 1 01B7 C3 CLR C
320: 1 01B8 9C SUBB A,R4
321: 1 01B9 D4 DA A
322: 1 01BA CC XCH A,R4
323: 1 01BB 70 01 JNZ $+3
324: 1 01BD FC MOV R4,A
325: 1 01BE B4 50 00 CJNE A,#50H,$+3 ;TEST FOR SUBTRACTION
326: 1 01C1 30 33 18 JNB ADD_IN,SUBLP ;DO SUBTRACTION IF NO ADD_IN
327: 1 01C4 B3 CPL C ;FLIP CARRY FOR ADDITION
328: 1 01C5 31 D3 ACALL ADDLP ;DO ADDITION
329: 1 ;
330: 1 01C7 50 08 JNC ADD_R
331: 1 01C9 05 2A INC FP_CARRY
332: 1 01CB 7F 01 MOV R7,#1
333: 1 01CD 71 83 ACALL RIGHT
334: 1 01CF 71 3A ACALL INC_FP_EXP ;SHIFT AND BUMP EXPONENT
335: 1 ;
336: 1 01D1 61 2B ADD_R: AJMP STORE_ALIGN_TEST_AND_EXIT
337: 1 ;
338: 1 01D3 E2 ADDLP: MOVX A,@R0
339: 1 01D4 37 ADDC A,@R1
340: 1 01D5 D4 DA A
341: 1 01D6 F7 MOV @R1,A
342: 1 01D7 18 DEC R0
343: 1 01D8 19 DEC R1
344: 1 01D9 DF F8 DJNZ R7,ADDLP ;LOOP UNTIL DONE
345: 1 01DB 22 RET
346: 1 ;
347: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 10
Line I Addr Code Source
348: 1 ;
349: 1 01DC E2 SUBLP: MOVX A,@R0 ;NOW DO SUBTRACTION
350: 1 01DD FE MOV R6,A
351: 1 01DE E4 CLR A
352: 1 01DF 34 99 ADDC A,#99H
353: 1 01E1 97 SUBB A,@R1
354: 1 01E2 2E ADD A,R6
355: 1 01E3 D4 DA A
356: 1 01E4 F7 MOV @R1,A
357: 1 01E5 18 DEC R0
358: 1 01E6 19 DEC R1
359: 1 01E7 DF F3 DJNZ R7,SUBLP
360: 1 01E9 40 11 JC FSUB6
361: 1 ;
362: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 11
Line I Addr Code Source
363: 1 ;
364: 1 ; Need to complement the result and sign because the floating
365: 1 ; point accumulator mantissa was larger than the external
366: 1 ; memory and their signs were equal.
367: 1 ;
368: 1 01EB B2 78 CPL FP_SIGN.0
369: 1 01ED 79 2E MOV R1,#FP_DIG78
370: 1 01EF 7F 04 MOV R7,#DIGIT ;LOOP COUNT
371: 1 ;
372: 1 01F1 74 9A FSUB5: MOV A,#9AH
373: 1 01F3 97 SUBB A,@R1
374: 1 01F4 24 00 ADD A,#0
375: 1 01F6 D4 DA A
376: 1 01F7 F7 MOV @R1,A
377: 1 01F8 19 DEC R1
378: 1 01F9 B3 CPL C
379: 1 01FA DF F5 DJNZ R7,FSUB5 ;LOOP
380: 1 ;
381: 1 ; Now see how many zeros their are
382: 1 ;
383: 1 01FC 78 2B FSUB6: MOV R0,#FP_DIG12
384: 1 01FE 7F 00 MOV R7,#0
385: 1 ;
386: 1 0200 E6 FSUB7: MOV A,@R0
387: 1 0201 70 08 JNZ FSUB8
388: 1 0203 0F INC R7
389: 1 0204 0F INC R7
390: 1 0205 08 INC R0
391: 1 0206 B8 2F F7 CJNE R0,#FP_SIGN,FSUB7
392: 1 0209 61 73 AJMP ZERO_AND_EXIT
393: 1 ;
394: 1 020B B4 10 00 FSUB8: CJNE A,#10H,$+3
395: 1 020E 50 01 JNC FSUB9
396: 1 0210 0F INC R7
397: 1 ;
398: 1 ; Now R7 has the number of leading zeros in the FP ACC
399: 1 ;
400: 1 0211 E5 30 FSUB9: MOV A,FP_EXP ;GET THE OLD EXPONENT
401: 1 0213 C3 CLR C
402: 1 0214 9F SUBB A,R7 ;SUBTRACT FROM THE NUMBER OF ZEROS
403: 1 0215 60 0B JZ FSUB10
404: 1 0217 40 09 JC FSUB10
405: 1 ;
406: 1 0219 F5 30 MOV FP_EXP,A ;SAVE THE NEW EXPONENT
407: 1 ;
408: 1 021B 71 BD ACALL LEFT1 ;SHIFT THE FP ACC
409: 1 021D 75 2A 00 MOV FP_CARRY,#0
410: 1 0220 61 2B AJMP STORE_ALIGN_TEST_AND_EXIT
411: 1 ;
412: 1 0222 61 6D FSUB10: AJMP UNDERFLOW_AND_EXIT
413: 1 ;
414: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 12
Line I Addr Code Source
415: 1 ;***************************************************************
416: 1 ;
417: 1 0224 FLOATING_COMP: ; Compare two floating point numbers
418: 1 ; used for relational operations and is faster
419: 1 ; than subtraction. ON RETURN, The carry is set
420: 1 ; if ARG1 is > ARG2, else carry is not set
421: 1 ; if ARG1 = ARG2, F0 gets set
422: 1 ;
423: 1 ;***************************************************************
424: 1 ;
425: 1 0224 91 32 ACALL MDES1 ;SET UP THE REGISTERS
426: 1 0226 E5 24 MOV A,ARG_STACK
427: 1 0228 24 0C ADD A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
428: 1 022A F5 24 MOV ARG_STACK,A ;POP THE STACK TWICE, CLEAR THE CARRY
429: 1 022C EE MOV A,R6 ;CHECK OUT EXPONENTS
430: 1 022D C2 D5 CLR F0
431: 1 022F C3 CLR C
432: 1 0230 9F SUBB A,R7
433: 1 0231 60 0A JZ EXPONENTS_EQUAL
434: 1 0233 40 03 JC ARG1_EXP_IS_LARGER
435: 1 ;
436: 1 ; Now the ARG2 EXPONENT is > ARG1 EXPONENT
437: 1 ;
438: 1 0235 SIGNS_DIFFERENT:
439: 1 ;
440: 1 0235 EB MOV A,R3 ;SEE IF SIGN OF ARG2 IS POSITIVE
441: 1 0236 80 01 SJMP $+3
442: 1 ;
443: 1 0238 ARG1_EXP_IS_LARGER:
444: 1 ;
445: 1 0238 EC MOV A,R4 ;GET THE SIGN OF ARG1 EXPONENT
446: 1 0239 60 01 JZ $+3
447: 1 023B B3 CPL C
448: 1 023C 22 RET
449: 1 ;
450: 1 023D EXPONENTS_EQUAL:
451: 1 ;
452: 1 ; First, test the sign, then the mantissa
453: 1 ;
454: 1 023D BD 00 F5 CJNE R5,#0,SIGNS_DIFFERENT
455: 1 ;
456: 1 0240 BOTH_PLUS:
457: 1 ;
458: 1 0240 7F 04 MOV R7,#DIGIT ;POINT AT MS DIGIT
459: 1 0242 18 DEC R0
460: 1 0243 18 DEC R0
461: 1 0244 18 DEC R0
462: 1 0245 19 DEC R1
463: 1 0246 19 DEC R1
464: 1 0247 19 DEC R1
465: 1 ;
466: 1 ; Now do the compare
467: 1 ;
468: 1 0248 E2 CLOOP: MOVX A,@R0
469: 1 0249 FE MOV R6,A
470: 1 024A E3 MOVX A,@R1
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 13
Line I Addr Code Source
471: 1 024B 9E SUBB A,R6
472: 1 024C 70 EA JNZ ARG1_EXP_IS_LARGER
473: 1 024E 08 INC R0
474: 1 024F 09 INC R1
475: 1 0250 DF F6 DJNZ R7,CLOOP
476: 1 ;
477: 1 ; If here, the numbers are the same, the carry is cleared
478: 1 ;
479: 1 0252 D2 D5 SETB F0
480: 1 0254 22 RET ;EXIT WITH EQUAL
481: 1 ;
482: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 14
Line I Addr Code Source
483: 1 ;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
484: 1 ;
485: 1 0255 FLOATING_MUL: ; Floating point multiply
486: 1 ;
487: 1 ;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
488: 1 ;
489: 1 0255 91 30 ACALL MUL_DIV_EXP_AND_SIGN
490: 1 ;
491: 1 ; check for zero exponents
492: 1 ;
493: 1 0257 BE 00 02 CJNE R6,#00,$+5 ;ARG 2 EXP ZERO?
494: 1 025A 61 73 AJMP ZERO_AND_EXIT
495: 1 ;
496: 1 ; calculate the exponent
497: 1 ;
498: 1 025C 8D 2F FMUL1: MOV FP_SIGN,R5 ;SAVE THE SIGN, IN CASE OF FAILURE
499: 1 ;
500: 1 025E EF MOV A,R7
501: 1 025F 60 F9 JZ FMUL1-2
502: 1 0261 2E ADD A,R6 ;ADD THE EXPONENTS
503: 1 0262 20 E7 05 JB ACC.7,FMUL_OVER
504: 1 0265 10 D7 06 JBC CY,FMUL2 ;SEE IF CARRY IS SET
505: 1 ;
506: 1 0268 61 6D AJMP UNDERFLOW_AND_EXIT
507: 1 ;
508: 1 026A FMUL_OVER:
509: 1 ;
510: 1 026A 50 02 JNC FMUL2 ;OK IF SET
511: 1 ;
512: 1 026C 61 5C FOV: AJMP OVERFLOW_AND_EXIT
513: 1 ;
514: 1 026E 94 81 FMUL2: SUBB A,#129 ;SUBTRACT THE EXPONENT BIAS
515: 1 0270 FE MOV R6,A ;SAVE IT FOR LATER
516: 1 ;
517: 1 ; Unpack and load R0
518: 1 ;
519: 1 0271 71 46 ACALL UNPACK_R0
520: 1 ;
521: 1 ; Now set up for loop multiply
522: 1 ;
523: 1 0273 7B 04 MOV R3,#DIGIT
524: 1 0275 AC 01 MOV R4,R1B0
525: 1 ;
526: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 15
Line I Addr Code Source
527: 1 ;
528: 1 ; Now, do the multiply and accumulate the product
529: 1 ;
530: 1 0277 8C 01 FMUL3: MOV R1B0,R4
531: 1 0279 E3 MOVX A,@R1
532: 1 027A FA MOV R2,A
533: 1 027B 71 F3 ACALL MUL_NIBBLE
534: 1 ;
535: 1 027D EA MOV A,R2
536: 1 027E C4 SWAP A
537: 1 027F 71 F3 ACALL MUL_NIBBLE
538: 1 0281 1C DEC R4
539: 1 0282 DB F3 DJNZ R3,FMUL3
540: 1 ;
541: 1 ; Now, pack and restore the sign
542: 1 ;
543: 1 0284 8E 30 MOV FP_EXP,R6
544: 1 0286 8D 2F MOV FP_SIGN,R5
545: 1 0288 41 EB AJMP PACK ;FINISH IT OFF
546: 1 ;
547: 1 $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 16
Line I Addr Code Source
548: 1 ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
549: 1 ;
550: 1 028A FLOATING_DIV:
551: 1 ;
552: 1 ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
553: 1 ;
554: 1 028A 91 32 ACALL MDES1
555: 1 ;
556: 1 ; Check the exponents
557: 1 ;
558: 1 028C 8D 2F MOV FP_SIGN,R5 ;SAVE THE SIGN
559: 1 028E BF 00 06 CJNE R7,#0,DIV0 ;CLEARS THE CARRY
560: 1 0291 71 5C ACALL OVERFLOW_AND_EXIT
561: 1 0293 E4 CLR A
562: 1 0294 D2 E3 SETB ACC.ZERO_DIVIDE
563: 1 0296 22 RET
564: 1 ;
565: 1 0297 EE DIV0: MOV A,R6 ;GET EXPONENT
566: 1 0298 60 C0 JZ FMUL1-2 ;EXIT IF ZERO
567: 1 029A 9F SUBB A,R7 ;DELTA EXPONENT
568: 1 029B 20 E7 04 JB ACC.7,D_UNDER
569: 1 029E 50 04 JNC DIV3
570: 1 02A0 61 6D AJMP UNDERFLOW_AND_EXIT
571: 1 ;
572: 1 02A2 50 C8 D_UNDER:JNC FOV
573: 1 ;
574: 1 02A4 24 81 DIV3: ADD A,#129 ;CORRECTLY BIAS THE EXPONENT
575: 1 02A6 F5 30 MOV FP_EXP,A ;SAVE THE EXPONENT
576: 1 02A8 91 43 ACALL LOADR1_MANTISSA ;LOAD THE DIVIDED
577: 1 ;
578: 1 02AA 7A 34 MOV R2,#FP_ACCC ;SAVE LOCATION
579: 1 02AC AB 00 MOV R3,R0B0 ;SAVE POINTER IN R3
580: 1 02AE 75 2A 00 MOV FP_CARRY,#0 ;ZERO CARRY BYTE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -