mirror of https://github.com/nmlgc/ReC98.git
165 lines
3.4 KiB
NASM
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
|