Browse Source

Lost work

pull/2/head
Jørn Guldberg 6 years ago
parent
commit
8adca8f575
  1. BIN
      disk.out
  2. 2
      driver/disk.h
  3. 10
      implementation/lsfs.c
  4. 25
      main.c
  5. 11
      main.h
  6. 288
      main.s

BIN
disk.out

Binary file not shown.

2
driver/disk.h

@ -9,7 +9,7 @@ unsigned int data_buffer_segment;
{ {
#asm #asm
#define index 4[bp]; // Note that this is a 32-bit argument. #define index 4[bp]; /* Note that this is a 32-bit argument. */
#define number_sectors 8[bp]; #define number_sectors 8[bp];
#define data_buffer 12[bp]; #define data_buffer 12[bp];
#define data_buffer_segment 14[bp]; #define data_buffer_segment 14[bp];

10
implementation/lsfs.c

@ -43,7 +43,7 @@ short drop_filename;
String_Array *split_path; String_Array *split_path;
Directory_Table *dir_table = calloc(1, sizeof(Directory_Table)); Directory_Table *dir_table = calloc(1, sizeof(Directory_Table));
/* printf("Table index: %lu \n",fsci.master_table_index ); */ /* printf("Table index: %lu \n",fsci.master_table_index ); */
disk_service_read_data_from_disk(fsci.master_table_index[0], DEFAULT_TABLE_SIZE, dir_table, 0x7e0); disk_service_read_data_from_disk(fsci.master_table_index[0], DEFAULT_TABLE_SIZE, dir_table, 0x50);
split_path = string_split_c(path, '/', false); split_path = string_split_c(path, '/', false);
number_of_traversal = split_path->length; number_of_traversal = split_path->length;
@ -118,10 +118,10 @@ unsigned int data_segment;
{ {
break; break;
} }
disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer, 0x7e0); disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer, 0x50);
print_newline(); print_newline();
print_newline(); print_newline();
memcpy((data + amount_read), data_segment, tmp_buffer, 0x7e0, amount_to_read); memcpy((data + amount_read), data_segment, tmp_buffer, 0x50, amount_to_read);
data_length -= amount_to_read; data_length -= amount_to_read;
amount_read += amount_to_read; amount_read += amount_to_read;
data_pointer_index = data_pointer_index + 2; /* Rember that we only use 32-bit, and thats why we jump to at a time*/ data_pointer_index = data_pointer_index + 2; /* Rember that we only use 32-bit, and thats why we jump to at a time*/
@ -141,9 +141,9 @@ unsigned int data_segment;
amount_to_read = ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - remaining_offset); amount_to_read = ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - remaining_offset);
} }
disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer, 0x7e0); disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer, 0x50);
memcpy(data, data_segment, (tmp_buffer + remaining_offset), 0x7e0, amount_to_read); memcpy(data, data_segment, (tmp_buffer + remaining_offset), 0x50, amount_to_read);
data_length -= amount_to_read; data_length -= amount_to_read;
amount_read += amount_to_read; amount_read += amount_to_read;
remaining_offset -= amount_to_read; remaining_offset -= amount_to_read;

25
main.c

@ -13,7 +13,7 @@ void* pointer_parameter_struct;
Service_Action service_action; Service_Action service_action;
Directory_Table current_table; Directory_Table current_table;
Parameter_Struct parameter_struct; Parameter_Struct parameter_struct;
int local_segment = 0x7e0; int local_segment = 0x50;
unsigned int heap_start = 0x2200; unsigned int heap_start = 0x2200;
unsigned int heap_end = 0xffff; unsigned int heap_end = 0xffff;
int stack_segment = 0x8fc0; int stack_segment = 0x8fc0;
@ -80,16 +80,13 @@ void* pointer_parameter_struct;
find_file = calloc(sizeof(lsfs_file), 1); find_file = calloc(sizeof(lsfs_file), 1);
lsfs_disk_getattr(find_file, local_path, fsci); lsfs_disk_getattr(find_file, local_path, fsci);
print_newline(); print_newline();
print("Loding SingOS kernel: "); print("Buffer_address: ");
print(find_file->filename); dump_ax(parameter_struct.buffer_address);
print_newline(); print_newline();
print("Kernel file id: "); print("Buffer_segmnent: ");
print_newline(); dump_ax(parameter_struct.buffer_segment);
print("Kernel file size: ");
print_newline();
print("Kernel first data pointer: ");
lsfs_disk_read_data_from_file(find_file, 0xffff, 0x00, (long) 0x0, 0x50); lsfs_disk_read_data_from_file(find_file, parameter_struct.buffer_size, parameter_struct.buffer_address, (long) 0x0, parameter_struct.buffer_segment);
} break; } break;
@ -110,9 +107,17 @@ void* pointer_parameter_struct;
{ {
print("Hit WRITE case"); print("Hit WRITE case");
} break; } break;
case SERIVCE_WRITE_FS_INFO:
{
print_newline();
print(fsci->filesystem_information);
print_newline();
} break;
default: default:
{ {
print("Default case"); print("Default case: ");
dump_ax(service_action);
} }
} }

