1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
|
display_string:
lods byte [esi]
or al,al
jz string_end
mov dl,al
mov ah,2
int 21h
jmp display_string
string_end:
ret
alloc:
push ebx esi edi
mov cx,ax
shr eax,16
mov bx,ax
mov ax,501h
int 31h
jc dpmi_allocation_failed
mov ax,bx
shl eax,16
mov ax,cx
mov edx,main
shl edx,4
sub eax,edx
mov bx,si
shl ebx,16
mov bx,di
mov ecx,[memory_handles_count]
inc [memory_handles_count]
shl ecx,3
add ecx,memory_handles
mov [ecx],eax
mov [ecx+4],ebx
pop edi esi ebx
clc
ret
dpmi_allocation_failed:
pop edi esi ebx
stc
ret
free:
push ebx esi edi
mov esi,memory_handles
mov ecx,[memory_handles_count]
find_memory_handle:
cmp eax,[esi]
je memory_handle_found
add esi,8
loop find_memory_handle
pop edi esi
ret
memory_handle_found:
mov ebx,[esi+4]
dec [memory_handles_count]
dec ecx
jz free_memory
remove_memory_handle:
mov edx,[esi+8]
mov edi,[esi+8+4]
mov [esi],edx
mov [esi+4],edi
add esi,8
loop remove_memory_handle
free_memory:
mov esi,ebx
shr esi,16
mov di,bx
mov ax,502h
int 31h
pop edi esi ebx
ret
open:
push esi edi ebp
call adapt_path
mov ax,716Ch
mov bx,100000b
mov dx,1
xor cx,cx
xor si,si
call dos_int
jnc open_done
cmp ax,7100h
je old_open
stc
jmp open_done
old_open:
mov ax,3D00h
xor dx,dx
call dos_int
open_done:
mov bx,ax
pop ebp edi esi
ret
adapt_path:
mov esi,edx
mov edi,buffer
copy_path:
lodsb
cmp al,'/'
jne path_char_ok
mov al,'\'
path_char_ok:
stosb
or al,al
jnz copy_path
ret
dos_int:
push 0 0 0
pushw buffer_segment buffer_segment
stc
pushfw
push eax
push ecx
push edx
push ebx
push 0
push ebp
push esi
push edi
mov ax,300h
mov bx,21h
xor cx,cx
mov edi,esp
push es ss
pop es
int 31h
pop es
mov edi,[esp]
mov esi,[esp+4]
mov ebp,[esp+8]
mov ebx,[esp+10h]
mov edx,[esp+14h]
mov ecx,[esp+18h]
mov ah,[esp+20h]
add esp,32h
sahf
mov eax,[esp-32h+1Ch]
ret
create:
push esi edi ebp
call adapt_path
mov ax,716Ch
mov bx,100001b
mov dx,10010b
xor cx,cx
xor si,si
xor di,di
call dos_int
jnc create_done
cmp ax,7100h
je old_create
stc
jmp create_done
old_create:
mov ah,3Ch
xor cx,cx
xor dx,dx
call dos_int
create_done:
mov bx,ax
pop ebp edi esi
ret
write:
push edx esi edi ebp
mov ebp,ecx
mov esi,edx
write_loop:
mov ecx,1000h
sub ebp,1000h
jnc do_write
add ebp,1000h
mov ecx,ebp
xor ebp,ebp
do_write:
push ecx
mov edi,buffer
shr ecx,2
rep movsd
mov ecx,[esp]
and ecx,11b
rep movsb
pop ecx
mov ah,40h
xor dx,dx
call dos_int
or ebp,ebp
jnz write_loop
pop ebp edi esi edx
ret
read:
push edx esi edi ebp
mov ebp,ecx
mov edi,edx
read_loop:
mov ecx,1000h
sub ebp,1000h
jnc do_read
add ebp,1000h
mov ecx,ebp
xor ebp,ebp
do_read:
push ecx
mov ah,3Fh
xor dx,dx
call dos_int
cmp ax,cx
jne eof
mov esi,buffer
mov ecx,[esp]
shr ecx,2
rep movsd
pop ecx
and ecx,11b
rep movsb
or ebp,ebp
jnz read_loop
read_done:
pop ebp edi esi edx
ret
eof:
pop ecx
stc
jmp read_done
close:
mov ah,3Eh
int 21h
ret
lseek:
mov ah,42h
mov ecx,edx
shr ecx,16
int 21h
pushf
shl edx,16
popf
mov dx,ax
mov eax,edx
ret
|