Du kan inte välja fler än 25 ämnen
Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
2469 rader
55 KiB
2469 rader
55 KiB
! 1 |
|
! 1 # 1 "implementation/lsfs.c" |
|
! 1 # 1 "implementation/../std_singos/stdio.h" |
|
! 1 void print(string); |
|
!BCC_EOS |
|
! 2 void* dump_ax_return(input); |
|
!BCC_EOS |
|
! 3 |
|
! 4 void print(string) |
|
! 5 char* string; |
|
export _print |
|
_print: |
|
!BCC_EOS |
|
! 6 { |
|
! 7 #asm |
|
!BCC_ASM |
|
_print.string set 2 |
|
|
|
push bp |
|
mov bp,sp |
|
mov si,4[bp] |
|
call 0x0000:0x7C47 |
|
pop bp |
|
! 13 endasm |
|
!BCC_ENDASM |
|
! 14 } |
|
ret |
|
! 15 |
|
! 16 void print_stack(argument) |
|
! 17 { |
|
export _print_stack |
|
_print_stack: |
|
! 18 #asm |
|
!BCC_ASM |
|
_print_stack.argument set 2 |
|
|
|
push bp |
|
mov bp,sp |
|
push ds |
|
push ax |
|
|
|
mov ax, ss |
|
mov ds, ax |
|
mov si,4[bp] |
|
call 0x0000:0x7C47 |
|
|
|
pop ax |
|
pop ds |
|
pop bp |
|
! 32 endasm |
|
!BCC_ENDASM |
|
! 33 } |
|
ret |
|
! 34 |
|
! 35 void* dump_ax_return(input) |
|
! 36 void* input; |
|
export _dump_ax_return |
|
_dump_ax_return: |
|
!BCC_EOS |
|
! 37 { |
|
! 38 return input; |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
mov ax,4[bp] |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 39 } |
|
! 40 |
|
! 41 void dump_ax(input) |
|
! 42 void* input; |
|
export _dump_ax |
|
_dump_ax: |
|
!BCC_EOS |
|
! 43 { |
|
! 44 dump_ax_return(input) |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
! 45 #asm |
|
! Debug: list * void input = [S+6+2] (used reg = ) |
|
push 4[bp] |
|
! Debug: func () * void = dump_ax_return+0 (used reg = ) |
|
call _dump_ax_return |
|
inc sp |
|
inc sp |
|
!BCC_EOS |
|
!BCC_ASM |
|
_dump_ax.input set 8 |
|
.dump_ax.input set 4 |
|
push bp |
|
mov bp,sp |
|
call 0x000:0x7C2A |
|
pop bp |
|
! 50 endasm |
|
!BCC_ENDASM |
|
!BCC_EOS |
|
! 51 } |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
! 52 |
|
! 53 void print_newline() |
|
! 54 { |
|
export _print_newline |
|
_print_newline: |
|
! 55 #asm |
|
!BCC_ASM |
|
|
|
printCRLF: |
|
mov ah, #0xE |
|
mov al, #13 |
|
int #0x10 |
|
mov al, #10 |
|
int #0x10 |
|
ret |
|
! 63 endasm |
|
!BCC_ENDASM |
|
! 64 } |
|
ret |
|
! 65 # 1 "implementation/../std_singos/stdlib.h" |
|
! 1 unsigned int global_heap_start = 0; |
|
.data |
|
export _global_heap_start |
|
_global_heap_start: |
|
.word 0 |
|
!BCC_EOS |
|
! 2 unsigned int global_heap_end = 0; |
|
export _global_heap_end |
|
_global_heap_end: |
|
.word 0 |
|
!BCC_EOS |
|
! 3 unsigned int global_heap_next = 0; |
|
export _global_heap_next |
|
_global_heap_next: |
|
.word 0 |
|
!BCC_EOS |
|
! 4 |
|
! 5 void* malloc(num_bytes); |
|
!BCC_EOS |
|
! 6 void* calloc(number_elements, size); |
|
!BCC_EOS |
|
! 7 int set_heap_settings(param_start, param_end); |
|
!BCC_EOS |
|
! 8 unsigned int get_heap_next(); |
|
!BCC_EOS |
|
! 9 |
|
! 10 void* malloc(num_bytes) |
|
! 11 int num_bytes; |
|
.text |
|
export _malloc |
|
_malloc: |
|
!BCC_EOS |
|
! 12 { |
|
! 13 unsigned int allocated_pointer = global_heap_next; |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
dec sp |
|
dec sp |
|
! Debug: eq unsigned int = [global_heap_next+0] to unsigned int allocated_pointer = [S+8-8] (used reg = ) |
|
mov ax,[_global_heap_next] |
|
mov -6[bp],ax |
|
!BCC_EOS |
|
! 14 global_heap_next = global_heap_next + num_bytes; |
|
! Debug: add int num_bytes = [S+8+2] to unsigned int = [global_heap_next+0] (used reg = ) |
|
mov ax,[_global_heap_next] |
|
add ax,4[bp] |
|
! Debug: eq unsigned int = ax+0 to unsigned int = [global_heap_next+0] (used reg = ) |
|
mov [_global_heap_next],ax |
|
!BCC_EOS |
|
! 15 if (global_heap_next > global_heap_end) |
|
! Debug: gt unsigned int = [global_heap_end+0] to unsigned int = [global_heap_next+0] (used reg = ) |
|
mov ax,[_global_heap_next] |
|
cmp ax,[_global_heap_end] |
|
jbe .1 |
|
.2: |
|
! 16 { |
|
! 17 return 0; |
|
xor ax,ax |
|
inc sp |
|
inc sp |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 18 } |
|
! 19 |
|
! 20 return allocated_pointer; |
|
.1: |
|
mov ax,-6[bp] |
|
inc sp |
|
inc sp |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 21 } |
|
! 22 |
|
! 23 void* calloc(number_elements, size) |
|
! 24 unsigned int number_elements; |
|
export _calloc |
|
_calloc: |
|
!BCC_EOS |
|
! 25 unsigned int size; |
|
!BCC_EOS |
|
! 26 { |
|
! 27 int i; |
|
!BCC_EOS |
|
! 28 char* temp_pointer; |
|
!BCC_EOS |
|
! 29 unsigned int num_bytes = number_elements * size; |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
add sp,*-6 |
|
! Debug: mul unsigned int size = [S+$C+4] to unsigned int number_elements = [S+$C+2] (used reg = ) |
|
mov ax,4[bp] |
|
mov cx,6[bp] |
|
imul cx |
|
! Debug: eq unsigned int = ax+0 to unsigned int num_bytes = [S+$C-$C] (used reg = ) |
|
mov -$A[bp],ax |
|
!BCC_EOS |
|
! 30 void* allocated_pointer = global_heap_next; |
|
dec sp |
|
dec sp |
|
! Debug: eq unsigned int = [global_heap_next+0] to * void allocated_pointer = [S+$E-$E] (used reg = ) |
|
mov bx,[_global_heap_next] |
|
mov -$C[bp],bx |
|
!BCC_EOS |
|
! 31 global_heap_next = global_heap_next + num_bytes; |
|
! Debug: add unsigned int num_bytes = [S+$E-$C] to unsigned int = [global_heap_next+0] (used reg = ) |
|
mov ax,[_global_heap_next] |
|
add ax,-$A[bp] |
|
! Debug: eq unsigned int = ax+0 to unsigned int = [global_heap_next+0] (used reg = ) |
|
mov [_global_heap_next],ax |
|
!BCC_EOS |
|
! 32 if (global_heap_next > global_heap_end) |
|
! Debug: gt unsigned int = [global_heap_end+0] to unsigned int = [global_heap_next+0] (used reg = ) |
|
mov ax,[_global_heap_next] |
|
cmp ax,[_global_heap_end] |
|
jbe .3 |
|
.4: |
|
! 33 { |
|
! 34 return 0; |
|
xor ax,ax |
|
add sp,*8 |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 35 } |
|
! 36 |
|
! 37 |
|
! 38 temp_pointer = allocated_pointer; |
|
.3: |
|
! Debug: eq * void allocated_pointer = [S+$E-$E] to * char temp_pointer = [S+$E-$A] (used reg = ) |
|
mov bx,-$C[bp] |
|
mov -8[bp],bx |
|
!BCC_EOS |
|
! 39 for (i = 0; i < num_bytes; ++i) |
|
! Debug: eq int = const 0 to int i = [S+$E-8] (used reg = ) |
|
xor ax,ax |
|
mov -6[bp],ax |
|
!BCC_EOS |
|
!BCC_EOS |
|
! 40 { |
|
jmp .7 |
|
.8: |
|
! 41 *temp_pointer = 0; |
|
mov bx,-8[bp] |
|
! Debug: eq int = const 0 to char = [bx+0] (used reg = ) |
|
xor al,al |
|
mov [bx],al |
|
!BCC_EOS |
|
! 42 temp_pointer++; |
|
! Debug: postinc * char temp_pointer = [S+$E-$A] (used reg = ) |
|
mov bx,-8[bp] |
|
inc bx |
|
mov -8[bp],bx |
|
!BCC_EOS |
|
! 43 } |
|
! 44 |
|
! 45 return allocated_pointer; |
|
.6: |
|
! Debug: preinc int i = [S+$E-8] (used reg = ) |
|
mov ax,-6[bp] |
|
inc ax |
|
mov -6[bp],ax |
|
.7: |
|
! Debug: lt unsigned int num_bytes = [S+$E-$C] to int i = [S+$E-8] (used reg = ) |
|
mov ax,-6[bp] |
|
cmp ax,-$A[bp] |
|
jb .8 |
|
.9: |
|
.5: |
|
mov ax,-$C[bp] |
|
add sp,*8 |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 46 } |
|
! 47 |
|
! 48 int set_heap_settings(param_start, param_end) |
|
! Register BX used in function calloc |
|
! 49 unsigned int param_start; |
|
export _set_heap_settings |
|
_set_heap_settings: |
|
!BCC_EOS |
|
! 50 unsigned int param_end; |
|
!BCC_EOS |
|
! 51 { |
|
! 52 global_heap_start = param_start; |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
! Debug: eq unsigned int param_start = [S+6+2] to unsigned int = [global_heap_start+0] (used reg = ) |
|
mov ax,4[bp] |
|
mov [_global_heap_start],ax |
|
!BCC_EOS |
|
! 53 global_heap_next = param_start; |
|
! Debug: eq unsigned int param_start = [S+6+2] to unsigned int = [global_heap_next+0] (used reg = ) |
|
mov ax,4[bp] |
|
mov [_global_heap_next],ax |
|
!BCC_EOS |
|
! 54 global_heap_end = param_end; |
|
! Debug: eq unsigned int param_end = [S+6+4] to unsigned int = [global_heap_end+0] (used reg = ) |
|
mov ax,6[bp] |
|
mov [_global_heap_end],ax |
|
!BCC_EOS |
|
! 55 return 0; |
|
xor ax,ax |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 56 } |
|
! 57 |
|
! 58 unsigned int get_heap_next() |
|
! 59 { |
|
export _get_heap_next |
|
_get_heap_next: |
|
! 60 return global_heap_n |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
! 60 ext; |
|
mov ax,[_global_heap_next] |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 61 # 19 "implementation/../main.h" |
|
! 19 } |
|
! 20 # 2 "implementation/../std_singos/string.h" |
|
! 2 typedef struct Length_String { |
|
! 3 short dynamic; |
|
!BCC_EOS |
|
! 4 unsigned int length; |
|
!BCC_EOS |
|
! 5 char *chars; |
|
!BCC_EOS |
|
! 6 } Length_String; |
|
!BCC_EOS |
|
! 7 |
|
! 8 typedef struct String_Array { |
|
! 9 unsigned int length; |
|
!BCC_EOS |
|
! 10 Length_String **strings; |
|
!BCC_EOS |
|
! 11 } String_Array; |
|
!BCC_EOS |
|
! 12 |
|
! 13 void strcpy (destination, destination_segment, source, source_segment ); |
|
!BCC_EOS |
|
! 14 int strlen (source, source_segment); |
|
!BCC_EOS |
|
! 15 void memcpy (destination, destination_segment, source, source_segment, num_bytes ); |
|
!BCC_EOS |
|
! 16 |
|
! 17 |
|
! 18 String_Array *string_split_c(string, delim, keep_delim); |
|
!BCC_EOS |
|
! 19 Length_String *make_length_string(length, chars); |
|
!BCC_EOS |
|
! 20 Length_String *make_length_string_c(cstring); |
|
!BCC_EOS |
|
! 21 String_Array *length_string_split(string, delim, keep_delim); |
|
!BCC_EOS |
|
! 22 String_Array *create_length_string_array(array_size); |
|
!BCC_EOS |
|
! 23 Length_String *create_length_string(length, chars); |
|
!BCC_EOS |
|
! 24 |
|
! 25 |
|
! 26 |
|
! 27 int strlen (source, source_segment) |
|
! 28 { |
|
export _strlen |
|
_strlen: |
|
! 29 #asm |
|
!BCC_ASM |
|
_strlen.source set 2 |
|
_strlen.source_segment set 4 |
|
|
|
|
|
push bp |
|
mov bp,sp |
|
push ds |
|
push bx |
|
|
|
mov ax, 6[bp]; |
|
mov ds, ax |
|
|
|
mov bx, 4[bp]; |
|
|
|
label_strlen: |
|
mov cx, #0x0 ; Set counte to zero |
|
.label_strlen_loop: |
|
mov BYTE al, [bx] |
|
cmp al, #0x0 |
|
je .label_strlen_done |
|
inc cx ; Count 1 |
|
inc bx ; Look at next char |
|
jmp .label_strlen_loop |
|
.label_strlen_done: |
|
mov ax, cx |
|
|
|
pop bx |
|
pop ds |
|
pop bp |
|
! 57 endasm |
|
!BCC_ENDASM |
|
! 58 } |
|
ret |
|
! 59 |
|
! 60 void strcpy (destination, destination_segment, source, source_segment ) |
|
! 61 char *destination; |
|
export _strcpy |
|
_strcpy: |
|
!BCC_EOS |
|
! 62 int destination_segment; |
|
!BCC_EOS |
|
! 63 char *source; |
|
!BCC_EOS |
|
! 64 int source_segment; |
|
!BCC_EOS |
|
! 65 { |
|
! 66 #asm |
|
!BCC_ASM |
|
_strcpy.source set 6 |
|
_strcpy.destination set 2 |
|
_strcpy.source_segment set 8 |
|
_strcpy.destination_segment set 4 |
|
; copy two strings |
|
; IN si: the first (zero terminated) string |
|
; IN di: the second (zero terminated) string |
|
; OUT SF and ZF (same semantics as cmp) |
|
|
|
! 72 76 |
|
|
|
push bp |
|
mov bp,sp |
|
label_strcpy: |
|
push ax |
|
push bx |
|
push di |
|
push es |
|
push si |
|
push ds |
|
mov ax, 4[bp]; ; |
|
mov di, ax |
|
mov ax, 6[bp]; ; |
|
mov es, ax |
|
mov ax, 8[bp]; ; |
|
mov si, ax |
|
mov ax, 10[bp]; ; |
|
mov ds, ax |
|
mov cx, 0x050 ;TODO(Jrn) Hardcded number of bytes to copy |
|
.label_strcpy_loop: |
|
movsb |
|
cmp cx, 0x0 |
|
je .label_strcpy_end |
|
dec cx |
|
jmp .label_strcpy_loop |
|
.label_strcpy_end: |
|
pop ds |
|
pop si |
|
pop es |
|
pop di |
|
pop bx |
|
pop ax |
|
pop bp |
|
|
|
! 110 endasm |
|
!BCC_ENDASM |
|
! 111 } |
|
ret |
|
! 112 |
|
! 113 void memcpy (destination, destination_segment, source, source_segment, num_bytes) |
|
! 114 void *destination; |
|
export _memcpy |
|
_memcpy: |
|
!BCC_EOS |
|
! 115 int destination_segment; |
|
!BCC_EOS |
|
! 116 void *source; |
|
!BCC_EOS |
|
! 117 int source_segment; |
|
!BCC_EOS |
|
! 118 int num_bytes; |
|
!BCC_EOS |
|
! 119 { |
|
! 120 #asm |
|
!BCC_ASM |
|
_memcpy.source set 6 |
|
_memcpy.destination set 2 |
|
_memcpy.num_bytes set $A |
|
_memcpy.source_segment set 8 |
|
_memcpy.destination_segment set 4 |
|
; copy two strings |
|
; IN si: the first (zero terminated) string |
|
; IN di: the second (zero terminated) string |
|
; OUT SF and ZF (same semantics as cmp) |
|
|
|
! 126 131 |
|
|
|
push bp |
|
mov bp,sp |
|
label_memcpy: |
|
push ax |
|
push bx |
|
push di |
|
push es |
|
push si |
|
push ds |
|
mov ax, 4[bp]; ; |
|
mov di, ax |
|
mov ax, 6[bp]; ; |
|
mov es, ax |
|
mov ax, 8[bp]; ; |
|
mov si, ax |
|
mov ax, 10[bp]; ; |
|
mov ds, ax |
|
mov cx, 12[bp]; |
|
.label_memcpy_loop: |
|
movsb |
|
cmp cx, 0x0 |
|
je .label_memcpy_end |
|
dec cx |
|
jmp .label_memcpy_loop |
|
.label_memcpy_end: |
|
pop ds |
|
pop si |
|
pop es |
|
pop di |
|
pop bx |
|
pop ax |
|
pop bp |
|
|
|
! 165 endasm |
|
!BCC_ENDASM |
|
! 166 } |
|
ret |
|
! 167 |
|
! 168 int strcmp(source_1, source_2) |
|
! 169 char* source_1; |
|
export _strcmp |
|
_strcmp: |
|
!BCC_EOS |
|
! 170 char* source_2; |
|
!BCC_EOS |
|
! 171 { |
|
! 172 int i; |
|
!BCC_EOS |
|
! 173 int count; |
|
!BCC_EOS |
|
! 174 |
|
! 175 count = strlen(source_1); |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
add sp,*-4 |
|
! Debug: list * char source_1 = [S+$A+2] (used reg = ) |
|
push 4[bp] |
|
! Debug: func () int = strlen+0 (used reg = ) |
|
call _strlen |
|
inc sp |
|
inc sp |
|
! Debug: eq int = ax+0 to int count = [S+$A-$A] (used reg = ) |
|
mov -8[bp],ax |
|
!BCC_EOS |
|
! 176 if (count != strlen(source_2)) |
|
! Debug: list * char source_2 = [S+$A+4] (used reg = ) |
|
push 6[bp] |
|
! Debug: func () int = strlen+0 (used reg = ) |
|
call _strlen |
|
inc sp |
|
inc sp |
|
! Debug: ne int = ax+0 to int count = [S+$A-$A] (used reg = ) |
|
! Debug: expression subtree swapping |
|
cmp ax,-8[bp] |
|
je .A |
|
.B: |
|
! 177 { |
|
! 178 |
|
! 179 } |
|
! 180 |
|
! 181 |
|
! 182 for (i = 0; i < count; ++i) |
|
.A: |
|
! Debug: eq int = const 0 to int i = [S+$A-8] (used reg = ) |
|
xor ax,ax |
|
mov -6[bp],ax |
|
!BCC_EOS |
|
!BCC_EOS |
|
! 183 { |
|
jmp .E |
|
.F: |
|
! 184 if(source_1[i] != source_2[i]) |
|
! Debug: ptradd int i = [S+$A-8] to * char source_2 = [S+$A+4] (used reg = ) |
|
mov ax,-6[bp] |
|
add ax,6[bp] |
|
mov bx,ax |
|
! Debug: ptradd int i = [S+$A-8] to * char source_1 = [S+$A+2] (used reg = bx) |
|
mov ax,-6[bp] |
|
add ax,4[bp] |
|
mov si,ax |
|
! Debug: ne char = [bx+0] to char = [si+0] (used reg = ) |
|
mov al,[si] |
|
cmp al,[bx] |
|
je .10 |
|
.11: |
|
! 185 { |
|
! 186 return -1; |
|
mov ax,*-1 |
|
add sp,*4 |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 187 } |
|
! 188 } |
|
.10: |
|
! 189 |
|
! 190 return 0; |
|
.D: |
|
! Debug: preinc int i = [S+$A-8] (used reg = ) |
|
mov ax,-6[bp] |
|
inc ax |
|
mov -6[bp],ax |
|
.E: |
|
! Debug: lt int count = [S+$A-$A] to int i = [S+$A-8] (used reg = ) |
|
mov ax,-6[bp] |
|
cmp ax,-8[bp] |
|
jl .F |
|
.12: |
|
.C: |
|
xor ax,ax |
|
add sp,*4 |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 191 # 223 |
|
! 223 |
|
! 224 } |
|
! 225 |
|
! 226 String_Array *string_split_c(string, delim, keep_delim) |
|
! Register BX SI used in function strcmp |
|
! 227 char *string; |
|
export _string_split_c |
|
_string_split_c: |
|
!BCC_EOS |
|
! 228 char delim; |
|
!BCC_EOS |
|
! 229 short keep_delim; |
|
!BCC_EOS |
|
! 230 { |
|
! 231 return length_string_split(make_length_string_c(string), delim, keep_delim); |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
! Debug: list short keep_delim = [S+6+6] (used reg = ) |
|
push 8[bp] |
|
! Debug: list char delim = [S+8+4] (used reg = ) |
|
mov al,6[bp] |
|
xor ah,ah |
|
push ax |
|
! Debug: list * char string = [S+$A+2] (used reg = ) |
|
push 4[bp] |
|
! Debug: func () * struct Length_String = make_length_string_c+0 (used reg = ) |
|
call _make_length_string_c |
|
inc sp |
|
inc sp |
|
! Debug: list * struct Length_String = ax+0 (used reg = ) |
|
push ax |
|
! Debug: func () * struct String_Array = length_string_split+0 (used reg = ) |
|
call _length_string_split |
|
add sp,*6 |
|
! Debug: cast * struct String_Array = const 0 to * struct String_Array = ax+0 (used reg = ) |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 232 } |
|
! 233 |
|
! 234 Length_String *make_length_string_c(cstring) |
|
! 235 char *cstring; |
|
export _make_length_string_c |
|
_make_length_string_c: |
|
!BCC_EOS |
|
! 236 { |
|
! 237 return make_length_string(strlen(cstring, 0x7e0), cstring); |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
! Debug: list * char cstring = [S+6+2] (used reg = ) |
|
push 4[bp] |
|
! Debug: list int = const $7E0 (used reg = ) |
|
mov ax,#$7E0 |
|
push ax |
|
! Debug: list * char cstring = [S+$A+2] (used reg = ) |
|
push 4[bp] |
|
! Debug: func () int = strlen+0 (used reg = ) |
|
call _strlen |
|
add sp,*4 |
|
! Debug: list int = ax+0 (used reg = ) |
|
push ax |
|
! Debug: func () * struct Length_String = make_length_string+0 (used reg = ) |
|
call _make_length_string |
|
add sp,*4 |
|
! Debug: cast * struct Length_String = const 0 to * struct Length_String = ax+0 (used reg = ) |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 238 } |
|
! 239 |
|
! 240 Length_String *make_length_string(length, chars) |
|
! 241 unsigned int length; |
|
export _make_length_string |
|
_make_length_string: |
|
!BCC_EOS |
|
! 242 char *chars; |
|
!BCC_EOS |
|
! 243 { |
|
! 244 |
|
! 245 Length_String *legth_string = malloc |
|
! 245 (sizeof(Length_String)); |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
dec sp |
|
dec sp |
|
! Debug: list int = const 6 (used reg = ) |
|
mov ax,*6 |
|
push ax |
|
! Debug: func () * void = malloc+0 (used reg = ) |
|
call _malloc |
|
inc sp |
|
inc sp |
|
! Debug: eq * void = ax+0 to * struct Length_String legth_string = [S+8-8] (used reg = ) |
|
mov -6[bp],ax |
|
!BCC_EOS |
|
! 246 char *copy = malloc(length + 1); |
|
dec sp |
|
dec sp |
|
! Debug: add int = const 1 to unsigned int length = [S+$A+2] (used reg = ) |
|
mov ax,4[bp] |
|
! Debug: list unsigned int = ax+1 (used reg = ) |
|
inc ax |
|
push ax |
|
! Debug: func () * void = malloc+0 (used reg = ) |
|
call _malloc |
|
inc sp |
|
inc sp |
|
! Debug: eq * void = ax+0 to * char copy = [S+$A-$A] (used reg = ) |
|
mov -8[bp],ax |
|
!BCC_EOS |
|
! 247 memcpy(copy, 0x7e0, chars, 0x7e0, length); |
|
! Debug: list unsigned int length = [S+$A+2] (used reg = ) |
|
push 4[bp] |
|
! Debug: list int = const $7E0 (used reg = ) |
|
mov ax,#$7E0 |
|
push ax |
|
! Debug: list * char chars = [S+$E+4] (used reg = ) |
|
push 6[bp] |
|
! Debug: list int = const $7E0 (used reg = ) |
|
mov ax,#$7E0 |
|
push ax |
|
! Debug: list * char copy = [S+$12-$A] (used reg = ) |
|
push -8[bp] |
|
! Debug: func () void = memcpy+0 (used reg = ) |
|
call _memcpy |
|
add sp,*$A |
|
!BCC_EOS |
|
! 248 copy[length] = '\0'; |
|
! Debug: ptradd unsigned int length = [S+$A+2] to * char copy = [S+$A-$A] (used reg = ) |
|
mov ax,4[bp] |
|
add ax,-8[bp] |
|
mov bx,ax |
|
! Debug: eq int = const 0 to char = [bx+0] (used reg = ) |
|
xor al,al |
|
mov [bx],al |
|
!BCC_EOS |
|
! 249 |
|
! 250 legth_string->dynamic = 0; |
|
mov bx,-6[bp] |
|
! Debug: eq int = const 0 to short = [bx+0] (used reg = ) |
|
xor ax,ax |
|
mov [bx],ax |
|
!BCC_EOS |
|
! 251 legth_string->length = length; |
|
mov bx,-6[bp] |
|
! Debug: eq unsigned int length = [S+$A+2] to unsigned int = [bx+2] (used reg = ) |
|
mov ax,4[bp] |
|
mov 2[bx],ax |
|
!BCC_EOS |
|
! 252 legth_string->chars = (char *)chars; |
|
mov bx,-6[bp] |
|
! Debug: eq * char chars = [S+$A+4] to * char = [bx+4] (used reg = ) |
|
mov si,6[bp] |
|
mov 4[bx],si |
|
!BCC_EOS |
|
! 253 |
|
! 254 return legth_string; |
|
mov ax,-6[bp] |
|
add sp,*4 |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 255 } |
|
! 256 |
|
! 257 String_Array *length_string_split(string, delim, keep_delim) |
|
! Register BX SI used in function make_length_string |
|
! 258 Length_String *string; |
|
export _length_string_split |
|
_length_string_split: |
|
!BCC_EOS |
|
! 259 char delim; |
|
!BCC_EOS |
|
! 260 short keep_delim; |
|
!BCC_EOS |
|
! 261 { |
|
! 262 unsigned int i; |
|
!BCC_EOS |
|
! 263 unsigned int last; |
|
!BCC_EOS |
|
! 264 |
|
! 265 unsigned int count = 0; |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
add sp,*-6 |
|
! Debug: eq int = const 0 to unsigned int count = [S+$C-$C] (used reg = ) |
|
xor ax,ax |
|
mov -$A[bp],ax |
|
!BCC_EOS |
|
! 266 unsigned int insert_index = 0; |
|
dec sp |
|
dec sp |
|
! Debug: eq int = const 0 to unsigned int insert_index = [S+$E-$E] (used reg = ) |
|
xor ax,ax |
|
mov -$C[bp],ax |
|
!BCC_EOS |
|
! 267 String_Array *result; |
|
!BCC_EOS |
|
! 268 int k; |
|
!BCC_EOS |
|
! 269 |
|
! 270 i = 0; |
|
add sp,*-4 |
|
! Debug: eq int = const 0 to unsigned int i = [S+$12-8] (used reg = ) |
|
xor ax,ax |
|
mov -6[bp],ax |
|
!BCC_EOS |
|
! 271 last = 0; |
|
! Debug: eq int = const 0 to unsigned int last = [S+$12-$A] (used reg = ) |
|
xor ax,ax |
|
mov -8[bp],ax |
|
!BCC_EOS |
|
! 272 while(i < string->length) { |
|
jmp .14 |
|
.15: |
|
! 273 if (string->chars[i] == delim) { |
|
mov bx,4[bp] |
|
! Debug: ptradd unsigned int i = [S+$12-8] to * char = [bx+4] (used reg = ) |
|
mov ax,-6[bp] |
|
add ax,4[bx] |
|
mov bx,ax |
|
! Debug: logeq char delim = [S+$12+4] to char = [bx+0] (used reg = ) |
|
mov al,[bx] |
|
cmp al,6[bp] |
|
jne .16 |
|
.17: |
|
! 274 if (i > last+1) { |
|
! Debug: add int = const 1 to unsigned int last = [S+$12-$A] (used reg = ) |
|
mov ax,-8[bp] |
|
! Debug: gt unsigned int = ax+1 to unsigned int i = [S+$12-8] (used reg = ) |
|
inc ax |
|
cmp ax,-6[bp] |
|
jae .18 |
|
.19: |
|
! 275 ++count; |
|
! Debug: preinc unsigned int count = [S+$12-$C] (used reg = ) |
|
mov ax,-$A[bp] |
|
inc ax |
|
mov -$A[bp],ax |
|
!BCC_EOS |
|
! 276 } |
|
! 277 last = i; |
|
.18: |
|
! Debug: eq unsigned int i = [S+$12-8] to unsigned int last = [S+$12-$A] (used reg = ) |
|
mov ax,-6[bp] |
|
mov -8[bp],ax |
|
!BCC_EOS |
|
! 278 } |
|
! 279 ++i; |
|
.16: |
|
! Debug: preinc unsigned int i = [S+$12-8] (used reg = ) |
|
mov ax,-6[bp] |
|
inc ax |
|
mov -6[bp],ax |
|
!BCC_EOS |
|
! 280 } |
|
! 281 if (i > last+1) { |
|
.14: |
|
mov bx,4[bp] |
|
! Debug: lt unsigned int = [bx+2] to unsigned int i = [S+$12-8] (used reg = ) |
|
mov ax,-6[bp] |
|
cmp ax,2[bx] |
|
jb .15 |
|
.1A: |
|
.13: |
|
! Debug: add int = const 1 to unsigned int last = [S+$12-$A] (used reg = ) |
|
mov ax,-8[bp] |
|
! Debug: gt unsigned int = ax+1 to unsigned int i = [S+$12-8] (used reg = ) |
|
inc ax |
|
cmp ax,-6[bp] |
|
jae .1B |
|
.1C: |
|
! 282 ++count; |
|
! Debug: preinc unsigned int count = [S+$12-$C] (used reg = ) |
|
mov ax,-$A[bp] |
|
inc ax |
|
mov -$A[bp],ax |
|
!BCC_EOS |
|
! 283 } |
|
! 284 |
|
! 285 result = create_length_string_array(count); |
|
.1B: |
|
! Debug: list unsigned int count = [S+$12-$C] (used reg = ) |
|
push -$A[bp] |
|
! Debug: func () * struct String_Array = create_length_string_array+0 (used reg = ) |
|
call _create_length_string_array |
|
inc sp |
|
inc sp |
|
! Debug: eq * struct String_Array = ax+0 to * struct String_Array result = [S+$12-$10] (used reg = ) |
|
mov -$E[bp],ax |
|
!BCC_EOS |
|
! 286 |
|
! 287 if (keep_delim) |
|
mov ax,8[bp] |
|
test ax,ax |
|
je .1D |
|
.1E: |
|
! 288 { |
|
! 289 k = 0; |
|
! Debug: eq int = const 0 to int k = [S+$12-$12] (used reg = ) |
|
xor ax,ax |
|
mov -$10[bp],ax |
|
!BCC_EOS |
|
! 290 } |
|
! 291 else |
|
! 292 { |
|
jmp .1F |
|
.1D: |
|
! 293 k = 1; |
|
! Debug: eq int = const 1 to int k = [S+$12-$12] (used reg = ) |
|
mov ax,*1 |
|
mov -$10[bp],ax |
|
!BCC_EOS |
|
! 294 } |
|
! 295 |
|
! 296 i = 0; |
|
.1F: |
|
! Debug: eq int = const 0 to unsigned int i = [S+$12-8] (used reg = ) |
|
xor ax,ax |
|
mov -6[bp],ax |
|
!BCC_EOS |
|
! 297 last = 0; |
|
! Debug: eq int = const 0 to unsigned int last = [S+$12-$A] (used reg = ) |
|
xor ax,ax |
|
mov -8[bp],ax |
|
!BCC_EOS |
|
! 298 while(i < string->length) { |
|
jmp .21 |
|
.22: |
|
! 299 if (string->chars[i] == delim) { |
|
mov bx,4[bp] |
|
! Debug: ptradd unsigned int i = [S+$12-8] to * char = [bx+4] (used reg = ) |
|
mov ax,-6[bp] |
|
add ax,4[bx] |
|
mov bx,ax |
|
! Debug: logeq char delim = [S+$12+4] to char = [bx+0] (used reg = ) |
|
mov al,[bx] |
|
cmp al,6[bp] |
|
jne .23 |
|
.24: |
|
! 300 if (i > last+1) { |
|
! Debug: add int = const 1 to unsigned int last = [S+$12-$A] (used reg = ) |
|
mov ax,-8[bp] |
|
! Debug: gt unsigned int = ax+1 to unsigned int i = [S+$12-8] (used reg = ) |
|
inc ax |
|
cmp ax,-6[bp] |
|
jae .25 |
|
.26: |
|
! 301 result->strings[insert_index++] = create_length_string(i-(last+k), string->chars+(last+k)); |
|
! Debug: add int k = [S+$12-$12] to unsigned int last = [S+$12-$A] (used reg = ) |
|
mov ax,-8[bp] |
|
add ax,-$10[bp] |
|
mov bx,4[bp] |
|
! Debug: ptradd unsigned int = ax+0 to * char = [bx+4] (used reg = ) |
|
add ax,4[bx] |
|
! Debug: list * char = ax+0 (used reg = ) |
|
push ax |
|
! Debug: add int k = [S+$14-$12] to unsigned int last = [S+$14-$A] (used reg = ) |
|
mov ax,-8[bp] |
|
add ax,-$10[bp] |
|
! Debug: sub unsigned int = ax+0 to unsigned int i = [S+$14-8] (used reg = ) |
|
push ax |
|
mov ax,-6[bp] |
|
sub ax,-$14[bp] |
|
inc sp |
|
inc sp |
|
! Debug: list unsigned int = ax+0 (used reg = ) |
|
push ax |
|
! Debug: func () * struct Length_String = create_length_string+0 (used reg = ) |
|
call _create_length_string |
|
add sp,*4 |
|
push ax |
|
! Debug: postinc unsigned int insert_index = [S+$14-$E] (used reg = ) |
|
mov ax,-$C[bp] |
|
inc ax |
|
mov -$C[bp],ax |
|
mov bx,-$E[bp] |
|
! Debug: ptradd unsigned int = ax-1 to * * struct Length_String = [bx+2] (used reg = ) |
|
dec ax |
|
shl ax,*1 |
|
add ax,2[bx] |
|
mov bx,ax |
|
! Debug: eq * struct Length_String (temp) = [S+$14-$14] to * struct Length_String = [bx+0] (used reg = ) |
|
mov si,-$12[bp] |
|
mov [bx],si |
|
inc sp |
|
inc sp |
|
!BCC_EOS |
|
! 302 } |
|
! 303 last = i; |
|
.25: |
|
! Debug: eq unsigned int i = [S+$12-8] to unsigned int last = [S+$12-$A] (used reg = ) |
|
mov ax,-6[bp] |
|
mov -8[bp],ax |
|
!BCC_EOS |
|
! 304 } |
|
! 305 ++i; |
|
.23: |
|
! Debug: preinc unsigned int i = [S+$12-8] (used reg = ) |
|
mov ax,-6[bp] |
|
inc ax |
|
mov -6[bp],ax |
|
!BCC_EOS |
|
! 306 } |
|
! 307 if (i > last+1) { |
|
.21: |
|
mov bx,4[bp] |
|
! Debug: lt unsigned int = [bx+2] to unsigned int i = [S+$12-8] (used reg = ) |
|
mov ax,-6[bp] |
|
cmp ax,2[bx] |
|
jb .22 |
|
.27: |
|
.20: |
|
! Debug: add int = const 1 to unsigned int last = [S+$12-$A] (used reg = ) |
|
mov ax,-8[bp] |
|
! Debug: gt unsigned int = ax+1 to unsigned int i = [S+$12-8] (used reg = ) |
|
inc ax |
|
cmp ax,-6[bp] |
|
jae .28 |
|
.29: |
|
! 308 result->strings[insert_index++] = create_length_string(i-(last+k), ((string->chars)+(last+k))); |
|
! Debug: add int k = [S+$12-$12] to unsigned int last = [S+$12-$A] (used reg = ) |
|
mov ax,-8[bp] |
|
add ax,-$10[bp] |
|
mov bx,4[bp] |
|
! Debug: ptradd unsigned int = ax+0 to * char = [bx+4] (used reg = ) |
|
add ax,4[bx] |
|
! Debug: list * char = ax+0 (used reg = ) |
|
push ax |
|
! Debug: add int k = [S+$14-$12] to unsigned int last = [S+$14-$A] (used reg = ) |
|
mov ax,-8[bp] |
|
add ax,-$10[bp] |
|
! Debug: sub unsigned int = ax+0 to unsigned int i = [S+$14-8] (used reg = ) |
|
push ax |
|
mov ax,-6[bp] |
|
sub ax,-$14[bp] |
|
inc sp |
|
inc sp |
|
! Debug: list unsigned int = ax+0 (used reg = ) |
|
push ax |
|
! Debug: func () * struct Length_String = create_length_string+0 (used reg = ) |
|
call _create_length_string |
|
add sp,*4 |
|
push ax |
|
! Debug: postinc unsigned int insert_index = [S+$14-$E] (used reg = ) |
|
mov ax,-$C[bp] |
|
inc ax |
|
mov -$C[bp],ax |
|
mov bx,-$E[bp] |
|
! Debug: ptradd unsigned int = ax-1 to * * struct Length_String = [bx+2] (used reg = ) |
|
dec ax |
|
shl ax,*1 |
|
add ax,2[bx] |
|
mov bx,ax |
|
! Debug: eq * struct Length_String (temp) = [S+$14-$14] to * struct Length_String = [bx+0] (used reg = ) |
|
mov si,-$12[bp] |
|
mov [bx],si |
|
inc sp |
|
inc sp |
|
!BCC_EOS |
|
! 309 } |
|
! 310 |
|
! 311 return result; |
|
.28: |
|
mov ax,-$E[bp] |
|
add sp,*$C |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 312 |
|
! 313 } |
|
! 314 |
|
! 315 String_Array *create_length_string_array(array_size) |
|
! Register BX SI used in function length_string_split |
|
! 316 int array_size; |
|
export _create_length_string_array |
|
_create_length_string_array: |
|
!BCC_EOS |
|
! 317 { |
|
! 318 String_Array *result = malloc(sizeof(String_Array)); |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
dec sp |
|
dec sp |
|
! Debug: list int = const 4 (used reg = ) |
|
mov ax,*4 |
|
push ax |
|
! Debug: func () * void = malloc+0 (used reg = ) |
|
call _malloc |
|
inc sp |
|
inc sp |
|
! Debug: eq * void = ax+0 to * struct String_Array result = [S+8-8] (used reg = ) |
|
mov -6[bp],ax |
|
!BCC_EOS |
|
! 319 result->length = array_size; |
|
mov bx,-6[bp] |
|
! Debug: eq int array_size = [S+8+2] to unsigned int = [bx+0] (used reg = ) |
|
mov ax,4[bp] |
|
mov [bx],ax |
|
!BCC_EOS |
|
! 320 result->strings = malloc(array_size * sizeof(Length_String)); |
|
! Debug: mul int = const 6 to int array_size = [S+8+2] (used reg = ) |
|
mov ax,4[bp] |
|
mov dx,ax |
|
shl ax,*1 |
|
add ax,dx |
|
shl ax,*1 |
|
! Debug: list int = ax+0 (used reg = ) |
|
push ax |
|
! Debug: func () * void = malloc+0 (used reg = ) |
|
call _malloc |
|
inc sp |
|
inc sp |
|
mov bx,-6[bp] |
|
! Debug: eq * void = ax+0 to * * struct Length_String = [bx+2] (used reg = ) |
|
mov 2[bx],ax |
|
!BCC_EOS |
|
! 321 return result; |
|
mov ax,-6[bp] |
|
inc sp |
|
inc sp |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 322 } |
|
! 323 |
|
! 324 |
|
! 325 Length_String *create_length_string(length, chars) |
|
! Register BX used in function create_length_string_array |
|
! 326 unsigned int length; |
|
export _create_length_string |
|
_create_length_string: |
|
!BCC_EOS |
|
! 327 char *chars; |
|
!BCC_EOS |
|
! 328 { |
|
! 329 |
|
! 330 Length_String *legth_string = malloc(sizeof(Length_String)); |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
dec sp |
|
dec sp |
|
! Debug: list int = const 6 (used reg = ) |
|
mov ax,*6 |
|
push ax |
|
! Debug: func () * void = malloc+0 (used reg = ) |
|
call _malloc |
|
inc sp |
|
inc sp |
|
! Debug: eq * void = ax+0 to * struct Length_String legth_string = [S+8-8] (used reg = ) |
|
mov -6[bp],ax |
|
!BCC_EOS |
|
! 331 char *copy = malloc(length + 1); |
|
dec sp |
|
dec sp |
|
! Debug: add int = const 1 to unsigned int length = [S+$A+2] (used reg = ) |
|
mov ax,4[bp] |
|
! Debug: list unsigned int = ax+1 (used reg = ) |
|
inc ax |
|
push ax |
|
! Debug: func () * void = malloc+0 (used reg = ) |
|
call _malloc |
|
inc sp |
|
inc sp |
|
! Debug: eq * void = ax+0 to * char copy = [S+$A-$A] (used reg = ) |
|
mov -8[bp],ax |
|
!BCC_EOS |
|
! 332 memcpy(copy, 0x7e0, chars, 0x7e0, length); |
|
! Debug: list unsigned int length = [S+$A+2] (used reg = ) |
|
push 4[bp] |
|
! Debug: list int = const $7E0 (used reg = ) |
|
mov ax,#$7E0 |
|
push ax |
|
! Debug: list * char chars = [S+$E+4] (used reg = ) |
|
push 6[bp] |
|
! Debug: list int = const $7E0 (used reg = ) |
|
mov ax,#$7E0 |
|
push ax |
|
! Debug: list * char copy = [S+$12-$A] (used reg = ) |
|
push -8[bp] |
|
! Debug: func () void = memcpy+0 (used reg = ) |
|
call _memcpy |
|
add sp,*$A |
|
!BCC_EOS |
|
! 333 copy[length] = '\0'; |
|
! Debug: ptradd unsigned int length = [S+$A+2] to * char copy = [S+$A-$A] (used reg = ) |
|
mov ax,4[bp] |
|
add ax,-8[bp] |
|
mov bx,ax |
|
! Debug: eq int = const 0 to char = [bx+0] (used reg = ) |
|
xor al,al |
|
mov [bx],al |
|
!BCC_EOS |
|
! 334 |
|
! 335 legth_string->dynamic = 1; |
|
mov bx,-6[bp] |
|
! Debug: eq int = const 1 to short = [bx+0] (used reg = ) |
|
mov ax,*1 |
|
mov [bx],ax |
|
!BCC_EOS |
|
! 336 legth_string->length = length; |
|
mov bx,-6[bp] |
|
! Debug: eq unsigned int length = [S+$A+2] to unsigned int = [bx+2] (used reg = ) |
|
mov ax,4[bp] |
|
mov 2[bx],ax |
|
!BCC_EOS |
|
! 337 legth_string->chars = copy; |
|
mov bx,-6[bp] |
|
! Debug: eq * char copy = [S+$A-$A] to * char = [bx+4] (used reg = ) |
|
mov si,-8[bp] |
|
mov 4[bx],si |
|
!BCC_EOS |
|
! 338 |
|
! 339 return legth_string; |
|
mov ax,-6[bp] |
|
add sp,*4 |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 340 # 21 |
|
! 20 "implementation/../main.h" |
|
! 21 } |
|
! 22 # 1 "implementation/../driver/disk.h" |
|
! 1 int data_from_disk(index, number_sectors, data_buffer, data_buffer_segment); |
|
! Register BX SI used in function create_length_string |
|
!BCC_EOS |
|
! 2 int disk_service_read_data_from_disk(index, number_sectors, data_buffer, data_buffer_segment); |
|
!BCC_EOS |
|
! 3 |
|
! 4 int disk_service_read_data_from_disk(index, number_sectors, data_buffer, data_buffer_segment) |
|
! 5 long* index; |
|
export _disk_service_read_data_from_disk |
|
_disk_service_read_data_from_disk: |
|
!BCC_EOS |
|
! 6 long number_sectors; |
|
!BCC_EOS |
|
! 7 void* data_buffer; |
|
!BCC_EOS |
|
! 8 int data_buffer_segment; |
|
!BCC_EOS |
|
! 9 { |
|
! 10 |
|
! 11 #asm |
|
!BCC_ASM |
|
_disk_service_read_data_from_disk.data_buffer set 8 |
|
_disk_service_read_data_from_disk.number_sectors set 4 |
|
_disk_service_read_data_from_disk.data_buffer_segment set $A |
|
_disk_service_read_data_from_disk.index set 2 |
|
|
|
! 13 define number_sectors 8[bp]; |
|
|
|
|
|
|
|
push bp |
|
mov bp,sp |
|
pusha |
|
|
|
lsfs_load_data: |
|
mov ax, 4[bp]; |
|
mov WORD [DAPACK.lba_addr_dw_low], ax |
|
mov bx, 8[bp]; |
|
mov WORD [DAPACK.blkcnt], bx |
|
mov cx, 12[bp]; |
|
mov WORD [DAPACK.db_addr_segment], cx |
|
mov dx, 10[bp]; ; |
|
mov WORD [DAPACK.db_addr_offset], dx |
|
mov si, #DAPACK ; address of |
|
mov ah, #0x42 ; READ |
|
mov dl, [global_disk_identifier] |
|
int #0x13 |
|
;call 0x0000:0x7C2A |
|
popa |
|
pop bp |
|
ret |
|
|
|
|
|
DAPACK: |
|
DAPACK.dap_Size: db 0x10 |
|
DAPACK.rev_byte: db 0x0 |
|
DAPACK.blkcnt: dw 0x0 |
|
DAPACK.db_addr_offset: dw 0x0 |
|
DAPACK.db_addr_segment: dw 0x0 |
|
DAPACK.lba_addr_dw_low: dd 0x0 |
|
DAPACK.lba_addr_dw_high: dd 0x0 |
|
|
|
global_disk_identifier: db 0x80 |
|
|
|
! 51 endasm |
|
!BCC_ENDASM |
|
! 52 } |
|
ret |
|
! 53 # 25 "implementation/../main.h" |
|
! 25 void dump_ax(input); |
|
!BCC_EOS |
|
! 26 void print_stack(argument); |
|
!BCC_EOS |
|
! 27 void print_newline(); |
|
!BCC_EOS |
|
! 28 |
|
! 29 typedef struct struct_partition_control partition_control; |
|
!BCC_EOS |
|
! 30 typedef struct File_System_Control_Information FSCI; |
|
!BCC_EOS |
|
! 31 typedef struct meta_information_format mif; |
|
!BCC_EOS |
|
! 32 typedef struct tag_record tag_record; |
|
!BCC_EOS |
|
! 33 typedef struct Parameter_Struct Parameter_Struct; |
|
!BCC_EOS |
|
! 34 |
|
! 35 |
|
! 36 typedef enum Service_Action |
|
! 37 { |
|
! 38 SERIVCE_LOAD_DISK = 1, |
|
! 39 SERVICE_FIND_ENTRY = 2, |
|
! 40 SERIVCE_READ_DATA = 3, |
|
! 41 SERIVCE_WRITE_DATA = 4, |
|
! 42 |
|
! 43 } Service_Action; |
|
!BCC_EOS |
|
! 44 |
|
! 45 struct File_System_Control_Information |
|
! 46 { |
|
! 47 char filesystem_information[256]; |
|
!BCC_EOS |
|
! 48 long master_table_index[2]; |
|
!BCC_EOS |
|
! 49 long this_partition_offset_on_disk[2]; |
|
!BCC_EOS |
|
! 50 long next_free_sector[2]; |
|
!BCC_EOS |
|
! 51 long next_uniqe_id[2]; |
|
!BCC_EOS |
|
! 52 long next_secto |
|
! 52 r_reuse_pointer[2]; |
|
!BCC_EOS |
|
! 53 long last_sector_index_on_partition[2]; |
|
!BCC_EOS |
|
! 54 long maximum_sectors_on_disk[2]; |
|
!BCC_EOS |
|
! 55 long sector_size_on_disk[2]; |
|
!BCC_EOS |
|
! 56 long not_used[48]; |
|
!BCC_EOS |
|
! 57 |
|
! 58 }; |
|
!BCC_EOS |
|
! 59 |
|
! 60 |
|
! 61 struct Parameter_Struct |
|
! 62 { |
|
! 63 char* path; |
|
!BCC_EOS |
|
! 64 char* new_path; |
|
!BCC_EOS |
|
! 65 int buffer_segment; |
|
!BCC_EOS |
|
! 66 int buffer_address; |
|
!BCC_EOS |
|
! 67 int buffer_size; |
|
!BCC_EOS |
|
! 68 int data_length; |
|
!BCC_EOS |
|
! 69 int byte_offset_into_file; |
|
!BCC_EOS |
|
! 70 short entry_kind; |
|
!BCC_EOS |
|
! 71 }; |
|
!BCC_EOS |
|
! 72 # 5 "implementation/lsfs.h" |
|
! 5 typedef struct lsfs_file lsfs_file; |
|
!BCC_EOS |
|
! 6 typedef struct Directory_Table Directory_Table; |
|
!BCC_EOS |
|
! 7 typedef struct Table_Entry Table_Entry; |
|
!BCC_EOS |
|
! 8 |
|
! 9 int lsfs_disk_getattr(find_file, path); |
|
!BCC_EOS |
|
! 10 int lsfs_disk_read_data_from_file(file, buffer_size, data, offset_to_next_entry); |
|
!BCC_EOS |
|
! 11 Directory_Table* lsfs_find_directory(path, drop_filename); |
|
!BCC_EOS |
|
! 12 |
|
! 13 typedef enum Table_Entry_Kind |
|
! 14 { |
|
! 15 |
|
! 16 ENTRY_EMPTY = 0, |
|
! 17 ENTRY_FILE = 1, |
|
! 18 ENTRY_DIRECTORY = 2, |
|
! 19 } Table_Entry_Kind; |
|
!BCC_EOS |
|
! 20 |
|
! 21 struct Table_Entry |
|
! 22 { |
|
! 23 char filename[256]; |
|
!BCC_EOS |
|
! 24 long file_id[2]; |
|
!BCC_EOS |
|
! 25 long file_size[2]; |
|
!BCC_EOS |
|
! 26 void* ext_file_data_low; |
|
!BCC_EOS |
|
! 27 void* ext_file_data_high; |
|
!BCC_EOS |
|
! 28 long number_sector_s; |
|
!BCC_EOS |
|
! 29 short entry_kind; |
|
!BCC_EOS |
|
! 30 short extra_control_bits1; |
|
!BCC_EOS |
|
! 31 short extra_control_bits2; |
|
!BCC_EOS |
|
! 32 short extra_control_bits3; |
|
!BCC_EOS |
|
! 33 long table_entry_sector_index[2]; |
|
!BCC_EOS |
|
! 34 long data_pointer[27 * 2]; |
|
!BCC_EOS |
|
! 35 }; |
|
!BCC_EOS |
|
! 36 |
|
! 37 struct lsfs_file { |
|
! 38 long file_id[2]; |
|
!BCC_EOS |
|
! 39 long table_entry_pointer[2]; |
|
!BCC_EOS |
|
! 40 Table_Entry_Kind entry_kind; |
|
!BCC_EOS |
|
! 41 char* filename; |
|
!BCC_EOS |
|
! 42 long owner_id; |
|
!BCC_EOS |
|
! 43 long size[2]; |
|
!BCC_EOS |
|
! 44 long creation_date[2]; |
|
!BCC_EOS |
|
! 45 long access_time[2]; |
|
!BCC_EOS |
|
! 46 long modification_time[2]; |
|
!BCC_EOS |
|
! 47 long number_sector; |
|
!BCC_EOS |
|
! 48 long table_entry_sector_index[2]; |
|
!BCC_EOS |
|
! 49 long data_pointer[27 * 2]; |
|
!BCC_EOS |
|
! 50 }; |
|
!BCC_EOS |
|
! 51 |
|
! 52 struct Directory_Table |
|
! 53 { |
|
! 54 Table_Entry entries[16 ]; |
|
!BCC_EOS |
|
! 55 |
|
! 56 }; |
|
!BCC_EOS |
|
! 57 # 3 "implementation/lsfs.c" |
|
! 3 extern FSCI fsci; |
|
!BCC_EOS |
|
! 4 |
|
! 5 int lsfs_disk_getattr(find_file, path) |
|
! 6 lsfs_file* find_file; |
|
export _lsfs_disk_getattr |
|
_lsfs_disk_getattr: |
|
!BCC_EOS |
|
! 7 char* path; |
|
!BCC_EOS |
|
! 8 { |
|
! 9 int i; |
|
!BCC_EOS |
|
! 10 String_Array *split_path = string_split_c(path, '/', 0 ); |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
add sp,*-4 |
|
! Debug: list int = const 0 (used reg = ) |
|
xor ax,ax |
|
push ax |
|
! Debug: list int = const $2F (used reg = ) |
|
mov ax,*$2F |
|
push ax |
|
! Debug: list * char path = [S+$E+4] (used reg = ) |
|
push 6[bp] |
|
! Debug: func () * struct String_Array = string_split_c+0 (used reg = ) |
|
call _string_split_c |
|
add sp,*6 |
|
! Debug: eq * struct String_Array = ax+0 to * struct String_Array split_path = [S+$A-$A] (used reg = ) |
|
mov -8[bp],ax |
|
!BCC_EOS |
|
! 11 Length_String *filename = split_path->strings[split_path->length-1]; |
|
dec sp |
|
dec sp |
|
mov bx,-8[bp] |
|
! Debug: sub int = const 1 to unsigned int = [bx+0] (used reg = ) |
|
mov bx,[bx] |
|
mov si,-8[bp] |
|
! Debug: ptradd unsigned int = bx-1 to * * struct Length_String = [si+2] (used reg = ) |
|
mov ax,bx |
|
dec ax |
|
shl ax,*1 |
|
add ax,2[si] |
|
mov bx,ax |
|
! Debug: eq * struct Length_String = [bx+0] to * struct Length_String filename = [S+$C-$C] (used reg = ) |
|
mov bx,[bx] |
|
mov -$A[bp],bx |
|
!BCC_EOS |
|
! 12 |
|
! 13 |
|
! 14 Directory_Table *dir_table = lsfs_find_directory(path, 1 ); |
|
dec sp |
|
dec sp |
|
! Debug: list int = const 1 (used reg = ) |
|
mov ax,*1 |
|
push ax |
|
! Debug: list * char path = [S+$10+4] (used reg = ) |
|
push 6[bp] |
|
! Debug: func () * struct Directory_Table = lsfs_find_directory+0 (used reg = ) |
|
call _lsfs_find_directory |
|
add sp,*4 |
|
! Debug: eq * struct Directory_Table = ax+0 to * struct Directory_Table dir_table = [S+$E-$E] (used reg = ) |
|
mov -$C[bp],ax |
|
!BCC_EOS |
|
! 15 |
|
! 16 for (i = 0; i < 16 ; ++i) |
|
! Debug: eq int = const 0 to int i = [S+$E-8] (used reg = ) |
|
xor ax,ax |
|
mov -6[bp],ax |
|
!BCC_EOS |
|
!BCC_EOS |
|
! 17 { |
|
br .2C |
|
.2D: |
|
! 18 if(strcmp( filename |
|
! 18 ->chars, dir_table->entries[i].filename ) == 0) { |
|
! Debug: ptradd int i = [S+$E-8] to [$10] struct Table_Entry dir_table = [S+$E-$E] (used reg = ) |
|
mov ax,-6[bp] |
|
mov cx,#$200 |
|
imul cx |
|
add ax,-$C[bp] |
|
mov bx,ax |
|
! Debug: cast * char = const 0 to [$100] char = bx+0 (used reg = ) |
|
! Debug: list * char = bx+0 (used reg = ) |
|
push bx |
|
mov bx,-$A[bp] |
|
! Debug: list * char = [bx+4] (used reg = ) |
|
push 4[bx] |
|
! Debug: func () int = strcmp+0 (used reg = ) |
|
call _strcmp |
|
add sp,*4 |
|
! Debug: logeq int = const 0 to int = ax+0 (used reg = ) |
|
test ax,ax |
|
bne .2E |
|
.2F: |
|
! 19 find_file->file_id[0] = dir_table->entries[i].file_id; |
|
! Debug: ptradd int i = [S+$E-8] to [$10] struct Table_Entry dir_table = [S+$E-$E] (used reg = ) |
|
mov ax,-6[bp] |
|
mov cx,#$200 |
|
imul cx |
|
add ax,-$C[bp] |
|
mov bx,ax |
|
! Debug: ptradd int = const 0 to [2] long find_file = [S+$E+2] (used reg = bx) |
|
mov si,4[bp] |
|
! Debug: eq [2] long = bx+$100 to long = [si+0] (used reg = ) |
|
mov ax,bx |
|
add ax,#$100 |
|
xor bx,bx |
|
mov [si],ax |
|
mov 2[si],bx |
|
!BCC_EOS |
|
! 20 find_file->entry_kind = dir_table->entries[i].entry_kind; |
|
! Debug: ptradd int i = [S+$E-8] to [$10] struct Table_Entry dir_table = [S+$E-$E] (used reg = ) |
|
mov ax,-6[bp] |
|
mov cx,#$200 |
|
imul cx |
|
add ax,-$C[bp] |
|
mov bx,ax |
|
mov si,4[bp] |
|
! Debug: eq short = [bx+$118] to int = [si+$10] (used reg = ) |
|
mov bx,$118[bx] |
|
mov $10[si],bx |
|
!BCC_EOS |
|
! 21 find_file->table_entry_pointer[0] = i; |
|
mov bx,4[bp] |
|
! Debug: ptradd int = const 0 to [2] long = bx+8 (used reg = ) |
|
! Debug: eq int i = [S+$E-8] to long = [bx+8] (used reg = ) |
|
mov ax,-6[bp] |
|
cwd |
|
mov si,dx |
|
mov 8[bx],ax |
|
mov $A[bx],si |
|
!BCC_EOS |
|
! 22 find_file->filename = dir_table->entries[i].filename; |
|
! Debug: ptradd int i = [S+$E-8] to [$10] struct Table_Entry dir_table = [S+$E-$E] (used reg = ) |
|
mov ax,-6[bp] |
|
mov cx,#$200 |
|
imul cx |
|
add ax,-$C[bp] |
|
mov bx,ax |
|
mov si,4[bp] |
|
! Debug: eq [$100] char = bx+0 to * char = [si+$12] (used reg = ) |
|
mov $12[si],bx |
|
!BCC_EOS |
|
! 23 find_file->table_entry_sector_index[0] = dir_table->entries[i].table_entry_sector_index; |
|
! Debug: ptradd int i = [S+$E-8] to [$10] struct Table_Entry dir_table = [S+$E-$E] (used reg = ) |
|
mov ax,-6[bp] |
|
mov cx,#$200 |
|
imul cx |
|
add ax,-$C[bp] |
|
mov bx,ax |
|
mov si,4[bp] |
|
! Debug: ptradd int = const 0 to [2] long = si+$3C (used reg = bx) |
|
! Debug: eq [2] long = bx+$120 to long = [si+$3C] (used reg = ) |
|
mov ax,bx |
|
add ax,#$120 |
|
xor bx,bx |
|
mov $3C[si],ax |
|
mov $3E[si],bx |
|
!BCC_EOS |
|
! 24 find_file->owner_id = 1; |
|
mov bx,4[bp] |
|
! Debug: eq int = const 1 to long = [bx+$14] (used reg = ) |
|
mov ax,*1 |
|
xor si,si |
|
mov $14[bx],ax |
|
mov $16[bx],si |
|
!BCC_EOS |
|
! 25 find_file->size[0] = dir_table->entries[i].file_size; |
|
! Debug: ptradd int i = [S+$E-8] to [$10] struct Table_Entry dir_table = [S+$E-$E] (used reg = ) |
|
mov ax,-6[bp] |
|
mov cx,#$200 |
|
imul cx |
|
add ax,-$C[bp] |
|
mov bx,ax |
|
mov si,4[bp] |
|
! Debug: ptradd int = const 0 to [2] long = si+$18 (used reg = bx) |
|
! Debug: eq [2] long = bx+$108 to long = [si+$18] (used reg = ) |
|
mov ax,bx |
|
add ax,#$108 |
|
xor bx,bx |
|
mov $18[si],ax |
|
mov $1A[si],bx |
|
!BCC_EOS |
|
! 26 find_file->creation_date[0] = 0; |
|
mov bx,4[bp] |
|
! Debug: ptradd int = const 0 to [2] long = bx+$20 (used reg = ) |
|
! Debug: eq int = const 0 to long = [bx+$20] (used reg = ) |
|
xor ax,ax |
|
xor si,si |
|
mov $20[bx],ax |
|
mov $22[bx],si |
|
!BCC_EOS |
|
! 27 find_file->access_time[0] = 0; |
|
mov bx,4[bp] |
|
! Debug: ptradd int = const 0 to [2] long = bx+$28 (used reg = ) |
|
! Debug: eq int = const 0 to long = [bx+$28] (used reg = ) |
|
xor ax,ax |
|
xor si,si |
|
mov $28[bx],ax |
|
mov $2A[bx],si |
|
!BCC_EOS |
|
! 28 find_file->modification_time[0] = 0; |
|
mov bx,4[bp] |
|
! Debug: ptradd int = const 0 to [2] long = bx+$30 (used reg = ) |
|
! Debug: eq int = const 0 to long = [bx+$30] (used reg = ) |
|
xor ax,ax |
|
xor si,si |
|
mov $30[bx],ax |
|
mov $32[bx],si |
|
!BCC_EOS |
|
! 29 memcpy(find_file->data_pointer, dir_table->entries[i].data_pointer, 27 * 8); |
|
! Debug: list int = const $D8 (used reg = ) |
|
mov ax,#$D8 |
|
push ax |
|
! Debug: ptradd int i = [S+$10-8] to [$10] struct Table_Entry dir_table = [S+$10-$E] (used reg = ) |
|
mov ax,-6[bp] |
|
mov cx,#$200 |
|
imul cx |
|
add ax,-$C[bp] |
|
mov bx,ax |
|
! Debug: cast * long = const 0 to [$36] long = bx+$128 (used reg = ) |
|
! Debug: list * long = bx+$128 (used reg = ) |
|
add bx,#$128 |
|
push bx |
|
mov bx,4[bp] |
|
! Debug: cast * long = const 0 to [$36] long = bx+$44 (used reg = ) |
|
! Debug: list * long = bx+$44 (used reg = ) |
|
add bx,*$44 |
|
push bx |
|
! Debug: func () void = memcpy+0 (used reg = ) |
|
call _memcpy |
|
add sp,*6 |
|
!BCC_EOS |
|
! 30 find_file->number_sector = 1; |
|
mov bx,4[bp] |
|
! Debug: eq int = const 1 to long = [bx+$38] (used reg = ) |
|
mov ax,*1 |
|
xor si,si |
|
mov $38[bx],ax |
|
mov $3A[bx],si |
|
!BCC_EOS |
|
! 31 return 1; |
|
mov ax,*1 |
|
add sp,*8 |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 32 } |
|
! 33 } |
|
.2E: |
|
! 34 return 0; |
|
.2B: |
|
! Debug: preinc int i = [S+$E-8] (used reg = ) |
|
mov ax,-6[bp] |
|
inc ax |
|
mov -6[bp],ax |
|
.2C: |
|
! Debug: lt int = const $10 to int i = [S+$E-8] (used reg = ) |
|
mov ax,-6[bp] |
|
cmp ax,*$10 |
|
blt .2D |
|
.31: |
|
.2A: |
|
xor ax,ax |
|
add sp,*8 |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 35 } |
|
! 36 |
|
! 37 Directory_Table* lsfs_find_directory(path, drop_filename) |
|
! Register BX SI used in function lsfs_disk_getattr |
|
! 38 char *path; |
|
export _lsfs_find_directory |
|
_lsfs_find_directory: |
|
!BCC_EOS |
|
! 39 short drop_filename; |
|
!BCC_EOS |
|
! 40 { |
|
! 41 int number_of_traversal; |
|
!BCC_EOS |
|
! 42 int i, j; |
|
!BCC_EOS |
|
! 43 String_Array *split_path; |
|
!BCC_EOS |
|
! 44 Directory_Table *dir_table = calloc(1, sizeof(Directory_Table)); |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
add sp,*-$A |
|
! Debug: list int = const $2000 (used reg = ) |
|
mov ax,#$2000 |
|
push ax |
|
! Debug: list int = const 1 (used reg = ) |
|
mov ax,*1 |
|
push ax |
|
! Debug: func () * void = calloc+0 (used reg = ) |
|
call _calloc |
|
add sp,*4 |
|
! Debug: eq * void = ax+0 to * struct Directory_Table dir_table = [S+$10-$10] (used reg = ) |
|
mov -$E[bp],ax |
|
!BCC_EOS |
|
! 45 |
|
! 46 disk_service_read_data_from_disk(fsci.master_table_index[0], 16 , dir_table, 0x7e0); |
|
! Debug: list int = const $7E0 (used reg = ) |
|
mov ax,#$7E0 |
|
push ax |
|
! Debug: list * struct Directory_Table dir_table = [S+$12-$10] (used reg = ) |
|
push -$E[bp] |
|
! Debug: list int = const $10 (used reg = ) |
|
mov ax,*$10 |
|
push ax |
|
! Debug: list long = [fsci+$100] (used reg = ) |
|
push [_fsci+$102] |
|
push [_fsci+$100] |
|
! Debug: func () int = disk_service_read_data_from_disk+0 (used reg = ) |
|
call _disk_service_read_data_from_disk |
|
add sp,*$A |
|
!BCC_EOS |
|
! 47 split_path = string_split_c(path, '/', 0 ); |
|
! Debug: list int = const 0 (used reg = ) |
|
xor ax,ax |
|
push ax |
|
! Debug: list int = const $2F (used reg = ) |
|
mov ax,*$2F |
|
push ax |
|
! Debug: list * char path = [S+$14+2] (used reg = ) |
|
push 4[bp] |
|
! Debug: func () * struct String_Array = string_split_c+0 (used reg = ) |
|
call _string_split_c |
|
add sp,*6 |
|
! Debug: eq * struct String_Array = ax+0 to * struct String_Array split_path = [S+$10-$E] (used reg = ) |
|
mov -$C[bp],ax |
|
!BCC_EOS |
|
! 48 |
|
! 49 number_of_traversal = split_path->length; |
|
mov bx,-$C[bp] |
|
! Debug: eq unsigned int = [bx+0] to int number_of_traversal = [S+$10-8] (used reg = ) |
|
mov bx,[bx] |
|
mov -6[bp],bx |
|
!BCC_EOS |
|
! 50 |
|
! 51 if (drop_filename) |
|
mov ax,6[bp] |
|
test ax,ax |
|
je .32 |
|
.33: |
|
! 52 { |
|
! 53 number_of_traversal -= 1; |
|
! Debug: subab int = const 1 to int number_of_traversal = [S+$10-8] (used reg = ) |
|
mov ax,-6[bp] |
|
dec ax |
|
mov -6[bp],ax |
|
!BCC_EOS |
|
! 54 } |
|
! 55 |
|
! 56 |
|
! 57 for (i = 0; i < number_of_traversal; ++i) |
|
.32: |
|
! Debug: eq int = const 0 to int i = [S+$10-$A] (used reg = ) |
|
xor ax,ax |
|
mov -8[bp],ax |
|
!BCC_EOS |
|
!BCC_EOS |
|
! 58 { |
|
jmp .36 |
|
.37: |
|
! 59 for (j = 0; j < 16 ; ++j) |
|
! Debug: eq int = const 0 to int j = [S+$10-$C] (used reg = ) |
|
xor ax,ax |
|
mov -$A[bp],ax |
|
!BCC_EOS |
|
!BCC_EOS |
|
! 60 { |
|
jmp .3A |
|
.3B: |
|
! 61 if (strcmp(dir_table->entries[j].filename, split_path->strings[i]->chars) == 0) |
|
mov bx,-$C[bp] |
|
! Debug: ptradd int i = [S+$10-$A] to * * struct Length_String = [bx+2] (used reg = ) |
|
mov ax,-8[bp] |
|
shl ax,*1 |
|
add ax,2[bx] |
|
mov bx,ax |
|
mov bx,[bx] |
|
! Debug: list * char = [bx+4] (used reg = ) |
|
push 4[bx] |
|
! Debug: ptradd int j = [S+$12-$C] to [$10] struct Table_Entry dir_table = [S+$12-$10] (used reg = ) |
|
mov ax,-$A[bp] |
|
mov cx,#$200 |
|
imul cx |
|
add ax,-$E[bp] |
|
mov bx,ax |
|
! Debug: cast * char = const 0 to [$100] char = bx+0 (used reg = ) |
|
! Debug: list * char = bx+0 (used reg = ) |
|
push bx |
|
! Debug: func () int = strcmp+0 (used reg = ) |
|
call _strcmp |
|
add sp,*4 |
|
! Debug: logeq int = const 0 to int = ax+0 (used reg = ) |
|
test ax,ax |
|
jne .3C |
|
.3D: |
|
! 62 { |
|
! 63 int index_sector = dir_table->entries[j].data_pointer[0]; |
|
dec sp |
|
dec sp |
|
! Debug: ptradd int j = [S+$12-$C] to [$10] struct Table_Entry dir_table = [S+$12-$10] (used reg = ) |
|
mov ax,-$A[bp] |
|
mov cx,#$200 |
|
imul cx |
|
add ax,-$E[bp] |
|
mov bx,ax |
|
! Debug: ptradd int = const 0 to [$36] long = bx+$128 (used reg = ) |
|
! Debug: eq long = [bx+$128] to int index_sector = [S+$12-$12] (used reg = ) |
|
mov bx,$128[bx] |
|
mov -$10[bp],bx |
|
!BCC_EOS |
|
! 64 |
|
! 65 disk_service_read_data_from_disk(index_sector, 16 , dir_table); |
|
! Debug: list * struct Directory_Table dir_table = [S+$12-$10] (used reg = ) |
|
push -$E[bp] |
|
! Debug: list int = const $10 (used reg = ) |
|
mov ax,*$10 |
|
push ax |
|
! Debug: list int index_sector = [S+$16-$12] (used reg = ) |
|
push -$10[bp] |
|
! Debug: func () int = disk_service_read_data_from_disk+0 (used reg = ) |
|
call _disk_service_read_data_from_disk |
|
add sp,*6 |
|
!BCC_EOS |
|
! 66 break; |
|
inc sp |
|
inc sp |
|
jmp .38 |
|
!BCC_EOS |
|
! 67 } |
|
inc sp |
|
inc sp |
|
! 68 } |
|
.3C: |
|
! 69 } |
|
.39: |
|
! Debug: preinc int j = [S+$10-$C] (used reg = ) |
|
mov ax,-$A[bp] |
|
inc ax |
|
mov -$A[bp],ax |
|
.3A: |
|
! Debug: lt int = const $10 to int j = [S+$10-$C] (used reg = ) |
|
mov ax,-$A[bp] |
|
cmp ax,*$10 |
|
jl .3B |
|
.3E: |
|
.38: |
|
! 70 return dir_table; |
|
.35: |
|
! Debug: preinc int i = [S+$10-$A] (used reg = ) |
|
mov ax,-8[bp] |
|
inc ax |
|
mov -8[bp],ax |
|
.36: |
|
! Debug: lt int number_of_traversal = [S+$10-8] to int i = [S+$10-$A] (used reg = ) |
|
mov ax,-8[bp] |
|
cmp ax,-6[bp] |
|
jl .37 |
|
.3F: |
|
.34: |
|
mov ax,-$E[bp] |
|
add sp,*$A |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 71 } |
|
! 72 |
|
! 73 int lsfs_disk_read_data_from_file(file, buffer_size, data, offset_to_next_entry, data_segment) |
|
! Register BX used in function lsfs_find_directory |
|
! 74 lsfs_file *file; |
|
export _lsfs_disk_read_data_from_file |
|
_lsfs_disk_read_data_from_file: |
|
!BCC_EOS |
|
! 75 int buffer_size; |
|
!BCC_EOS |
|
! 76 char *data; |
|
!BCC_EOS |
|
! 77 long offset_to_next_entry; |
|
!BCC_EOS |
|
! 78 unsigned int data_segment; |
|
!BCC_EOS |
|
! 79 { |
|
! 80 int integer_file_size = file->size; |
|
push bp |
|
mov bp,sp |
|
push di |
|
push si |
|
dec sp |
|
dec sp |
|
mov bx,4[bp] |
|
! Debug: eq [2] long = bx+$18 to int integer_file_size = [S+8-8] (used reg = ) |
|
add bx,*$18 |
|
mov -6[bp],bx |
|
!BCC_EOS |
|
! 81 int integer_o |
|
! 81 ffset = offset_to_next_entry; |
|
dec sp |
|
dec sp |
|
! Debug: eq long offset_to_next_entry = [S+$A+8] to int integer_offset = [S+$A-$A] (used reg = ) |
|
mov ax,$A[bp] |
|
mov -8[bp],ax |
|
!BCC_EOS |
|
! 82 int integer_datapointer = 0; |
|
dec sp |
|
dec sp |
|
! Debug: eq int = const 0 to int integer_datapointer = [S+$C-$C] (used reg = ) |
|
xor ax,ax |
|
mov -$A[bp],ax |
|
!BCC_EOS |
|
! 83 int data_length = integer_file_size - integer_offset; |
|
dec sp |
|
dec sp |
|
! Debug: sub int integer_offset = [S+$E-$A] to int integer_file_size = [S+$E-8] (used reg = ) |
|
mov ax,-6[bp] |
|
sub ax,-8[bp] |
|
! Debug: eq int = ax+0 to int data_length = [S+$E-$E] (used reg = ) |
|
mov -$C[bp],ax |
|
!BCC_EOS |
|
! 84 int amount_read = 0; |
|
dec sp |
|
dec sp |
|
! Debug: eq int = const 0 to int amount_read = [S+$10-$10] (used reg = ) |
|
xor ax,ax |
|
mov -$E[bp],ax |
|
!BCC_EOS |
|
! 85 int amount_to_read = 0; |
|
dec sp |
|
dec sp |
|
! Debug: eq int = const 0 to int amount_to_read = [S+$12-$12] (used reg = ) |
|
xor ax,ax |
|
mov -$10[bp],ax |
|
!BCC_EOS |
|
! 86 int remaining_offset = offset_to_next_entry; |
|
dec sp |
|
dec sp |
|
! Debug: eq long offset_to_next_entry = [S+$14+8] to int remaining_offset = [S+$14-$14] (used reg = ) |
|
mov ax,$A[bp] |
|
mov -$12[bp],ax |
|
!BCC_EOS |
|
! 87 |
|
! 88 |
|
! 89 |
|
! 90 |
|
! 91 |
|
! 92 int data_pointer_index = 0; |
|
dec sp |
|
dec sp |
|
! Debug: eq int = const 0 to int data_pointer_index = [S+$16-$16] (used reg = ) |
|
xor ax,ax |
|
mov -$14[bp],ax |
|
!BCC_EOS |
|
! 93 |
|
! 94 if (data_length > buffer_size) |
|
! Debug: gt int buffer_size = [S+$16+4] to int data_length = [S+$16-$E] (used reg = ) |
|
mov ax,-$C[bp] |
|
cmp ax,6[bp] |
|
jle .40 |
|
.41: |
|
! 95 { |
|
! 96 data_length = buffer_size; |
|
! Debug: eq int buffer_size = [S+$16+4] to int data_length = [S+$16-$E] (used reg = ) |
|
mov ax,6[bp] |
|
mov -$C[bp],ax |
|
!BCC_EOS |
|
! 97 } |
|
! 98 |
|
! 99 while(data_length > 0) |
|
.40: |
|
! 100 { |
|
br .43 |
|
.44: |
|
! 101 |
|
! 102 if (remaining_offset == 0) |
|
! Debug: logeq int = const 0 to int remaining_offset = [S+$16-$14] (used reg = ) |
|
mov ax,-$12[bp] |
|
test ax,ax |
|
bne .45 |
|
.46: |
|
! 103 { |
|
! 104 char *tmp_buffer = calloc(4 , 512 ); |
|
dec sp |
|
dec sp |
|
! Debug: list int = const $200 (used reg = ) |
|
mov ax,#$200 |
|
push ax |
|
! Debug: list int = const 4 (used reg = ) |
|
mov ax,*4 |
|
push ax |
|
! Debug: func () * void = calloc+0 (used reg = ) |
|
call _calloc |
|
add sp,*4 |
|
! Debug: eq * void = ax+0 to * char tmp_buffer = [S+$18-$18] (used reg = ) |
|
mov -$16[bp],ax |
|
!BCC_EOS |
|
! 105 |
|
! 106 |
|
! 107 if (data_length < (4 * 512 )) |
|
! Debug: lt int = const $800 to int data_length = [S+$18-$E] (used reg = ) |
|
mov ax,-$C[bp] |
|
cmp ax,#$800 |
|
jge .47 |
|
.48: |
|
! 108 { |
|
! 109 amount_to_read = data_length; |
|
! Debug: eq int data_length = [S+$18-$E] to int amount_to_read = [S+$18-$12] (used reg = ) |
|
mov ax,-$C[bp] |
|
mov -$10[bp],ax |
|
!BCC_EOS |
|
! 110 } |
|
! 111 else |
|
! 112 { |
|
jmp .49 |
|
.47: |
|
! 113 amount_to_read = (4 * 512 ); |
|
! Debug: eq int = const $800 to int amount_to_read = [S+$18-$12] (used reg = ) |
|
mov ax,#$800 |
|
mov -$10[bp],ax |
|
!BCC_EOS |
|
! 114 } |
|
! 115 |
|
! 116 integer_datapointer = file->data_pointer[data_pointer_index]; |
|
.49: |
|
mov bx,4[bp] |
|
! Debug: ptradd int data_pointer_index = [S+$18-$16] to [$36] long = bx+$44 (used reg = ) |
|
mov ax,-$14[bp] |
|
shl ax,*1 |
|
shl ax,*1 |
|
add bx,ax |
|
! Debug: eq long = [bx+$44] to int integer_datapointer = [S+$18-$C] (used reg = ) |
|
mov bx,$44[bx] |
|
mov -$A[bp],bx |
|
!BCC_EOS |
|
! 117 if (integer_datapointer == 0) |
|
! Debug: logeq int = const 0 to int integer_datapointer = [S+$18-$C] (used reg = ) |
|
mov ax,-$A[bp] |
|
test ax,ax |
|
jne .4A |
|
.4B: |
|
! 118 { |
|
! 119 break; |
|
inc sp |
|
inc sp |
|
br .42 |
|
!BCC_EOS |
|
! 120 } |
|
! 121 disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], 4 , tmp_buffer, 0x7e0); |
|
.4A: |
|
! Debug: list int = const $7E0 (used reg = ) |
|
mov ax,#$7E0 |
|
push ax |
|
! Debug: list * char tmp_buffer = [S+$1A-$18] (used reg = ) |
|
push -$16[bp] |
|
! Debug: list int = const 4 (used reg = ) |
|
mov ax,*4 |
|
push ax |
|
mov bx,4[bp] |
|
! Debug: ptradd int data_pointer_index = [S+$1E-$16] to [$36] long = bx+$44 (used reg = ) |
|
mov ax,-$14[bp] |
|
shl ax,*1 |
|
shl ax,*1 |
|
add bx,ax |
|
! Debug: list long = [bx+$44] (used reg = ) |
|
push $46[bx] |
|
push $44[bx] |
|
! Debug: func () int = disk_service_read_data_from_disk+0 (used reg = ) |
|
call _disk_service_read_data_from_disk |
|
add sp,*$A |
|
!BCC_EOS |
|
! 122 memcpy((data + amount_read), data_segment, tmp_buffer, 0x7e0, amount_to_read); |
|
! Debug: list int amount_to_read = [S+$18-$12] (used reg = ) |
|
push -$10[bp] |
|
! Debug: list int = const $7E0 (used reg = ) |
|
mov ax,#$7E0 |
|
push ax |
|
! Debug: list * char tmp_buffer = [S+$1C-$18] (used reg = ) |
|
push -$16[bp] |
|
! Debug: list unsigned int data_segment = [S+$1E+$C] (used reg = ) |
|
push $E[bp] |
|
! Debug: ptradd int amount_read = [S+$20-$10] to * char data = [S+$20+6] (used reg = ) |
|
mov ax,-$E[bp] |
|
add ax,8[bp] |
|
! Debug: list * char = ax+0 (used reg = ) |
|
push ax |
|
! Debug: func () void = memcpy+0 (used reg = ) |
|
call _memcpy |
|
add sp,*$A |
|
!BCC_EOS |
|
! 123 data_length -= amount_to_read; |
|
! Debug: subab int amount_to_read = [S+$18-$12] to int data_length = [S+$18-$E] (used reg = ) |
|
mov ax,-$C[bp] |
|
sub ax,-$10[bp] |
|
mov -$C[bp],ax |
|
!BCC_EOS |
|
! 124 amount_read += amount_to_read; |
|
! Debug: addab int amount_to_read = [S+$18-$12] to int amount_read = [S+$18-$10] (used reg = ) |
|
mov ax,-$E[bp] |
|
add ax,-$10[bp] |
|
mov -$E[bp],ax |
|
!BCC_EOS |
|
! 125 data_pointer_index = data_pointer_index + 2; |
|
! Debug: add int = const 2 to int data_pointer_index = [S+$18-$16] (used reg = ) |
|
mov ax,-$14[bp] |
|
! Debug: eq int = ax+2 to int data_pointer_index = [S+$18-$16] (used reg = ) |
|
inc ax |
|
inc ax |
|
mov -$14[bp],ax |
|
!BCC_EOS |
|
! 126 |
|
! 127 } |
|
inc sp |
|
inc sp |
|
! 128 else if (remaining_offset < (4 * 512 )) |
|
br .4C |
|
.45: |
|
! Debug: lt int = const $800 to int remaining_offset = [S+$16-$14] (used reg = ) |
|
mov ax,-$12[bp] |
|
cmp ax,#$800 |
|
bge .4D |
|
.4E: |
|
! 129 { |
|
! 130 char *tmp_buffer = calloc(1, (4 * 512 )); |
|
dec sp |
|
dec sp |
|
! Debug: list int = const $800 (used reg = ) |
|
mov ax,#$800 |
|
push ax |
|
! Debug: list int = const 1 (used reg = ) |
|
mov ax,*1 |
|
push ax |
|
! Debug: func () * void = calloc+0 (used reg = ) |
|
call _calloc |
|
add sp,*4 |
|
! Debug: eq * void = ax+0 to * char tmp_buffer = [S+$18-$18] (used reg = ) |
|
mov -$16[bp],ax |
|
!BCC_EOS |
|
! 131 |
|
! 132 |
|
! 133 if (data_length < ((4 * 512 ) - remaining_offset) ) |
|
! Debug: sub int remaining_offset = [S+$18-$14] to int = const $800 (used reg = ) |
|
mov ax,#$800 |
|
sub ax,-$12[bp] |
|
! Debug: lt int = ax+0 to int data_length = [S+$18-$E] (used reg = ) |
|
cmp ax,-$C[bp] |
|
jle .4F |
|
.50: |
|
! 134 { |
|
! 135 amount_to_read = data_length; |
|
! Debug: eq int data_length = [S+$18-$E] to int amount_to_read = [S+$18-$12] (used reg = ) |
|
mov ax,-$C[bp] |
|
mov -$10[bp],ax |
|
!BCC_EOS |
|
! 136 } |
|
! 137 else |
|
! 138 { |
|
jmp .51 |
|
.4F: |
|
! 139 amount_to_read = ((4 * 512 ) - remaining_offset); |
|
! Debug: sub int remaining_offset = [S+$18-$14] to int = const $800 (used reg = ) |
|
mov ax,#$800 |
|
sub ax,-$12[bp] |
|
! Debug: eq int = ax+0 to int amount_to_read = [S+$18-$12] (used reg = ) |
|
mov -$10[bp],ax |
|
!BCC_EOS |
|
! 140 } |
|
! 141 |
|
! 142 disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], 4 , tmp_buffer, 0x7e0); |
|
.51: |
|
! Debug: list int = const $7E0 (used reg = ) |
|
mov ax,#$7E0 |
|
push ax |
|
! Debug: list * char tmp_buffer = [S+$1A-$18] (used reg = ) |
|
push -$16[bp] |
|
! Debug: list int = const 4 (used reg = ) |
|
mov ax,*4 |
|
push ax |
|
mov bx,4[bp] |
|
! Debug: ptradd int data_pointer_index = [S+$1E-$16] to [$36] long = bx+$44 (used reg = ) |
|
mov ax,-$14[bp] |
|
shl ax,*1 |
|
shl ax,*1 |
|
add bx,ax |
|
! Debug: list long = [bx+$44] (used reg = ) |
|
push $46[bx] |
|
push $44[bx] |
|
! Debug: func () int = disk_service_read_data_from_disk+0 (used reg = ) |
|
call _disk_service_read_data_from_disk |
|
add sp,*$A |
|
!BCC_EOS |
|
! 143 |
|
! 144 memcpy(data, data_segment, (tmp_buffer + remaining_offset), 0x7e0, amount_to_read); |
|
! Debug: list int amount_to_read = [S+$18-$12] (used reg = ) |
|
push -$10[bp] |
|
! Debug: list int = const $7E0 (used reg = ) |
|
mov ax,#$7E0 |
|
push ax |
|
! Debug: ptradd int remaining_offset = [S+$1C-$14] to * char tmp_buffer = [S+$1C-$18] (used reg = ) |
|
mov ax,-$12[bp] |
|
add ax,-$16[bp] |
|
! Debug: list * char = ax+0 (used reg = ) |
|
push ax |
|
! Debug: list unsigned int data_segment = [S+$1E+$C] (used reg = ) |
|
push $E[bp] |
|
! Debug: list * char data = [S+$20+6] (used reg = ) |
|
push 8[bp] |
|
! Debug: func () void = memcpy+0 (used reg = ) |
|
call _memcpy |
|
add sp,*$A |
|
!BCC_EOS |
|
! 145 data_length -= amount_to_read; |
|
! Debug: subab int amount_to_read = [S+$18-$12] to int data_length = [S+$18-$E] (used reg = ) |
|
mov ax,-$C[bp] |
|
sub ax,-$10[bp] |
|
mov -$C[bp],ax |
|
!BCC_EOS |
|
! 146 amount_read += amount_to_read; |
|
! Debug: addab int amount_to_read = [S+$18-$12] to int amount_read = [S+$18-$10] (used reg = ) |
|
mov ax,-$E[bp] |
|
add ax,-$10[bp] |
|
mov -$E[bp],ax |
|
!BCC_EOS |
|
! 147 remaining_offset -= amount_to_read; |
|
! Debug: subab int amount_to_read = [S+$18-$12] to int remaining_offset = [S+$18-$14] (used reg = ) |
|
mov ax,-$12[bp] |
|
sub ax,-$10[bp] |
|
mov -$12[bp],ax |
|
!BCC_EOS |
|
! 148 |
|
! 149 data_pointer_index = data_ |
|
! 149 pointer_index + 2; |
|
! Debug: add int = const 2 to int data_pointer_index = [S+$18-$16] (used reg = ) |
|
mov ax,-$14[bp] |
|
! Debug: eq int = ax+2 to int data_pointer_index = [S+$18-$16] (used reg = ) |
|
inc ax |
|
inc ax |
|
mov -$14[bp],ax |
|
!BCC_EOS |
|
! 150 |
|
! 151 } |
|
inc sp |
|
inc sp |
|
! 152 else |
|
! 153 { |
|
jmp .52 |
|
.4D: |
|
! 154 |
|
! 155 remaining_offset -= (4 * 512 ); |
|
! Debug: subab int = const $800 to int remaining_offset = [S+$16-$14] (used reg = ) |
|
mov ax,-$12[bp] |
|
add ax,#-$800 |
|
mov -$12[bp],ax |
|
!BCC_EOS |
|
! 156 data_pointer_index++; |
|
! Debug: postinc int data_pointer_index = [S+$16-$16] (used reg = ) |
|
mov ax,-$14[bp] |
|
inc ax |
|
mov -$14[bp],ax |
|
!BCC_EOS |
|
! 157 } |
|
! 158 |
|
! 159 } |
|
.52: |
|
.4C: |
|
! 160 # 164 |
|
! 164 |
|
! 165 return amount_read; |
|
.43: |
|
! Debug: gt int = const 0 to int data_length = [S+$16-$E] (used reg = ) |
|
mov ax,-$C[bp] |
|
test ax,ax |
|
bgt .44 |
|
.53: |
|
.42: |
|
mov ax,-$E[bp] |
|
add sp,*$10 |
|
pop si |
|
pop di |
|
pop bp |
|
ret |
|
!BCC_EOS |
|
! 166 |
|
! 167 } |
|
! 168 |
|
! Register BX used in function lsfs_disk_read_data_from_file |
|
.data |
|
.bss |
|
|
|
! 0 errors detected
|
|
|