11
main.h

@ -38,6 +38,7 @@ typedef enum Service_Action
SERVICE_FIND_ENTRY = 2, SERVICE_FIND_ENTRY = 2,
SERIVCE_READ_DATA = 3, SERIVCE_READ_DATA = 3,
SERIVCE_WRITE_DATA = 4, SERIVCE_WRITE_DATA = 4,
SERIVCE_WRITE_FS_INFO = 10,
} Service_Action; } Service_Action;
@ -61,11 +62,11 @@ struct Parameter_Struct
{ {
char* path; char* path;
char* new_path; char* new_path;
int buffer_segment; unsigned int buffer_segment;
int buffer_address; unsigned int buffer_address;
int buffer_size; unsigned int buffer_size;
int data_length; unsigned int data_length;
int byte_offset_into_file; unsigned int byte_offset_into_file;
short entry_kind; short entry_kind;
}; };

288
main.s

@ -1422,10 +1422,7 @@ _disk_service_read_data_from_disk.data_buffer set $A
_disk_service_read_data_from_disk.number_sectors set 6 _disk_service_read_data_from_disk.number_sectors set 6
_disk_service_read_data_from_disk.data_buffer_segment set $C _disk_service_read_data_from_disk.data_buffer_segment set $C
_disk_service_read_data_from_disk.index set 2 _disk_service_read_data_from_disk.index set 2
! 12 16
! 13 define number_sectors 8[bp];
push bp push bp
mov bp,sp mov bp,sp
@ -1489,59 +1486,60 @@ ret
! 38 SERVICE_FIND_ENTRY = 2, ! 38 SERVICE_FIND_ENTRY = 2,
! 39 SERIVCE_READ_DATA = 3, ! 39 SERIVCE_READ_DATA = 3,
! 40 SERIVCE_WRITE_DATA = 4, ! 40 SERIVCE_WRITE_DATA = 4,
! 41 ! 41 SERIVCE_WRITE_FS_INFO = 10,
! 42 } Service_Action; ! 42
! 43 } Service_Action;
!BCC_EOS !BCC_EOS
! 43 ! 44
! 44 struct File_System_Control_Information ! 45 struct File_System_Control_Information
! 45 { ! 46 {
! 46 char filesystem_information[256]; ! 47 char filesystem_information[256];
!BCC_EOS !BCC_EOS
! 47 long master_table_index[2]; ! 48 long master_table_index[2];
!BCC_EOS !BCC_EOS
! 48 long this_partition_offset_on_disk[2]; ! 49 long this_partition_offset_on_disk[2];
!BCC_EOS !BCC_EOS
! 49 long next_free_sector[2 ! 50 long next_free_sector[2];
! 49 ];
!BCC_EOS !BCC_EOS
! 50 long next_uniqe_id[2]; ! 51
! 51 long next_uniqe_id[2];
!BCC_EOS !BCC_EOS
! 51 long next_sector_reuse_pointer[2]; ! 52 long next_sector_reuse_pointer[2];
!BCC_EOS !BCC_EOS
! 52 long last_sector_index_on_partition[2]; ! 53 long last_sector_index_on_partition[2];
!BCC_EOS !BCC_EOS
! 53 long maximum_sectors_on_disk[2]; ! 54 long maximum_sectors_on_disk[2];
!BCC_EOS !BCC_EOS
! 54 long sector_size_on_disk[2]; ! 55 long sector_size_on_disk[2];
!BCC_EOS !BCC_EOS
! 55 long not_used[48]; ! 56 long not_used[48];
!BCC_EOS !BCC_EOS
! 56 ! 57
! 57 }; ! 58 };
!BCC_EOS !BCC_EOS
! 58
! 59 ! 59
! 60 struct Parameter_Struct ! 60
! 61 { ! 61 struct Parameter_Struct
! 62 char* path; ! 62 {
! 63 char* path;
!BCC_EOS !BCC_EOS
! 63 char* new_path; ! 64 char* new_path;
!BCC_EOS !BCC_EOS
! 64 int buffer_segment; ! 65 unsigned int buffer_segment;
!BCC_EOS !BCC_EOS
! 65 int buffer_address; ! 66 unsigned int buffer_address;
!BCC_EOS !BCC_EOS
! 66 int buffer_size; ! 67 unsigned int buffer_size;
!BCC_EOS !BCC_EOS
! 67 int data_length; ! 68 unsigned int data_length;
!BCC_EOS !BCC_EOS
! 68 int byte_offset_into_file; ! 69 unsigned int byte_offset_into_file;
!BCC_EOS !BCC_EOS
! 69 short entry_kind; ! 70 short entry_kind;
!BCC_EOS !BCC_EOS
! 70 }; ! 71 };
!BCC_EOS !BCC_EOS
! 71 # 6 "implementation/lsfs.h" ! 72 # 6 "implementation/lsfs.h"
! 6 typedef struct lsfs_file lsfs_file; ! 6 typedef struct lsfs_file lsfs_file;
!BCC_EOS !BCC_EOS
! 7 typedef struct Directory_Table Directory_Table; ! 7 typedef struct Directory_Table Directory_Table;
@ -1681,10 +1679,10 @@ mov -$A[bp],bx
!BCC_EOS !BCC_EOS
! 83 ! 83
! 84 ! 84
! 85 Directory_Table *dir_table = lsfs_find_directory(pa ! 85 Directory
! 85 _Table *dir_table = lsfs_find_directory(path, 1 , fsci);
dec sp dec sp
dec sp dec sp
! 85 th, 1 , fsci);
! Debug: list * struct File_System_Control_Information fsci = [S+$E+6] (used reg = ) ! Debug: list * struct File_System_Control_Information fsci = [S+$E+6] (used reg = )
push 8[bp] push 8[bp]
! Debug: list int = const 1 (used reg = ) ! Debug: list int = const 1 (used reg = )
@ -2144,8 +2142,9 @@ mov -6[bp],ax
! 146 } ! 146 }
! 147 ! 147
! 148 ! 148
! 149 for (i = 0; i < number_of_traversal; ++i) ! 149 for (i =
.38: .38:
! 149 0; i < number_of_traversal; ++i)
! Debug: eq int = const 0 to int i = [S+$10-$A] (used reg = ) ! Debug: eq int = const 0 to int i = [S+$10-$A] (used reg = )
xor ax,ax xor ax,ax
mov -8[bp],ax mov -8[bp],ax
@ -2154,8 +2153,7 @@ mov -8[bp],ax
! 150 { ! 150 {
br .3C br .3C
.3D: .3D:
! 151 ! 151 for (j = 0; j < 16 ; ++j)
! 151 for (j = 0; j < 16 ; ++j)
! Debug: eq int = const 0 to int j = [S+$10-$C] (used reg = ) ! Debug: eq int = const 0 to int j = [S+$10-$C] (used reg = )
xor ax,ax xor ax,ax
mov -$A[bp],ax mov -$A[bp],ax
@ -2520,6 +2518,7 @@ br .4A
call _print_newline call _print_newline
!BCC_EOS !BCC_EOS
! 225 dump_ax(file->data_pointer[data_pointer_index]); ! 225 dump_ax(file->data_pointer[data_pointer_index]);
! 225
mov bx,4[bp] mov bx,4[bp]
! Debug: ptradd int data_pointer_index = [S+$1A-$18] to [$36] long = bx+$44 (used reg = ) ! Debug: ptradd int data_pointer_index = [S+$1A-$18] to [$36] long = bx+$44 (used reg = )
mov ax,-$16[bp] mov ax,-$16[bp]
@ -2537,8 +2536,7 @@ add sp,*4
! Debug: func () void = print_newline+0 (used reg = ) ! Debug: func () void = print_newline+0 (used reg = )
call _print_newline call _print_newline
!BCC_EOS !BCC_EOS
! 227 ! 227 next_data = data + amount_read;
! 227 next_data = data + amount_read;
! Debug: ptradd unsigned int amount_read = [S+$1A-$10] to * char data = [S+$1A+6] (used reg = ) ! Debug: ptradd unsigned int amount_read = [S+$1A-$10] to * char data = [S+$1A+6] (used reg = )
mov ax,-$E[bp] mov ax,-$E[bp]
add ax,8[bp] add ax,8[bp]
@ -2802,14 +2800,14 @@ _main:
!BCC_EOS !BCC_EOS
! 15 Parameter_Struct parameter_struct; ! 15 Parameter_Struct parameter_struct;
!BCC_EOS !BCC_EOS
! 16 int local_segment = 0x7e0; ! 16 int local_segment = 0x50;
push bp push bp
mov bp,sp mov bp,sp
push di push di
push si push si
add sp,#-$2014 add sp,#-$2014
! Debug: eq int = const $7E0 to int local_segment = [S+$201A-$201A] (used reg = ) ! Debug: eq int = const $50 to int local_segment = [S+$201A-$201A] (used reg = )
mov ax,#$7E0 mov ax,*$50
mov -$2018[bp],ax mov -$2018[bp],ax
!BCC_EOS !BCC_EOS
! 17 unsigned int heap_start = 0x2200; ! 17 unsigned int heap_start = 0x2200;
@ -2864,12 +2862,12 @@ mov ax,4[bp]
mov -6[bp],ax mov -6[bp],ax
!BCC_EOS !BCC_EOS
! 26 ! 26
! 27
! 27 switch (service_action) ! 27 switch (service_action)
mov ax,-6[bp] mov ax,-6[bp]
! 28 { ! 28 {
br .5E br .5E
! 29 ! 29 case SERIVCE_LOAD_DISK:
! 29 case SERIVCE_LOAD_DISK:
! 30 { ! 30 {
.5F: .5F:
! 31 ! 31
@ -3149,7 +3147,7 @@ add sp,*6
! Debug: func () void = print_newline+0 (used reg = ) ! Debug: func () void = print_newline+0 (used reg = )
call _print_newline call _print_newline
!BCC_EOS !BCC_EOS
! 83 print("Loding SingOS kernel: "); ! 83 print("Buffer_address: ");
! Debug: list * char = .67+0 (used reg = ) ! Debug: list * char = .67+0 (used reg = )
mov bx,#.67 mov bx,#.67
push bx push bx
@ -3158,12 +3156,11 @@ call _print
inc sp inc sp
inc sp inc sp
!BCC_EOS !BCC_EOS
! 84 print(find_file->filename); ! 84 dump_ax(parameter_struct.buffer_address);
mov bx,-$202C[bp] ! Debug: list unsigned int parameter_struct = [S+$2030-$2012] (used reg = )
! Debug: list * char = [bx+$12] (used reg = ) push -$2010[bp]
push $12[bx] ! Debug: func () void = dump_ax+0 (used reg = )
! Debug: func () void = print+0 (used reg = ) call _dump_ax
call _print
inc sp inc sp
inc sp inc sp
!BCC_EOS !BCC_EOS
@ -3171,7 +3168,7 @@ inc sp
! Debug: func () void = print_newline+0 (used reg = ) ! Debug: func () void = print_newline+0 (used reg = )
call _print_newline call _print_newline
!BCC_EOS !BCC_EOS
! 86 print("Kernel file id: "); ! 86 print("Buffer_segmnent: ");
! Debug: list * char = .68+0 (used reg = ) ! Debug: list * char = .68+0 (used reg = )
mov bx,#.68 mov bx,#.68
push bx push bx
@ -3180,66 +3177,60 @@ call _print
inc sp inc sp
inc sp inc sp
!BCC_EOS !BCC_EOS
! 87 print_newline(); ! 87 dump_ax(parameter_struct.buffer_segment);
! Debug: func () void = print_newline+0 (used reg = ) ! Debug: list unsigned int parameter_struct = [S+$2030-$2014] (used reg = )
call _print_newline push -$2012[bp]
!BCC_EOS ! Debug: func () void = dump_ax+0 (used reg = )
! 88 print("Kernel file size: "); call _dump_ax
! Debug: list * char = .69+0 (used reg = )
mov bx,#.69
push bx
! Debug: func () void = print+0 (used reg = )
call _print
inc sp
inc sp
!BCC_EOS
! 89 print_newline();
! Debug: func () void = print_newline+0 (used reg = )
call _print_newline
!BCC_EOS
! 90 print("Kernel first data pointer: ");
! Debug: list * char = .6A+0 (used reg = )
mov bx,#.6A
push bx
! Debug: func () void = print+0 (used reg = )
call _print
inc sp inc sp
inc sp inc sp
!BCC_EOS !BCC_EOS
! 91 ! 88
! 92 lsfs_disk_read_data_from_file(find_file, 0xffff, 0x ! 89 lsfs_disk_read_data_from_file(find_file, parameter_struct.buffer_size, parameter_struct.buffer_a
! 92 00, (long) 0x0, 0x50); ! 89 ddress, (long) 0x0, parameter_struct.buffer_segment);
! Debug: list int = const $50 (used reg = ) ! Debug: list unsigned int parameter_struct = [S+$2030-$2014] (used reg = )
mov ax,*$50 push -$2012[bp]
push ax
! Debug: list long = const 0 (used reg = ) ! Debug: list long = const 0 (used reg = )
xor ax,ax xor ax,ax
xor bx,bx xor bx,bx
push bx push bx
push ax push ax
! Debug: list int = const 0 (used reg = ) ! Debug: list unsigned int parameter_struct = [S+$2036-$2012] (used reg = )
xor ax,ax push -$2010[bp]
push ax ! Debug: list unsigned int parameter_struct = [S+$2038-$2010] (used reg = )
! Debug: list unsigned int = const $FFFF (used reg = ) push -$200E[bp]
mov ax,#$FFFF
push ax
! Debug: list * struct lsfs_file find_file = [S+$203A-$202E] (used reg = ) ! Debug: list * struct lsfs_file find_file = [S+$203A-$202E] (used reg = )
push -$202C[bp] push -$202C[bp]
! Debug: func () int = lsfs_disk_read_data_from_file+0 (used reg = ) ! Debug: func () int = lsfs_disk_read_data_from_file+0 (used reg = )
call _lsfs_disk_read_data_from_file call _lsfs_disk_read_data_from_file
add sp,*$C add sp,*$C
!BCC_EOS !BCC_EOS
! 93 ! 90
! 94 ! 91
! 95 } break; ! 92 } break;
jmp .5C
!BCC_EOS
! 93 case SERIVCE_READ_DATA:
! 94 {
.69:
! 95 # 103
! 103
! 104 print("Hit READ case");
! Debug: list * char = .6A+0 (used reg = )
mov bx,#.6A
push bx
! Debug: func () void = print+0 (used reg = )
call _print
inc sp
inc sp
!BCC_EOS
! 105 } break;
jmp .5C jmp .5C
!BCC_EOS !BCC_EOS
! 96 case SERIVCE_READ_DATA: ! 106 case SERIVCE_WRITE_DATA:
! 97 { ! 107 {
.6B: .6B:
! 98 # 106 ! 108 print("Hit WRITE case");
! 106
! 107 print("Hit READ case");
! Debug: list * char = .6C+0 (used reg = ) ! Debug: list * char = .6C+0 (used reg = )
mov bx,#.6C mov bx,#.6C
push bx push bx
@ -3248,40 +3239,57 @@ call _print
inc sp inc sp
inc sp inc sp
!BCC_EOS !BCC_EOS
! 108 } break; ! 109 } break;
jmp .5C jmp .5C
!BCC_EOS !BCC_EOS
! 109 case SERIVCE_WRITE_DATA: ! 110 case SERIVCE_WRITE_FS_INFO:
! 110 { ! 111 {
.6D: .6D:
! 111 print("Hit WRITE case"); ! 112 print_newline();
! Debug: list * char = .6E+0 (used reg = ) ! Debug: func () void = print_newline+0 (used reg = )
mov bx,#.6E call _print_newline
push bx !BCC_EOS
! 113 print(fsci->filesystem_information);
! Debug: cast * char = const 0 to [$100] char fsci = [S+$202A-$202A] (used reg = )
! Debug: list * char fsci = [S+$202A-$202A] (used reg = )
push -$2028[bp]
! Debug: func () void = print+0 (used reg = ) ! Debug: func () void = print+0 (used reg = )
call _print call _print
inc sp inc sp
inc sp inc sp
!BCC_EOS !BCC_EOS
! 112 } break; ! 114 print_newline();
! Debug: func () void = print_newline+0 (used reg = )
call _print_newline
!BCC_EOS
! 115 } break;
jmp .5C jmp .5C
!BCC_EOS !BCC_EOS
! 113 default: ! 116
! 114 { ! 117 default:
.6F: ! 118 {
! 115 print("Default case"); .6E:
! Debug: list * char = .70+0 (used reg = ) ! 119 print("Default case: ");
mov bx,#.70 ! Debug: list * char = .6F+0 (used reg = )
mov bx,#.6F
push bx push bx
! Debug: func () void = print+0 (used reg = ) ! Debug: func () void = print+0 (used reg = )
call _print call _print
inc sp inc sp
inc sp inc sp
!BCC_EOS !BCC_EOS
! 116 } ! 120 dump_ax(service_action);
! 117 } ! Debug: list int service_action = [S+$202A-8] (used reg = )
! 118 push -6[bp]
! 119 return 0; ! Debug: func () void = dump_ax+0 (used reg = )
call _dump_ax
inc sp
inc sp
!BCC_EOS
! 121 }
! 122 }
! 123
! 124 return 0;
jmp .5C jmp .5C
.5E: .5E:
add sp,*-6 add sp,*-6
@ -3290,10 +3298,12 @@ beq .5F
sub ax,*1 sub ax,*1
beq .61 beq .61
sub ax,*1 sub ax,*1
je .6B je .69
sub ax,*1 sub ax,*1
je .6B
sub ax,*6
je .6D je .6D
jmp .6F jmp .6E
.5C: .5C:
..FFFF = -$2030 ..FFFF = -$2030
add sp,*6 add sp,*6
@ -3304,52 +3314,44 @@ pop di
pop bp pop bp
ret ret
!BCC_EOS !BCC_EOS
! 120 ! 125
! 121 } ! 126 }
! 122 ! 127
! Register BX used in function main ! Register BX used in function main
.6F:
.70: .70:
.71: .ascii "Default case: "
.ascii "Default case"
.byte 0
.6E:
.72:
.ascii "Hit WRITE case"
.byte 0 .byte 0
.6C: .6C:
.73: .71:
.ascii "Hit READ case" .ascii "Hit WRITE case"
.byte 0 .byte 0
.6A: .6A:
.74: .72:
.ascii "Kernel first data pointer: " .ascii "Hit READ case"
.byte 0
.69:
.75:
.ascii "Kernel file size: "
.byte 0 .byte 0
.68: .68:
.76: .73:
.ascii "Kernel file id: " .ascii "Buffer_segmnent: "
.byte 0 .byte 0
.67: .67:
.77: .74:
.ascii "Loding SingOS kernel: " .ascii "Buffer_address: "
.byte 0 .byte 0
.60: .60:
.78: .75:
.ascii "File System has been loaded: " .ascii "File System has been loaded: "
.byte 0 .byte 0
.43: .43:
.79: .76:
.ascii "vs " .ascii "vs "
.byte 0 .byte 0
.42: .42:
.7A: .77:
.ascii "New: " .ascii "New: "
.byte 0 .byte 0
.2E: .2E:
.7B: .78:
.ascii "Size of table_entry: " .ascii "Size of table_entry: "
.byte 0 .byte 0
.bss .bss

Loading…
Cancel
Save