mirror of https://github.com/nmlgc/ReC98.git
313 lines
4.6 KiB
NASM
313 lines
4.6 KiB
NASM
__turboCvt = 0
|
|
public __turboCvt
|
|
|
|
; void __near TrimTrailing(void)
|
|
TrimTrailing proc near
|
|
push bp
|
|
mov bp, sp
|
|
mov al, 5Fh
|
|
and al, dl
|
|
cmp al, 'G'
|
|
jnz short @@tt_trimPoint
|
|
|
|
@@tt_trimLoop:
|
|
cmp byte ptr ES_[bx-1], '0'
|
|
jnz short @@tt_trimPoint
|
|
dec bx
|
|
cmp bx, cx
|
|
ja short @@tt_trimLoop
|
|
jmp short @@tt_trimmed
|
|
|
|
@@tt_trimPoint:
|
|
cmp ES_[bx-1], ah
|
|
jnz short @@tt_trimmed
|
|
dec bx
|
|
|
|
@@tt_trimmed:
|
|
pop bp
|
|
ret
|
|
TrimTrailing endp
|
|
|
|
; void __pascal __near __realcvt(void *valueP, int ndec, char *strP, char formCh, char altFormat, int type)
|
|
___realcvt proc near
|
|
@@buf = byte ptr -(6 + __XCVTDIG__ + 4)
|
|
@@localeDot = byte ptr -5
|
|
@@realcnt = word ptr -4
|
|
@@sign = word ptr -2
|
|
@@type = word ptr 4
|
|
@@altFormat = byte ptr 6
|
|
@@formCh = byte ptr 8
|
|
@@strP = dword ptr 0Ah
|
|
@@ndec = word ptr 0Eh
|
|
@@valueP = dword ptr 10h
|
|
|
|
push bp
|
|
mov bp, sp
|
|
sub sp, 6 + __XCVTDIG__ + 4
|
|
push si
|
|
push di
|
|
LES_ bx, __localeconvention
|
|
mov al, ES_[bx]
|
|
mov [bp+@@localeDot], al
|
|
push es
|
|
ife LDATA
|
|
push ds
|
|
pop es
|
|
endif
|
|
mov ax, [bp+@@ndec]
|
|
cmp ax, __XCVTDIG__
|
|
jbe short @@meaningful
|
|
mov ax, __XCVTDIG__
|
|
mov [bp+@@ndec], ax
|
|
|
|
@@meaningful:
|
|
mov [bp+@@realcnt], ax
|
|
mov dl, [bp+@@formCh]
|
|
and dl, 0DFh
|
|
cmp dl, 'F'
|
|
jnz short @@overallDigits
|
|
neg ax
|
|
jle short @@bounded
|
|
sub ax, ax
|
|
mov [bp+@@ndec], ax
|
|
jmp short @@bounded
|
|
|
|
@@overallDigits:
|
|
or ax, ax
|
|
jg short @@bounded
|
|
mov ax, 1
|
|
jmp short @@decimalsDecided
|
|
|
|
@@bounded:
|
|
cmp dl, 'E'
|
|
jnz short @@decimalsDecided
|
|
inc ax
|
|
inc [bp+@@ndec]
|
|
|
|
@@decimalsDecided:
|
|
if LDATA
|
|
push word ptr [bp+@@valueP+2]
|
|
endif
|
|
push word ptr [bp+@@valueP]
|
|
push ax
|
|
pushSS_
|
|
lea bx, [bp+@@sign]
|
|
push bx
|
|
pushSS_
|
|
lea si, [bp+@@buf]
|
|
push si
|
|
mov ax, [bp+@@type]
|
|
push ax
|
|
call ___xcvt
|
|
xchg ax, bx
|
|
LES_ di, [bp+@@strP]
|
|
cld
|
|
cmp bx, INF_number
|
|
jz short @@infinities
|
|
cmp bx, NAN_number
|
|
jz short @@NANs
|
|
jmp short @@regular_number
|
|
|
|
@@infinities:
|
|
mov ax, 492Bh
|
|
cmp [bp+@@sign], 0
|
|
jz short @@store_Isign
|
|
inc ax
|
|
inc ax
|
|
|
|
@@store_Isign:
|
|
stosw
|
|
mov ax, 464Eh
|
|
stosw
|
|
jmp @@end
|
|
|
|
@@NANs:
|
|
mov ax, 4E2Bh
|
|
cmp [bp+@@sign], 0
|
|
jz short @@store_Nsign
|
|
inc ax
|
|
inc ax
|
|
|
|
@@store_Nsign:
|
|
stosw
|
|
mov al, 'A'
|
|
stosw
|
|
jmp @@end
|
|
|
|
@@regular_number:
|
|
cmp byte ptr [bp+@@sign], 0
|
|
jz short @@signSet
|
|
mov al, '-'
|
|
stosb
|
|
|
|
@@signSet:
|
|
mov dl, [bp+@@formCh]
|
|
and dl, 5Fh
|
|
cmp dl, 'F'
|
|
jz short @@F_format
|
|
cmp dl, 'E'
|
|
jz short @@E_format
|
|
cmp bx, -3
|
|
jl short @@E_format
|
|
mov ax, [bp+@@ndec]
|
|
or ax, ax
|
|
jnz short @@NotZero
|
|
inc ax
|
|
|
|
@@NotZero:
|
|
cmp bx, ax
|
|
jg short @@E_format
|
|
|
|
@@F_format:
|
|
cmp bx, __XCVTDIG__
|
|
jg short @@E_format
|
|
or bx, bx
|
|
jg short @@FdigitStart
|
|
mov ah, [bp+@@localeDot]
|
|
mov al, '0'
|
|
stosw
|
|
mov cx, 1
|
|
jz short @@Fdigits
|
|
mov al, '0'
|
|
|
|
@@FleadZeroes:
|
|
stosb
|
|
inc bx
|
|
jnz short @@FleadZeroes
|
|
|
|
@@FdigitStart:
|
|
mov cx, 0
|
|
|
|
@@Fdigits:
|
|
lods byte ptr SS_[si]
|
|
or al, al
|
|
jz short @@Fend
|
|
stosb
|
|
dec bx
|
|
jnz short @@Fdigits
|
|
mov al, [bp+@@localeDot]
|
|
stosb
|
|
inc cx
|
|
jmp short @@Fdigits
|
|
|
|
@@Fend:
|
|
mov ax, [bp+@@ndec]
|
|
add cx, [bp+@@realcnt]
|
|
cmp ax, cx
|
|
jbe short @@no_zero_pad
|
|
sub ax, cx
|
|
mov cx, ax
|
|
add bx, ax
|
|
mov al, '0'
|
|
rep stosb
|
|
dec bx
|
|
jz short @@Fz
|
|
|
|
@@no_zero_pad:
|
|
dec bx
|
|
jz short @@Fz
|
|
cmp [bp+@@altFormat], 0
|
|
jnz short @@Fz
|
|
mov dl, [bp+@@formCh]
|
|
mov cx, word ptr [bp+@@strP]
|
|
xchg bx, di
|
|
mov ah, [bp+@@localeDot]
|
|
call TrimTrailing
|
|
xchg di, bx
|
|
|
|
@@Fz:
|
|
cmp di, word ptr [bp+@@strP]
|
|
jnz short @@goto_end
|
|
mov al, '0'
|
|
stosb
|
|
|
|
@@goto_end:
|
|
jmp short @@end
|
|
|
|
@@E_format:
|
|
lods word ptr SS_[si]
|
|
stosb
|
|
mov al, [bp+@@localeDot]
|
|
or ah, ah
|
|
jnz short @@Edecimal
|
|
cmp [bp+@@altFormat], 0
|
|
jz short @@Eexp
|
|
stosb
|
|
jmp short @@Eexp
|
|
|
|
@@Edecimal:
|
|
stosb
|
|
mov al, ah
|
|
|
|
@@Edigits:
|
|
stosb
|
|
lods byte ptr SS_[si]
|
|
or al, al
|
|
jnz short @@Edigits
|
|
cmp [bp+@@altFormat], 0
|
|
jnz short @@Eexp
|
|
mov dl, [bp+@@formCh]
|
|
mov cx, word ptr [bp+@@strP]
|
|
xchg bx, di
|
|
mov ah, [bp+@@localeDot]
|
|
call TrimTrailing
|
|
xchg di, bx
|
|
|
|
@@Eexp:
|
|
mov al, 20h
|
|
and al, [bp+@@formCh]
|
|
or al, 'E'
|
|
stosb
|
|
mov ax, '-+'
|
|
dec bx
|
|
jge short @@EexpSigned
|
|
xchg al, ah
|
|
neg bx
|
|
|
|
@@EexpSigned:
|
|
stosb
|
|
xchg ax, bx
|
|
mov cx, '00'
|
|
cmp ax, 99
|
|
jbe short @@EtwoDigits
|
|
cmp ax, 999
|
|
jbe short @@EthreeDigits
|
|
cwd
|
|
mov bx, 1000
|
|
div bx
|
|
add al, cl
|
|
stosb
|
|
xchg ax, dx
|
|
|
|
@@EthreeDigits:
|
|
mov bl, 100
|
|
div bl
|
|
add al, cl
|
|
stosb
|
|
xchg al, ah
|
|
cbw
|
|
|
|
@@EtwoDigits:
|
|
mov bl, 10
|
|
div bl
|
|
add ax, cx
|
|
stosw
|
|
|
|
@@end:
|
|
xor al, al
|
|
stosb
|
|
pop es
|
|
pop di
|
|
pop si
|
|
mov sp, bp
|
|
pop bp
|
|
ret 10h
|
|
___realcvt endp
|
|
|
|
turboCvt proc near
|
|
push bp
|
|
mov bp, sp
|
|
pop bp
|
|
ret
|
|
turboCvt endp
|