106 lines
3.0 KiB
NASM
106 lines
3.0 KiB
NASM
|
name flo2hex
|
|||
|
title Convert Floating Point Number to Hex Ascii
|
|||
|
page 62,132
|
|||
|
; =====> FLO2HEX.ASM
|
|||
|
;****************************************************************
|
|||
|
;* TIPC Scheme Runtime Support *
|
|||
|
;* *
|
|||
|
;* (C) Copyright 1987 by Texas Instruments Incorporated. *
|
|||
|
;* All rights reserved. *
|
|||
|
;* *
|
|||
|
;* Author: Terry Caudill *
|
|||
|
;* Date written: 10 March 1987 *
|
|||
|
;****************************************************************
|
|||
|
|
|||
|
DGROUP group data
|
|||
|
data segment word public 'DATA'
|
|||
|
assume DS:DGROUP
|
|||
|
hexbuf db 030h,031h,032h,033h,034h,035h,036h,037h,038h,039h
|
|||
|
db 041h,042h,043h,044h,045h,046h
|
|||
|
data ends
|
|||
|
|
|||
|
XGROUP group PROGX
|
|||
|
PROGX segment byte public 'PROGX'
|
|||
|
assume CS:XGROUP,DS:DGROUP
|
|||
|
|
|||
|
;************************************************************************
|
|||
|
;* *
|
|||
|
;* Routine Name: FLO2HEX *
|
|||
|
;* *
|
|||
|
;* Description: FLO2HEX is a %escape routine provided for PC+ and *
|
|||
|
;* is used to return the Hex Ascii value of a floating *
|
|||
|
;* point number when outputting kb's in fsl format. *
|
|||
|
;* *
|
|||
|
;* Calling Sequence: (FLO2HEX float string #words) *
|
|||
|
;* where: float = the floating point number *
|
|||
|
;* string = a return string to place result *
|
|||
|
;* #words = size of the float to be converted *
|
|||
|
;* will be 4 for floating point *
|
|||
|
;* *
|
|||
|
;* Note: Actually, this routine can be called with integers, etc. *
|
|||
|
;* *
|
|||
|
;************************************************************************
|
|||
|
|
|||
|
INARGS struc
|
|||
|
OLDBP DW ?
|
|||
|
FRETN DD ? ; Far return to 'prog' segment
|
|||
|
NRETN DW ? ; Return from flo2hex
|
|||
|
_STRING DW ?
|
|||
|
_FLOAT DW ?
|
|||
|
_WORDS DW ?
|
|||
|
INARGS ENDS
|
|||
|
|
|||
|
%flo2hex proc far
|
|||
|
push BP
|
|||
|
mov BP,SP
|
|||
|
mov si,[bp]._FLOAT ; floating point value
|
|||
|
mov di,[bp]._STRING ; string for result
|
|||
|
mov dx,[bp]._WORDS ; #words to convert
|
|||
|
mov bx,offset hexbuf
|
|||
|
mov cl,4 ; shift count
|
|||
|
cld
|
|||
|
movdigits:
|
|||
|
lodsw ; get word to convert
|
|||
|
push ax ; save word
|
|||
|
shr ax,cl ; work on high byte
|
|||
|
shr ax,cl
|
|||
|
call cvthex ; convert lower byte
|
|||
|
stosw ; store into string
|
|||
|
pop ax ; restore word
|
|||
|
xor ah,ah ; now work lower byte
|
|||
|
call cvthex ; convert it
|
|||
|
stosw ; store into string
|
|||
|
dec dx ; any more words?
|
|||
|
jne movdigits ; yes, jump
|
|||
|
|
|||
|
xor al,al ; 0 terminate the string
|
|||
|
stosb
|
|||
|
|
|||
|
mov ax,[bp]._STRING ; return string
|
|||
|
pop BP
|
|||
|
ret ; return to caller.
|
|||
|
%flo2hex endp
|
|||
|
|
|||
|
cvthex proc near
|
|||
|
shl ax,cl ; seperate digits
|
|||
|
shr al,cl ; work on lower nibble
|
|||
|
xlat ; convert to hex
|
|||
|
xchg ah,al ; work on upper nibble
|
|||
|
xlat ; convert to hex
|
|||
|
ret ; return with hex ascii value
|
|||
|
cvthex endp
|
|||
|
PROGX ends
|
|||
|
|
|||
|
|
|||
|
PGROUP group prog
|
|||
|
prog segment byte public 'PROG'
|
|||
|
assume CS:PGROUP
|
|||
|
public flo2hex
|
|||
|
|
|||
|
flo2hex proc near
|
|||
|
call %flo2hex
|
|||
|
ret
|
|||
|
flo2hex endp
|
|||
|
prog ends
|
|||
|
end
|
|||
|
|