ReC98/libs/BorlandC/dosenv.asm

165 lines
3.4 KiB
NASM

; char* pascal near __DOSenv(char **envV, char *pathP, void **envSave)
public __DOSENV
__DOSENV proc near
@@bufP = dword ptr -0Ah
@@envS = word ptr -6
@@envW = dword ptr -4
@@envSave = dword ptr 4
@@pathP = dword ptr 8
@@envV = dword ptr 0Ch
push bp
mov bp, sp
sub sp, 0Ah
push si
push di
mov [bp+@@envS], 1
mov dx, word ptr [bp+@@envV+2]
mov ax, word ptr [bp+@@envV]
mov word ptr [bp+@@envW+2], dx
mov word ptr [bp+@@envW], ax
or ax, dx
jz short @@DOSENV_got_size
mov [bp+@@envS], 0
jmp short @@DOSENV_compute_loop
@@DOSENV_compute_size:
les bx, [bp+@@envW]
add word ptr [bp+@@envW], 4
push word ptr es:[bx+2]
push word ptr es:[bx]
nopcall _strlen
pop cx
pop cx
inc ax
add [bp+@@envS], ax
@@DOSENV_compute_loop:
les bx, [bp+@@envW]
mov ax, es:[bx]
or ax, es:[bx+2]
jz short @@DOSENV_got_size
les bx, es:[bx]
cmp byte ptr es:[bx], 0
jnz short @@DOSENV_compute_size
@@DOSENV_got_size:
inc [bp+@@envS]
mov ax, word ptr [bp+@@pathP]
or ax, word ptr [bp+@@pathP+2]
jz short @@DOSENV_size_check
push word ptr [bp+@@pathP+2]
push word ptr [bp+@@pathP]
nopcall _strlen
pop cx
pop cx
add ax, 3
add [bp+@@envS], ax
@@DOSENV_size_check:
cmp [bp+@@envS], 8000h
jb short @@DOSENV_alloc
jmp @@DOSENV_ret_0
@@DOSENV_alloc:
mov ax, [bp+@@envS]
add ax, 0Fh
push ax
nopcall _malloc
pop cx
mov word ptr [bp+@@bufP+2], dx
mov word ptr [bp+@@bufP], ax
or ax, dx
jnz short @@DOSENV_align
jmp @@DOSENV_ret_0
@@DOSENV_align:
les bx, [bp+@@envSave]
mov ax, word ptr [bp+@@bufP]
mov es:[bx+2], dx
mov es:[bx], ax
add word ptr [bp+@@bufP], 0Fh
and word ptr [bp+@@bufP], 0FFF0h
mov dx, word ptr [bp+@@envV+2]
mov ax, word ptr [bp+@@envV]
mov word ptr [bp+@@envW+2], dx
mov word ptr [bp+@@envW], ax
or ax, dx
jz short @@DOSENV_append_check
les bx, [bp+@@envW]
mov ax, es:[bx]
or ax, es:[bx+2]
jz short @@DOSENV_append_check
jmp short @@DOSENV_concat_loop
@@DOSENV_concat:
les bx, [bp+@@envW]
add word ptr [bp+@@envW], 4
push word ptr es:[bx+2]
push word ptr es:[bx]
push word ptr [bp+@@bufP+2]
push word ptr [bp+@@bufP]
nopcall _stpcpy
add sp, 8
mov word ptr [bp+@@bufP+2], dx
mov word ptr [bp+@@bufP], ax
les bx, [bp+@@bufP]
mov byte ptr es:[bx], 0
inc word ptr [bp+@@bufP]
@@DOSENV_concat_loop:
les bx, [bp+@@envW]
mov ax, es:[bx]
or ax, es:[bx+2]
jz short @@DOSENV_append
les bx, es:[bx]
cmp byte ptr es:[bx], 0
jnz short @@DOSENV_concat
jmp short @@DOSENV_append
@@DOSENV_append_check:
les bx, [bp+@@bufP]
mov byte ptr es:[bx], 0
inc word ptr [bp+@@bufP]
@@DOSENV_append:
les bx, [bp+@@bufP]
mov byte ptr es:[bx], 0
inc word ptr [bp+@@bufP]
mov ax, word ptr [bp+@@pathP]
or ax, word ptr [bp+@@pathP+2]
jz short @@DOSENV_ret_buf
les bx, [bp+@@bufP]
mov word ptr es:[bx], 1
add word ptr [bp+@@bufP], 2
push word ptr [bp+@@pathP+2]
push word ptr [bp+@@pathP]
push word ptr [bp+@@bufP+2]
push word ptr [bp+@@bufP]
nopcall _stpcpy
add sp, 8
mov word ptr [bp+@@bufP+2], dx
mov word ptr [bp+@@bufP], ax
les bx, [bp+@@bufP]
mov byte ptr es:[bx], 0
inc word ptr [bp+@@bufP]
@@DOSENV_ret_buf:
mov dx, word ptr [bp+@@bufP+2]
mov ax, word ptr [bp+@@bufP]
sub ax, [bp+@@envS]
jmp short @@DOSENV_ret
@@DOSENV_ret_0:
xor dx, dx
xor ax, ax
@@DOSENV_ret:
pop di
pop si
mov sp, bp
pop bp
retn 0Ch
__DOSENV endp