home *** CD-ROM | disk | FTP | other *** search
- ;
- stdlib segment para public 'slcode'
- assume cs:stdlib
- extrn sl_malloc:far
- ;
- ; Local variables for these routines:
- ;
- astr db 12 dup (?)
- aindex dw 0
- ;
- ;
- ; LTOA- converts the value in DX:AX to a string. Returns a pointer to this
- ; string in ES:SI. Carry=0 on return if no error, 1 if heap overflow.
- ;
- public sl_ltoa
- sl_ltoa proc far
- push ax
- push bx
- push cx
- push dx
- mov cs:aindex, 0
- cmp dx, 0
- jge Doit
- push ax
- mov al, '-'
- call Putit
- pop ax
- neg dx
- neg ax
- sbb dx, 0
- ;
- DoIt: call puti2
- ;
- ; Move the digit string out onto the heap and return a pointer to it in
- ; es:si.
- ;
- mov cx, cs:aindex
- mov bx, cx ;Save for later.
- inc cx
- call sl_malloc ;Allocate storage for string.
- jc BadLTOA
- CopyStrLp: mov al, cs:astr[bx]
- mov es:[di][bx], al
- dec bx
- jns CopyStrLp
- clc
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- ;
- BadLTOA: clc
- pop dx cx bx ax
- ret
- sl_ltoa endp
- ;
- ;
- ;
- ; ULTOA converts the unsigned dword value in DX:AX to a string and returns
- ; a pointer to this string in ES:SI. Carry=0 if no error, 1 if heap
- ; overflow occurs.
- ;
- public sl_ultoa
- sl_ultoa proc far
- push ax
- push bx
- push cx
- push dx
- mov cs:aindex, 0
- call PutI2
- ;
- ; Move the digit string out onto the heap and return a pointer to it in
- ; es:si.
- ;
- mov cx, cs:aindex
- mov bx, cx ;Save for later.
- inc cx
- call sl_malloc ;Allocate storage for string.
- jc BadULTOA
- CopyStrLp2: mov al, cs:astr[bx]
- mov es:[di][bx], al
- dec bx
- jns CopyStrLp2
- clc
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- ;
- BadULTOA: stc
- pop dx cx bx ax
- ret
- sl_ultoa endp
- ;
- ;
- ;
- ; PutI2- Recursive routine to actually print the value in AX as an integer.
- ;
- Puti2 proc near
- call Div10
- cmp ax, dx ;See if dx:ax=0
- jnz NotDone
- or ax, ax
- jz Done
- NotDone: push bx
- call Puti2
- pop bx
- Done: mov al, bl
- or al, '0'
- call PutIt
- ret
- PutI2 endp
- ;
- ; Div10- Divides DX:AX by 10 leaving the remainder in BL and the quotient
- ; in DX:AX.
- ;
- Div10 proc near
- mov cx, 10
- mov bx, ax
- xchg ax, dx
- xor dx, dx
- div cx
- xchg bx, ax
- div cx
- xchg dx, bx
- ret
- Div10 endp
- ;
- ;
- ; PutIt- Writes the character in AL to the "astr" buffer. Also zero
- ; terminates the string and increments aindex. Note: no need to preserve
- ; SI here because no one else uses it.
- ;
- PutIt proc near
- mov di, cs:aindex
- mov cs:astr[di], al
- mov byte ptr cs:astr+1[di], 0
- inc cs:aindex
- ret
- PutIt endp
- stdlib ends
- end
-