📄 fp-52.lst
字号:
287: 1A21 22 RET
288: ;
289: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 10
Line I Addr Code Source
290: ;
291: 1A22 E2 SUBLP: MOVX A,@R0 ;NOW DO SUBTRACTION
292: 1A23 FE MOV R6,A
293: 1A24 E4 CLR A
294: 1A25 34 99 ADDC A,#99H
295: 1A27 97 SUBB A,@R1
296: 1A28 2E ADD A,R6
297: 1A29 D4 DA A
298: 1A2A F7 MOV @R1,A
299: 1A2B 18 DEC R0
300: 1A2C 19 DEC R1
301: 1A2D DF F3 DJNZ R7,SUBLP
302: 1A2F 40 11 JC FSUB6
303: ;
304: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 11
Line I Addr Code Source
305: ;
306: ; Need to complement the result and sign because the floating
307: ; point accumulator mantissa was larger than the external
308: ; memory and their signs were equal.
309: ;
310: 1A31 B2 78 CPL FP_SIGN.0
311: 1A33 79 2E MOV R1,#FP_DIG78
312: 1A35 7F 04 MOV R7,#DIGIT ;LOOP COUNT
313: ;
314: 1A37 74 9A FSUB5: MOV A,#9AH
315: 1A39 97 SUBB A,@R1
316: 1A3A 24 00 ADD A,#0
317: 1A3C D4 DA A
318: 1A3D F7 MOV @R1,A
319: 1A3E 19 DEC R1
320: 1A3F B3 CPL C
321: 1A40 DF F5 DJNZ R7,FSUB5 ;LOOP
322: ;
323: ; Now see how many zeros their are
324: ;
325: 1A42 78 2B FSUB6: MOV R0,#FP_DIG12
326: 1A44 7F 00 MOV R7,#0
327: ;
328: 1A46 E6 FSUB7: MOV A,@R0
329: 1A47 70 08 JNZ FSUB8
330: 1A49 0F INC R7
331: 1A4A 0F INC R7
332: 1A4B 08 INC R0
333: 1A4C B8 2F F7 CJNE R0,#FP_SIGN,FSUB7
334: 1A4F 61 B8 AJMP ZERO_AND_EXIT
335: ;
336: 1A51 B4 10 00 FSUB8: CJNE A,#10H,$+3
337: 1A54 50 01 JNC FSUB9
338: 1A56 0F INC R7
339: ;
340: ; Now R7 has the number of leading zeros in the FP ACC
341: ;
342: 1A57 E5 30 FSUB9: MOV A,FP_EXP ;GET THE OLD EXPONENT
343: 1A59 C3 CLR C
344: 1A5A 9F SUBB A,R7 ;SUBTRACT FROM THE NUMBER OF ZEROS
345: 1A5B 60 0B JZ FSUB10
346: 1A5D 40 09 JC FSUB10
347: ;
348: 1A5F F5 30 MOV FP_EXP,A ;SAVE THE NEW EXPONENT
349: ;
350: 1A61 91 02 ACALL LEFT1 ;SHIFT THE FP ACC
351: 1A63 75 2A 00 MOV FP_CARRY,#0
352: 1A66 61 70 AJMP STORE_ALIGN_TEST_AND_EXIT
353: ;
354: 1A68 61 B2 FSUB10: AJMP UNDERFLOW_AND_EXIT
355: ;
356: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 12
Line I Addr Code Source
357: ;***************************************************************
358: ;
359: 1A6A FLOATING_COMP: ; Compare two floating point numbers
360: ; used for relational operations and is faster
361: ; than subtraction. ON RETURN, The carry is set
362: ; if ARG1 is > ARG2, else carry is not set
363: ; if ARG1 = ARG2, F0 gets set
364: ;
365: ;***************************************************************
366: ;
367: 1A6A 91 77 ACALL MDES1 ;SET UP THE REGISTERS
368: 1A6C E5 09 MOV A,ARG_STACK
369: 1A6E 24 0C ADD A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE
370: 1A70 F5 09 MOV ARG_STACK,A ;POP THE STACK TWICE, CLEAR THE CARRY
371: 1A72 EE MOV A,R6 ;CHECK OUT EXPONENTS
372: 1A73 C2 D5 CLR F0
373: 1A75 9F SUBB A,R7
374: 1A76 60 0A JZ EXPONENTS_EQUAL
375: 1A78 40 03 JC ARG1_EXP_IS_LARGER
376: ;
377: ; Now the ARG2 EXPONENT is > ARG1 EXPONENT
378: ;
379: 1A7A SIGNS_DIFFERENT:
380: ;
381: 1A7A EB MOV A,R3 ;SEE IF SIGN OF ARG2 IS POSITIVE
382: 1A7B 80 01 SJMP $+3
383: ;
384: 1A7D ARG1_EXP_IS_LARGER:
385: ;
386: 1A7D EC MOV A,R4 ;GET THE SIGN OF ARG1 EXPONENT
387: 1A7E 60 01 JZ $+3
388: 1A80 B3 CPL C
389: 1A81 22 RET
390: ;
391: 1A82 EXPONENTS_EQUAL:
392: ;
393: ; First, test the sign, then the mantissa
394: ;
395: 1A82 BD 00 F5 CJNE R5,#0,SIGNS_DIFFERENT
396: ;
397: 1A85 BOTH_PLUS:
398: ;
399: 1A85 7F 04 MOV R7,#DIGIT ;POINT AT MS DIGIT
400: 1A87 18 DEC R0
401: 1A88 18 DEC R0
402: 1A89 18 DEC R0
403: 1A8A 19 DEC R1
404: 1A8B 19 DEC R1
405: 1A8C 19 DEC R1
406: ;
407: ; Now do the compare
408: ;
409: 1A8D E2 CLOOP: MOVX A,@R0
410: 1A8E FE MOV R6,A
411: 1A8F E3 MOVX A,@R1
412: 1A90 9E SUBB A,R6
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 13
Line I Addr Code Source
413: 1A91 70 EA JNZ ARG1_EXP_IS_LARGER
414: 1A93 08 INC R0
415: 1A94 09 INC R1
416: 1A95 DF F6 DJNZ R7,CLOOP
417: ;
418: ; If here, the numbers are the same, the carry is cleared
419: ;
420: 1A97 D2 D5 SETB F0
421: 1A99 22 RET ;EXIT WITH EQUAL
422: ;
423: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 14
Line I Addr Code Source
424: ;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
425: ;
426: 1A9A FLOATING_MUL: ; Floating point multiply
427: ;
428: ;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
429: ;
430: 1A9A 91 75 ACALL MUL_DIV_EXP_AND_SIGN
431: ;
432: ; check for zero exponents
433: ;
434: 1A9C BE 00 02 CJNE R6,#00,$+5 ;ARG 2 EXP ZERO?
435: 1A9F 61 B8 AJMP ZERO_AND_EXIT
436: ;
437: ; calculate the exponent
438: ;
439: 1AA1 8D 2F FMUL1: MOV FP_SIGN,R5 ;SAVE THE SIGN, IN CASE OF FAILURE
440: ;
441: 1AA3 EF MOV A,R7
442: 1AA4 60 F9 JZ FMUL1-2
443: 1AA6 2E ADD A,R6 ;ADD THE EXPONENTS
444: 1AA7 20 E7 05 JB ACC.7,FMUL_OVER
445: 1AAA 10 D7 06 JBC CY,FMUL2 ;SEE IF CARRY IS SET
446: ;
447: 1AAD 61 B2 AJMP UNDERFLOW_AND_EXIT
448: ;
449: 1AAF FMUL_OVER:
450: ;
451: 1AAF 50 02 JNC FMUL2 ;OK IF SET
452: ;
453: 1AB1 61 A1 FOV: AJMP OVERFLOW_AND_EXIT
454: ;
455: 1AB3 94 81 FMUL2: SUBB A,#129 ;SUBTRACT THE EXPONENT BIAS
456: 1AB5 FE MOV R6,A ;SAVE IT FOR LATER
457: ;
458: ; Unpack and load R0
459: ;
460: 1AB6 71 8B ACALL UNPACK_R0
461: ;
462: ; Now set up for loop multiply
463: ;
464: 1AB8 7B 04 MOV R3,#DIGIT
465: 1ABA AC 01 MOV R4,R1B0
466: ;
467: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 15
Line I Addr Code Source
468: ;
469: ; Now, do the multiply and accumulate the product
470: ;
471: 1ABC 8C 01 FMUL3: MOV R1B0,R4
472: 1ABE E3 MOVX A,@R1
473: 1ABF FA MOV R2,A
474: 1AC0 91 38 ACALL MUL_NIBBLE
475: ;
476: 1AC2 EA MOV A,R2
477: 1AC3 C4 SWAP A
478: 1AC4 91 38 ACALL MUL_NIBBLE
479: 1AC6 1C DEC R4
480: 1AC7 DB F3 DJNZ R3,FMUL3
481: ;
482: ; Now, pack and restore the sign
483: ;
484: 1AC9 8E 30 MOV FP_EXP,R6
485: 1ACB 8D 2F MOV FP_SIGN,R5
486: 1ACD 61 30 AJMP PACK ;FINISH IT OFF
487: ;
488: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 16
Line I Addr Code Source
489: ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
490: ;
491: 1ACF FLOATING_DIV:
492: ;
493: ;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
494: ;
495: 1ACF 91 77 ACALL MDES1
496: ;
497: ; Check the exponents
498: ;
499: 1AD1 8D 2F MOV FP_SIGN,R5 ;SAVE THE SIGN
500: 1AD3 BF 00 06 CJNE R7,#0,DIV0 ;CLEARS THE CARRY
501: 1AD6 71 A1 ACALL OVERFLOW_AND_EXIT
502: 1AD8 E4 CLR A
503: 1AD9 D2 E3 SETB ACC.ZERO_DIVIDE
504: 1ADB 22 RET
505: ;
506: 1ADC EE DIV0: MOV A,R6 ;GET EXPONENT
507: 1ADD 60 C0 JZ FMUL1-2 ;EXIT IF ZERO
508: 1ADF 9F SUBB A,R7 ;DELTA EXPONENT
509: 1AE0 20 E7 04 JB ACC.7,D_UNDER
510: 1AE3 50 04 JNC DIV3
511: 1AE5 61 B2 AJMP UNDERFLOW_AND_EXIT
512: ;
513: 1AE7 50 C8 D_UNDER:JNC FOV
514: ;
515: 1AE9 24 81 DIV3: ADD A,#129 ;CORRECTLY BIAS THE EXPONENT
516: 1AEB F5 30 MOV FP_EXP,A ;SAVE THE EXPONENT
517: 1AED 91 88 ACALL LOADR1_MANTISSA ;LOAD THE DIVIDED
518: ;
519: 1AEF 7A 34 MOV R2,#FP_ACCC ;SAVE LOCATION
520: 1AF1 AB 00 MOV R3,R0B0 ;SAVE POINTER IN R3
521: 1AF3 75 2A 00 MOV FP_CARRY,#0 ;ZERO CARRY BYTE
522: ;
523: 1AF6 7D FF DIV4: MOV R5,#0FFH ;LOOP COUNT
524: 1AF8 D3 SETB C
525: ;
526: 1AF9 8B 00 DIV5: MOV R0B0,R3 ;RESTORE THE EXTERNAL POINTER
527: 1AFB 79 2E MOV R1,#FP_DIG78 ;SET UP INTERNAL POINTER
528: 1AFD 7F 04 MOV R7,#DIGIT ;LOOP COUNT
529: 1AFF 50 17 JNC DIV7 ;EXIT IF NO CARRY
530: ;
531: 1B01 E2 DIV6: MOVX A,@R0 ;DO ACCUMLATION
532: 1B02 FE MOV R6,A
533: 1B03 E4 CLR A
534: 1B04 34 99 ADDC A,#99H
535: 1B06 9E SUBB A,R6
536: 1B07 27 ADD A,@R1
537: 1B08 D4 DA A
538: 1B09 F7 MOV @R1,A
539: 1B0A 18 DEC R0
540: 1B0B 19 DEC R1
541: 1B0C DF F3 DJNZ R7,DIV6 ;LOOP
542: ;
543: 1B0E 0D INC R5 ;SUBTRACT COUNTER
544: 1B0F 40 E8 JC DIV5 ;KEEP LOOPING IF CARRY
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 17
Line I Addr Code Source
545: 1B11 E7 MOV A,@R1 ;GET CARRY
546: 1B12 94 01 SUBB A,#1 ;CARRY IS CLEARED
547: 1B14 F7 MOV @R1,A ;SAVE CARRY DIGIT
548: 1B15 B3 CPL C
549: 1B16 80 E1 SJMP DIV5 ;LOOP
550: ;
551: ; Restore the result if carry was found
552: ;
553: 1B18 51 19 DIV7: ACALL ADDLP ;ADD NUMBER BACK
554: 1B1A 77 00 MOV @R1,#0 ;CLEAR CARRY
555: 1B1C 8A 00 MOV R0B0,R2 ;GET SAVE COUNTER
556: 1B1E A6 05 MOV @R0,5 ;SAVE COUNT BYTE
557: ;
558: 1B20 0A INC R2 ;ADJUST SAVE COUNTER
559: 1B21 7F 01 MOV R7,#1 ;BUMP DIVIDEND
560: 1B23 91 00 ACALL LEFT
561: 1B25 BA 3E CE CJNE R2,#FP_ACC8+2,DIV4
562: ;
563: 1B28 D5 30 02 DJNZ FP_EXP,DIV8
564: 1B2B 61 B2 AJMP UNDERFLOW_AND_EXIT
565: ;
566: 1B2D 75 2A 00 DIV8: MOV FP_CARRY,#0
567: ;
568: $EJECT
ASEM-51 V1.2 Copyright (c) 1996 by W.W. Heinz PAGE 18
Line I Addr Code Source
569: ;***************************************************************
570: ;
571: 1B30 PACK: ; Pack the mantissa
572: ;
573: ;***************************************************************
574: ;
575: ; First, set up the pointers
576: ;
577: 1B30 78 34 MOV R0,#FP_ACCC
578: 1B32 E6 MOV A,@R0 ;GET FP_ACCC
579: 1B33 FE MOV R6,A ;SAVE FOR ZERO COUNT
580: 1B34 60 03 JZ PACK0 ;JUMP OVER IF ZERO
581: 1B36 71 7F ACALL INC_FP_EXP ;BUMP THE EXPONENT
582: 1B38 18 DEC R0
583: ;
584: 1B39 08 PACK0: INC R0 ;POINT AT FP_ACC1
585: ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -