home *** CD-ROM | disk | FTP | other *** search
/ RBBS in a Box Volume 1 #3.1 / RBBSIABOX31.cdr / prol / print10.asm < prev    next >
Assembly Source File  |  1982-08-30  |  2KB  |  80 lines

  1.     PAGE    ,132
  2.     TITLE    Powers of Ten
  3. IF1
  4. INCLUDE 87MAC.LIB
  5. ENDIF
  6. STACK    SEGMENT STACK
  7.     DW    64 DUP(?)
  8. STACK    ENDS
  9. CODE    SEGMENT
  10.     ASSUME    CS:CODE
  11. POWER_OF_TEN    DD    ?        ; Data area for 10**x, short real
  12. OUTPUT_POWER    DB    2 DUP(' ')      ; Buffer for power value
  13.         DB    'H    '
  14. OUTPUT_STRING    DB    8 DUP(' ')      ; Hexadecimal string output
  15.         DB    'H',13,10,'$'   ; String ending
  16. POWER        DB    0        ; Current power of ten
  17. THOUSAND    DW    1000        ; Constant
  18. CONTROL_87    DW    03BFH
  19. CALCULATE_POWER PROC    FAR
  20.     PUSH    DS            ;Set return address
  21.     MOV    AX,0
  22.     PUSH    AX
  23.     PUSH    CS
  24.     POP    DS
  25.     ASSUME    DS:CODE         ; Addressing to data area
  26.     FLDCW    CONTROL_87
  27.     FILD    THOUSAND        ; Load 10**3
  28.     FLD1                ; Load starting value
  29. POWER_LOOP:
  30.     FMUL    ST1            ; Multiply st0 * st1
  31.     FST    POWER_OF_TEN        ; Store into ram
  32.     ADD    POWER,3         ; Update power of ten
  33.     MOV    AL,POWER        ; Get power
  34.     MOV    BX,OFFSET OUTPUT_POWER
  35.     CALL    TRANSLATE
  36.     MOV    CX,4
  37.     MOV    BX,OFFSET OUTPUT_STRING
  38.     MOV    SI,OFFSET POWER_OF_TEN+3
  39.     STD                ; Backwards
  40. VALUE_OUTPUT:
  41.     LODSB                ; Get byte of power
  42.     CALL    TRANSLATE        ; Write to output string
  43.     LOOP    VALUE_OUTPUT        ; Do it for all bytes of string
  44.  
  45.     MOV    DX,OFFSET OUTPUT_POWER
  46.     MOV    AH,9
  47.     INT    21H
  48.     CMP    POWER,38
  49.     JB    POWER_LOOP
  50.     FSTP    POWER_OF_TEN
  51.     FSTP    POWER_OF_TEN
  52.     RET
  53. CALCULATE_POWER ENDP
  54.  
  55. TRANSLATE    PROC    NEAR
  56.     PUSH    AX
  57.     PUSH    CX
  58.     MOV    CL,4
  59.     SHR    AL,CL
  60.     POP    CX
  61.     CALL    XLAT_OUTPUT
  62.     POP    AX
  63.     CALL    XLAT_OUTPUT
  64.     RET
  65. TRANSLATE    ENDP
  66.  
  67. ASCII_TABLE    DB    '0123456789ABCDEF'
  68. XLAT_OUTPUT    PROC    NEAR
  69.     AND    AL,0FH
  70.     PUSH    BX
  71.     MOV    BX,OFFSET ASCII_TABLE
  72.     XLAT    ASCII_TABLE
  73.     POP    BX
  74.     MOV    [BX],AL
  75.     INC    BX
  76.     RET
  77. XLAT_OUTPUT    ENDP
  78. CODE    ENDS
  79.     END    CALCULATE_POWER
  80.