From ec61cd8b8a0635f9fb5dbab1d7accaf3fb1ecc2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rn=20Guldberg?= Date: Sat, 29 Jun 2019 11:00:43 +0000 Subject: [PATCH] Big changes, starting to divided up i .c and .h files --- build.sh | 2 +- debug.txt | 749 ----------------- disk.out | Bin 1658 -> 1765 bytes implementation/lsfs.c | 112 +++ implementation/lsfs.h | 6 + implementation/lsfs.s | 1846 +++++++++++++++++++++++++++++++++++++++++ main.c | 114 +-- main.h | 100 +++ main.s | 1031 ++++++++++++----------- std_singos/stdlib.h | 26 + std_singos/string.h | 10 +- 11 files changed, 2669 insertions(+), 1327 deletions(-) delete mode 100644 debug.txt create mode 100644 implementation/lsfs.c create mode 100644 implementation/lsfs.h create mode 100644 implementation/lsfs.s create mode 100644 main.h diff --git a/build.sh b/build.sh index ff53c33..24ccd26 100644 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -bcc -S main.c +bcc -S main.c implementation/lsfs.c echo -e "push bp mov bp,sp push 10[bp] diff --git a/debug.txt b/debug.txt deleted file mode 100644 index a9ba56a..0000000 --- a/debug.txt +++ /dev/null @@ -1,749 +0,0 @@ -std_singos/string.h:257.6: error: need '{' -std_singos/string.h:257.17: error: size_t undeclared -std_singos/string.h:257.17: error: need ';' -std_singos/string.h:263.16: error: NULL undeclared -std_singos/string.h:263.16: error: compiler bug? - botched implicit cast -std_singos/string.h:267.14: error: bad expression -std_singos/string.h:267.32: error: need ';' -std_singos/string.h:267.40: error: length undeclared -std_singos/string.h:267.47: error: chars undeclared -std_singos/string.h:268.8: error: need ';' -std_singos/string.h:268.8: error: bad expression -std_singos/string.h:268.12: error: need ';' -std_singos/string.h:268.12: error: bad expression -std_singos/string.h:268.19: error: need ';' -std_singos/string.h:269.4: error: bad expression -std_singos/string.h:281.16: error: compiler bug? - botched implicit cast -std_singos/stdio.h:1.4: error: bad expression -std_singos/stdio.h:1.10: error: need ';' -std_singos/stdio.h:1.18: error: string undeclared -std_singos/stdio.h:3.4: error: bad expression -std_singos/stdio.h:3.10: error: need ';' -std_singos/stdio.h:4.4: error: need ';' -std_singos/stdio.h:4.4: error: bad expression -std_singos/stdio.h:15.4: error: bad expression -std_singos/stdio.h:15.16: error: need ';' -std_singos/stdio.h:15.26: error: argument undeclared -std_singos/stdio.h:16.1: error: need ';' -std_singos/stdio.h:34.21: error: input undeclared -std_singos/stdio.h:35.4: error: need ';' -std_singos/stdio.h:35.4: error: bad expression -std_singos/stdio.h:37.17: error: compiler bug? - botched implicit cast -std_singos/stdio.h:40.4: error: bad expression -std_singos/stdio.h:40.12: error: need ';' -std_singos/stdio.h:41.4: error: need ';' -std_singos/stdio.h:41.4: error: bad expression -std_singos/stdio.h:53.4: error: bad expression -std_singos/stdio.h:53.18: error: need ';' -std_singos/stdio.h:54.1: error: need ';' -driver/disk.h:1.3: error: bad expression -driver/disk.h:1.18: error: need ';' -driver/disk.h:1.25: error: index undeclared -driver/disk.h:1.41: error: number_sectors undeclared -driver/disk.h:1.54: error: data_buffer undeclared -driver/disk.h:1.75: error: data_buffer_segment undeclared -driver/disk.h:2.3: error: bad expression -driver/disk.h:2.36: error: need ';' -driver/disk.h:4.3: error: bad expression -driver/disk.h:4.36: error: need ';' -driver/disk.h:5.4: error: need ';' -driver/disk.h:5.4: error: bad expression -driver/disk.h:6.4: error: bad expression -driver/disk.h:6.19: error: need ';' -driver/disk.h:7.4: error: bad expression -driver/disk.h:8.3: error: bad expression -driver/disk.h:8.23: error: need ';' -main.c:21.4: error: bad expression -main.c:21.12: error: need ';' -main.c:22.4: error: bad expression -main.c:22.16: error: need ';' -main.c:23.4: error: bad expression -main.c:23.18: error: need ';' -main.c:25.7: error: bad expression -main.c:25.14: error: need ';' -main.c:25.14: error: bad expression -main.c:25.30: error: need ';' -main.c:25.46: error: Directory_Table undeclared -main.c:25.46: error: need ';' -main.c:26.7: error: bad expression -main.c:26.14: error: need ';' -main.c:26.14: error: bad expression -main.c:26.33: error: need ';' -main.c:26.45: error: Struct_Table_Entry undeclared -main.c:26.45: error: need ';' -main.c:26.46: error: Table_Entry undeclared -main.c:27.7: error: bad expression -main.c:27.14: error: need ';' -main.c:27.14: error: bad expression -main.c:27.39: error: need ';' -main.c:27.57: error: struct_partition_control undeclared -main.c:27.57: error: need ';' -main.c:27.58: error: partition_control undeclared -main.c:28.7: error: bad expression -main.c:28.14: error: need ';' -main.c:28.14: error: bad expression -main.c:28.46: error: need ';' -main.c:28.51: error: File_System_Control_Information undeclared -main.c:28.51: error: need ';' -main.c:28.52: error: FSCI undeclared -main.c:29.7: error: bad expression -main.c:29.14: error: need ';' -main.c:29.14: error: bad expression -main.c:29.38: error: need ';' -main.c:29.42: error: meta_information_format undeclared -main.c:29.42: error: need ';' -main.c:29.43: error: mif undeclared -main.c:30.7: error: bad expression -main.c:30.14: error: need ';' -main.c:30.14: error: bad expression -main.c:30.25: error: need ';' -main.c:30.36: error: tag_record undeclared -main.c:30.36: error: need ';' -main.c:31.7: error: bad expression -main.c:31.14: error: need ';' -main.c:31.14: error: bad expression -main.c:31.24: error: need ';' -main.c:31.34: error: lsfs_file undeclared -main.c:31.34: error: need ';' -main.c:32.7: error: bad expression -main.c:32.14: error: need ';' -main.c:32.14: error: bad expression -main.c:32.31: error: need ';' -main.c:32.48: error: Parameter_Struct undeclared -main.c:32.48: error: need ';' -main.c:34.7: error: bad expression -main.c:34.12: error: need ';' -main.c:34.12: error: bad expression -main.c:34.29: error: need ';' -main.c:35.1: error: Table_Entry_Kind undeclared -main.c:35.1: error: need ';' -main.c:37.17: error: ENTRY_EMPTY undeclared -main.c:38.16: error: ENTRY_FILE undeclared -main.c:39.21: error: ENTRY_DIRECTORY undeclared -main.c:40.1: error: bad expression -main.c:40.18: error: need ';' -main.c:42.7: error: bad expression -main.c:42.12: error: need ';' -main.c:42.12: error: bad expression -main.c:42.27: error: need ';' -main.c:43.1: error: Service_Action undeclared -main.c:43.1: error: need ';' -main.c:44.24: error: SERIVCE_LOAD_DISK undeclared -main.c:45.24: error: SERVICE_FIND_ENTRY undeclared -main.c:46.24: error: SERIVCE_READ_DATA undeclared -main.c:47.24: error: SERIVCE_WRITE_DATA undeclared -main.c:49.1: error: bad expression -main.c:49.16: error: need ';' -main.c:51.6: error: bad expression -main.c:51.25: error: need ';' -main.c:52.1: error: need ';' -main.c:67.6: error: bad expression -main.c:67.38: error: need ';' -main.c:68.1: error: need ';' -main.c:82.7: error: bad expression -main.c:82.14: error: need ';' -main.c:82.14: error: bad expression -main.c:82.30: error: need ';' -main.c:83.1: error: need ';' -main.c:84.23: error: need ';' -main.c:84.24: error: entries undeclared -main.c:84.29: error: illegal indirection -main.c:88.6: error: bad expression -main.c:88.23: error: need ';' -main.c:89.1: error: need ';' -main.c:97.31: error: need ';' -main.c:97.32: error: entry_kind undeclared -main.c:100.3: error: bad expression -main.c:100.8: error: need ';' -main.c:100.18: error: selector undeclared -main.c:100.45: error: pointer_parameter_segment undeclared -main.c:100.71: error: pointer_parameter_struct undeclared -main.c:101.3: error: need ';' -main.c:101.3: error: bad expression -main.c:101.12: error: need ';' -main.c:102.4: error: bad expression -main.c:103.4: error: bad expression -main.c:108.13: error: need ';' -main.c:108.14: error: fsci undeclared -main.c:109.33: error: need ';' -main.c:109.34: error: service_action undeclared -main.c:110.33: error: need ';' -main.c:110.34: error: current_table undeclared -main.c:111.37: error: need ';' -main.c:111.38: error: parameter_struct undeclared -main.c:112.7: error: bad expression -main.c:112.21: error: need ';' -main.c:112.23: error: local_segment undeclared -main.c:113.7: error: bad expression -main.c:113.21: error: need ';' -main.c:113.23: error: stack_segment undeclared -main.c:114.7: error: bad expression -main.c:114.19: error: need ';' -main.c:114.20: error: path_length undeclared -main.c:115.8: error: bad expression -main.c:115.22: error: need ';' -main.c:115.23: error: index_as_long undeclared -main.c:117.8: error: bad expression -main.c:117.19: error: need ';' -main.c:117.20: error: local_path undeclared -main.c:117.24: error: illegal indirection -main.c:122.31: error: constant expression required -main.c:132.51: error: undefined structure element -main.c:135.32: error: constant expression required -main.c:140.35: error: illegal indirection -main.c:143.71: error: illegal indirection -main.c:146.48: error: illegal indirection -main.c:146.59: error: compiler bug? - taking address of non-lvalue -main.c:148.48: error: illegal indirection -main.c:148.59: error: compiler bug? - taking address of non-lvalue -main.c:150.48: error: illegal indirection -main.c:150.59: error: compiler bug? - taking address of non-lvalue -main.c:153.31: error: constant expression required -main.c:166.32: error: constant expression required -main.c:176.10: error: duplicate case in switch -main.c:176.10: error: duplicate case in switch -main.c:176.10: error: duplicate case in switch -main.c:176.13: error: compiler bug? - botched implicit cast -main.c:eof: error: need '}' -main.c:eof: error: need '}' -main.c:eof: error: need '}' -01923 .fail 209 errors detected -***** junk after operands...............................^ -00006 000C E8 0000 call _main -***** unbound label..................................^ -***** relocation impossible...............................^ -00339 0119 E8 0000 call _malloc -***** unbound label.....................................^ -***** relocation impossible....................................^ -00610 0242 E8 0000 call _lsfs_create_string -***** unbound label.....................................^ -***** relocation impossible................................................^ -00688 02B1 E8 0000 call _lsfs_create_string -***** unbound label.....................................^ -***** relocation impossible................................................^ -00736 fail! std_singos/string.h:257.6: error: need '{' -***** user-generated error..........................^ -00741 fail! std_singos/string.h:257.17: error: size_t undeclared -***** user-generated error..........................^ -00743 fail! std_singos/string.h:257.17: error: need ';' -***** user-generated error..........................^ -00751 fail! std_singos/string.h:263.16: error: NULL undeclared -***** user-generated error..........................^ -00752 fail! std_singos/string.h:263.16: error: compiler bug? - botched implicit cast -***** user-generated error..........................^ -00769 fail! std_singos/string.h:267.14: error: bad expression -***** user-generated error..........................^ -00771 fail! std_singos/string.h:267.32: error: need ';' -***** user-generated error..........................^ -00772 fail! std_singos/string.h:267.40: error: length undeclared -***** user-generated error..........................^ -00773 fail! std_singos/string.h:267.47: error: chars undeclared -***** user-generated error..........................^ -00783 031F E8 0000 call _lsfs_create_string -***** unbound label.....................................^ -***** relocation impossible................................................^ -00788 fail! std_singos/string.h:268.8: error: need ';' -***** user-generated error..........................^ -00789 fail! std_singos/string.h:268.8: error: bad expression -***** user-generated error..........................^ -00791 fail! std_singos/string.h:268.12: error: need ';' -***** user-generated error..........................^ -00792 fail! std_singos/string.h:268.12: error: bad expression -***** user-generated error..........................^ -00794 fail! std_singos/string.h:268.19: error: need ';' -***** user-generated error..........................^ -00797 fail! std_singos/string.h:269.4: error: bad expression -***** user-generated error..........................^ -00815 fail! std_singos/string.h:281.16: error: compiler bug? - botched implicit cast -***** user-generated error..........................^ -00832 fail! std_singos/stdio.h:1.4: error: bad expression -***** user-generated error..........................^ -00834 fail! std_singos/stdio.h:1.10: error: need ';' -***** user-generated error..........................^ -00835 fail! std_singos/stdio.h:1.18: error: string undeclared -***** user-generated error..........................^ -00839 0348 E8 0000 call _print -***** relocation impossible...................................^ -***** unbound label.....................................^ -00845 fail! std_singos/stdio.h:3.4: error: bad expression -***** user-generated error..........................^ -00847 fail! std_singos/stdio.h:3.10: error: need ';' -***** user-generated error..........................^ -00852 0351 E8 0000 call _print -***** unbound label.....................................^ -***** relocation impossible...................................^ -00856 fail! std_singos/stdio.h:4.4: error: need ';' -***** user-generated error..........................^ -00857 fail! std_singos/stdio.h:4.4: error: bad expression -***** user-generated error..........................^ -00880 fail! std_singos/stdio.h:15.4: error: bad expression -***** user-generated error..........................^ -00882 fail! std_singos/stdio.h:15.16: error: need ';' -***** user-generated error..........................^ -00883 fail! std_singos/stdio.h:15.26: error: argument undeclared -***** user-generated error..........................^ -00888 036B E8 0000 call _print_stack -***** unbound label.....................................^ -***** relocation impossible.........................................^ -00892 fail! std_singos/stdio.h:16.1: error: need ';' -***** user-generated error..........................^ -00917 fail! std_singos/stdio.h:34.21: error: input undeclared -***** user-generated error..........................^ -00922 0388 E8 0000 call _dump_ax_return -***** unbound label.....................................^ -***** relocation impossible............................................^ -00926 fail! std_singos/stdio.h:35.4: error: need ';' -***** user-generated error..........................^ -00927 fail! std_singos/stdio.h:35.4: error: bad expression -***** user-generated error..........................^ -00935 fail! std_singos/stdio.h:37.17: error: compiler bug? - botched implicit cast -***** user-generated error..........................^ -00951 fail! std_singos/stdio.h:40.4: error: bad expression -***** user-generated error..........................^ -00953 fail! std_singos/stdio.h:40.12: error: need ';' -***** user-generated error..........................^ -00958 03AB E8 0000 call _dump_ax -***** relocation impossible.....................................^ -***** unbound label.....................................^ -00962 fail! std_singos/stdio.h:41.4: error: need ';' -***** user-generated error..........................^ -00963 fail! std_singos/stdio.h:41.4: error: bad expression -***** user-generated error..........................^ -00976 03B9 E8 0000 call _dump_ax_return -***** unbound label.....................................^ -***** relocation impossible............................................^ -00993 fail! std_singos/stdio.h:53.4: error: bad expression -***** user-generated error..........................^ -00995 fail! std_singos/stdio.h:53.18: error: need ';' -***** user-generated error..........................^ -00998 03C7 E8 0000 call _print_newline -***** relocation impossible...........................................^ -***** unbound label.....................................^ -01000 fail! std_singos/stdio.h:54.1: error: need ';' -***** user-generated error..........................^ -01019 fail! driver/disk.h:1.3: error: bad expression -***** user-generated error..........................^ -01021 fail! driver/disk.h:1.18: error: need ';' -***** user-generated error..........................^ -01022 fail! driver/disk.h:1.25: error: index undeclared -***** user-generated error..........................^ -01023 fail! driver/disk.h:1.41: error: number_sectors undeclared -***** user-generated error..........................^ -01024 fail! driver/disk.h:1.54: error: data_buffer undeclared -***** user-generated error..........................^ -01025 fail! driver/disk.h:1.75: error: data_buffer_segment undeclared -***** user-generated error..........................^ -01035 03E5 E8 0000 call _data_from_disk -***** unbound label.....................................^ -***** relocation impossible............................................^ -01039 fail! driver/disk.h:2.3: error: bad expression -***** user-generated error..........................^ -01041 fail! driver/disk.h:2.36: error: need ';' -***** user-generated error..........................^ -01051 03FB E8 0000 call _disk_service_read_data_from_disk -***** unbound label.....................................^ -***** relocation impossible..............................................................^ -01056 fail! driver/disk.h:4.3: error: bad expression -***** user-generated error..........................^ -01059 fail! driver/disk.h:4.36: error: need ';' -***** user-generated error..........................^ -01070 0411 E8 0000 call _disk_service_read_data_from_disk -***** unbound label.....................................^ -***** relocation impossible..............................................................^ -01073 fail! driver/disk.h:5.4: error: need ';' -***** user-generated error..........................^ -01074 fail! driver/disk.h:5.4: error: bad expression -***** user-generated error..........................^ -01081 fail! driver/disk.h:6.4: error: bad expression -***** user-generated error..........................^ -01083 fail! driver/disk.h:6.19: error: need ';' -***** user-generated error..........................^ -01086 fail! driver/disk.h:7.4: error: bad expression -***** user-generated error..........................^ -01093 fail! driver/disk.h:8.3: error: bad expression -***** user-generated error..........................^ -01095 fail! driver/disk.h:8.23: error: need ';' -***** user-generated error..........................^ -01159 fail! main.c:21.4: error: bad expression -***** user-generated error..........................^ -01161 fail! main.c:21.12: error: need ';' -***** user-generated error..........................^ -01165 0463 E8 0000 call _dump_ax -***** relocation impossible.....................................^ -***** unbound label.....................................^ -01170 fail! main.c:22.4: error: bad expression -***** user-generated error..........................^ -01172 fail! main.c:22.16: error: need ';' -***** user-generated error..........................^ -01176 046C E8 0000 call _print_stack -***** unbound label.....................................^ -***** relocation impossible.........................................^ -01181 fail! main.c:23.4: error: bad expression -***** user-generated error..........................^ -01183 fail! main.c:23.18: error: need ';' -***** user-generated error..........................^ -01185 0471 E8 0000 call _print_newline -***** unbound label.....................................^ -***** relocation impossible...........................................^ -01189 fail! main.c:25.7: error: bad expression -***** user-generated error..........................^ -01191 fail! main.c:25.14: error: need ';' -***** user-generated error..........................^ -01192 fail! main.c:25.14: error: bad expression -***** user-generated error..........................^ -01194 fail! main.c:25.30: error: need ';' -***** user-generated error..........................^ -01195 fail! main.c:25.46: error: Directory_Table undeclared -***** user-generated error..........................^ -01197 fail! main.c:25.46: error: need ';' -***** user-generated error..........................^ -01200 fail! main.c:26.7: error: bad expression -***** user-generated error..........................^ -01202 fail! main.c:26.14: error: need ';' -***** user-generated error..........................^ -01203 fail! main.c:26.14: error: bad expression -***** user-generated error..........................^ -01205 fail! main.c:26.33: error: need ';' -***** user-generated error..........................^ -01206 fail! main.c:26.45: error: Struct_Table_Entry undeclared -***** user-generated error..........................^ -01208 fail! main.c:26.45: error: need ';' -***** user-generated error..........................^ -01209 fail! main.c:26.46: error: Table_Entry undeclared -***** user-generated error..........................^ -01212 fail! main.c:27.7: error: bad expression -***** user-generated error..........................^ -01214 fail! main.c:27.14: error: need ';' -***** user-generated error..........................^ -01215 fail! main.c:27.14: error: bad expression -***** user-generated error..........................^ -01217 fail! main.c:27.39: error: need ';' -***** user-generated error..........................^ -01218 fail! main.c:27.57: error: struct_partition_control undeclared -***** user-generated error..........................^ -01220 fail! main.c:27.57: error: need ';' -***** user-generated error..........................^ -01221 fail! main.c:27.58: error: partition_control undeclared -***** user-generated error..........................^ -01224 fail! main.c:28.7: error: bad expression -***** user-generated error..........................^ -01226 fail! main.c:28.14: error: need ';' -***** user-generated error..........................^ -01227 fail! main.c:28.14: error: bad expression -***** user-generated error..........................^ -01229 fail! main.c:28.46: error: need ';' -***** user-generated error..........................^ -01230 fail! main.c:28.51: error: File_System_Control_Information undeclared -***** user-generated error..........................^ -01232 fail! main.c:28.51: error: need ';' -***** user-generated error..........................^ -01233 fail! main.c:28.52: error: FSCI undeclared -***** user-generated error..........................^ -01236 fail! main.c:29.7: error: bad expression -***** user-generated error..........................^ -01238 fail! main.c:29.14: error: need ';' -***** user-generated error..........................^ -01239 fail! main.c:29.14: error: bad expression -***** user-generated error..........................^ -01241 fail! main.c:29.38: error: need ';' -***** user-generated error..........................^ -01242 fail! main.c:29.42: error: meta_information_format undeclared -***** user-generated error..........................^ -01244 fail! main.c:29.42: error: need ';' -***** user-generated error..........................^ -01245 fail! main.c:29.43: error: mif undeclared -***** user-generated error..........................^ -01248 fail! main.c:30.7: error: bad expression -***** user-generated error..........................^ -01250 fail! main.c:30.14: error: need ';' -***** user-generated error..........................^ -01251 fail! main.c:30.14: error: bad expression -***** user-generated error..........................^ -01253 fail! main.c:30.25: error: need ';' -***** user-generated error..........................^ -01254 fail! main.c:30.36: error: tag_record undeclared -***** user-generated error..........................^ -01256 fail! main.c:30.36: error: need ';' -***** user-generated error..........................^ -01259 fail! main.c:31.7: error: bad expression -***** user-generated error..........................^ -01261 fail! main.c:31.14: error: need ';' -***** user-generated error..........................^ -01262 fail! main.c:31.14: error: bad expression -***** user-generated error..........................^ -01264 fail! main.c:31.24: error: need ';' -***** user-generated error..........................^ -01265 fail! main.c:31.34: error: lsfs_file undeclared -***** user-generated error..........................^ -01267 fail! main.c:31.34: error: need ';' -***** user-generated error..........................^ -01270 fail! main.c:32.7: error: bad expression -***** user-generated error..........................^ -01272 fail! main.c:32.14: error: need ';' -***** user-generated error..........................^ -01273 fail! main.c:32.14: error: bad expression -***** user-generated error..........................^ -01275 fail! main.c:32.31: error: need ';' -***** user-generated error..........................^ -01276 fail! main.c:32.48: error: Parameter_Struct undeclared -***** user-generated error..........................^ -01278 fail! main.c:32.48: error: need ';' -***** user-generated error..........................^ -01282 fail! main.c:34.7: error: bad expression -***** user-generated error..........................^ -01284 fail! main.c:34.12: error: need ';' -***** user-generated error..........................^ -01285 fail! main.c:34.12: error: bad expression -***** user-generated error..........................^ -01287 fail! main.c:34.29: error: need ';' -***** user-generated error..........................^ -01289 fail! main.c:35.1: error: Table_Entry_Kind undeclared -***** user-generated error..........................^ -01291 fail! main.c:35.1: error: need ';' -***** user-generated error..........................^ -01294 fail! main.c:37.17: error: ENTRY_EMPTY undeclared -***** user-generated error..........................^ -01296 fail! main.c:38.16: error: ENTRY_FILE undeclared -***** user-generated error..........................^ -01298 fail! main.c:39.21: error: ENTRY_DIRECTORY undeclared -***** user-generated error..........................^ -01300 fail! main.c:40.1: error: bad expression -***** user-generated error..........................^ -01311 fail! main.c:40.18: error: need ';' -***** user-generated error..........................^ -01315 fail! main.c:42.7: error: bad expression -***** user-generated error..........................^ -01317 fail! main.c:42.12: error: need ';' -***** user-generated error..........................^ -01318 fail! main.c:42.12: error: bad expression -***** user-generated error..........................^ -01320 fail! main.c:42.27: error: need ';' -***** user-generated error..........................^ -01322 fail! main.c:43.1: error: Service_Action undeclared -***** user-generated error..........................^ -01324 fail! main.c:43.1: error: need ';' -***** user-generated error..........................^ -01326 fail! main.c:44.24: error: SERIVCE_LOAD_DISK undeclared -***** user-generated error..........................^ -01328 fail! main.c:45.24: error: SERVICE_FIND_ENTRY undeclared -***** user-generated error..........................^ -01330 fail! main.c:46.24: error: SERIVCE_READ_DATA undeclared -***** user-generated error..........................^ -01332 fail! main.c:47.24: error: SERIVCE_WRITE_DATA undeclared -***** user-generated error..........................^ -01335 fail! main.c:49.1: error: bad expression -***** user-generated error..........................^ -01349 fail! main.c:49.16: error: need ';' -***** user-generated error..........................^ -01353 fail! main.c:51.6: error: bad expression -***** user-generated error..........................^ -01355 fail! main.c:51.25: error: need ';' -***** user-generated error..........................^ -01358 fail! main.c:52.1: error: need ';' -***** user-generated error..........................^ -01388 fail! main.c:67.6: error: bad expression -***** user-generated error..........................^ -01390 fail! main.c:67.38: error: need ';' -***** user-generated error..........................^ -01393 fail! main.c:68.1: error: need ';' -***** user-generated error..........................^ -01419 fail! main.c:82.7: error: bad expression -***** user-generated error..........................^ -01421 fail! main.c:82.14: error: need ';' -***** user-generated error..........................^ -01422 fail! main.c:82.14: error: bad expression -***** user-generated error..........................^ -01424 fail! main.c:82.30: error: need ';' -***** user-generated error..........................^ -01427 fail! main.c:83.1: error: need ';' -***** user-generated error..........................^ -01430 fail! main.c:84.23: error: need ';' -***** user-generated error..........................^ -01431 fail! main.c:84.24: error: entries undeclared -***** user-generated error..........................^ -01432 fail! main.c:84.29: error: illegal indirection -***** user-generated error..........................^ -01439 fail! main.c:88.6: error: bad expression -***** user-generated error..........................^ -01441 fail! main.c:88.23: error: need ';' -***** user-generated error..........................^ -01444 fail! main.c:89.1: error: need ';' -***** user-generated error..........................^ -01462 fail! main.c:97.31: error: need ';' -***** user-generated error..........................^ -01463 fail! main.c:97.32: error: entry_kind undeclared -***** user-generated error..........................^ -01470 fail! main.c:100.3: error: bad expression -***** user-generated error..........................^ -01472 fail! main.c:100.8: error: need ';' -***** user-generated error..........................^ -01473 fail! main.c:100.18: error: selector undeclared -***** user-generated error..........................^ -01474 fail! main.c:100.45: error: pointer_parameter_segment undeclared -***** user-generated error..........................^ -01475 fail! main.c:100.71: error: pointer_parameter_struct undeclared -***** user-generated error..........................^ -01484 04AF E8 0000 call _main -***** relocation impossible..................................^ -***** unbound label.....................................^ -01487 fail! main.c:101.3: error: need ';' -***** user-generated error..........................^ -01488 fail! main.c:101.3: error: bad expression -***** user-generated error..........................^ -01490 fail! main.c:101.12: error: need ';' -***** user-generated error..........................^ -01493 fail! main.c:102.4: error: bad expression -***** user-generated error..........................^ -01500 fail! main.c:103.4: error: bad expression -***** user-generated error..........................^ -01512 fail! main.c:108.13: error: need ';' -***** user-generated error..........................^ -01513 fail! main.c:108.14: error: fsci undeclared -***** user-generated error..........................^ -01517 fail! main.c:109.33: error: need ';' -***** user-generated error..........................^ -01518 fail! main.c:109.34: error: service_action undeclared -***** user-generated error..........................^ -01522 fail! main.c:110.33: error: need ';' -***** user-generated error..........................^ -01523 fail! main.c:110.34: error: current_table undeclared -***** user-generated error..........................^ -01527 fail! main.c:111.37: error: need ';' -***** user-generated error..........................^ -01528 fail! main.c:111.38: error: parameter_struct undeclared -***** user-generated error..........................^ -01531 fail! main.c:112.7: error: bad expression -***** user-generated error..........................^ -01533 fail! main.c:112.21: error: need ';' -***** user-generated error..........................^ -01534 fail! main.c:112.23: error: local_segment undeclared -***** user-generated error..........................^ -01540 fail! main.c:113.7: error: bad expression -***** user-generated error..........................^ -01542 fail! main.c:113.21: error: need ';' -***** user-generated error..........................^ -01543 fail! main.c:113.23: error: stack_segment undeclared -***** user-generated error..........................^ -01549 fail! main.c:114.7: error: bad expression -***** user-generated error..........................^ -01551 fail! main.c:114.19: error: need ';' -***** user-generated error..........................^ -01552 fail! main.c:114.20: error: path_length undeclared -***** user-generated error..........................^ -01555 fail! main.c:115.8: error: bad expression -***** user-generated error..........................^ -01557 fail! main.c:115.22: error: need ';' -***** user-generated error..........................^ -01558 fail! main.c:115.23: error: index_as_long undeclared -***** user-generated error..........................^ -01562 fail! main.c:117.8: error: bad expression -***** user-generated error..........................^ -01564 fail! main.c:117.19: error: need ';' -***** user-generated error..........................^ -01565 fail! main.c:117.20: error: local_path undeclared -***** user-generated error..........................^ -01566 fail! main.c:117.24: error: illegal indirection -***** user-generated error..........................^ -01579 fail! main.c:122.31: error: constant expression required -***** user-generated error..........................^ -01603 04ED E8 0000 call _disk_service_read_data_from_disk -***** unbound label.....................................^ -***** relocation impossible..............................................................^ -01611 04F7 E8 0000 call _print -***** relocation impossible...................................^ -***** unbound label.....................................^ -01617 04FC E8 0000 call _print_newline -***** unbound label.....................................^ -***** relocation impossible...........................................^ -01620 fail! main.c:132.51: error: undefined structure element -***** user-generated error..........................^ -01624 0503 E8 0000 call _print_stack -***** relocation impossible.........................................^ -***** unbound label.....................................^ -01630 0508 E8 0000 call _print_newline -***** unbound label.....................................^ -***** relocation impossible...........................................^ -01636 fail! main.c:135.32: error: constant expression required -***** user-generated error..........................^ -01684 fail! main.c:140.35: error: illegal indirection -***** user-generated error..........................^ -01690 0557 E8 0000 call _print_stack -***** relocation impossible.........................................^ -***** unbound label.....................................^ -01696 055C E8 0000 call _print_newline -***** unbound label.....................................^ -***** relocation impossible...........................................^ -01699 fail! main.c:143.71: error: illegal indirection -***** user-generated error..........................^ -01712 056E E8 0000 call _disk_service_read_data_from_disk -***** unbound label.....................................^ -***** relocation impossible..............................................................^ -01720 0578 E8 0000 call _print -***** relocation impossible...................................^ -***** unbound label.....................................^ -01726 057D E8 0000 call _print_newline -***** unbound label.....................................^ -***** relocation impossible...........................................^ -01729 fail! main.c:146.48: error: illegal indirection -***** user-generated error..........................^ -01730 fail! main.c:146.59: error: compiler bug? - taking address of non-lvalue -***** user-generated error..........................^ -01734 0584 E8 0000 call _print_stack -***** relocation impossible.........................................^ -***** unbound label.....................................^ -01740 0589 E8 0000 call _print_newline -***** unbound label.....................................^ -***** relocation impossible...........................................^ -01743 fail! main.c:148.48: error: illegal indirection -***** user-generated error..........................^ -01744 fail! main.c:148.59: error: compiler bug? - taking address of non-lvalue -***** user-generated error..........................^ -01748 0590 E8 0000 call _print_stack -***** relocation impossible.........................................^ -***** unbound label.....................................^ -01754 0595 E8 0000 call _print_newline -***** unbound label.....................................^ -***** relocation impossible...........................................^ -01757 fail! main.c:150.48: error: illegal indirection -***** user-generated error..........................^ -01758 fail! main.c:150.59: error: compiler bug? - taking address of non-lvalue -***** user-generated error..........................^ -01762 059C E8 0000 call _print_stack -***** relocation impossible.........................................^ -***** unbound label.....................................^ -01768 05A1 E8 0000 call _print_newline -***** unbound label.....................................^ -***** relocation impossible...........................................^ -01774 fail! main.c:153.31: error: constant expression required -***** user-generated error..........................^ -01784 05AA E8 0000 call _print -***** relocation impossible...................................^ -***** unbound label.....................................^ -01792 fail! main.c:166.32: error: constant expression required -***** user-generated error..........................^ -01800 05B5 E8 0000 call _print -***** unbound label.....................................^ -***** relocation impossible...................................^ -01815 05C0 E8 0000 call _print -***** unbound label.....................................^ -***** relocation impossible...................................^ -01825 fail! main.c:176.10: error: duplicate case in switch -***** user-generated error..........................^ -01826 fail! main.c:176.10: error: duplicate case in switch -***** user-generated error..........................^ -01827 fail! main.c:176.10: error: duplicate case in switch -***** user-generated error..........................^ -01839 fail! main.c:176.13: error: compiler bug? - botched implicit cast -***** user-generated error..........................^ -01852 fail! main.c:eof: error: need '}' -***** user-generated error..........................^ -01853 fail! main.c:eof: error: need '}' -***** user-generated error..........................^ -01854 fail! main.c:eof: error: need '}' -***** user-generated error..........................^ -01923 .fail 209 errors detected -***** junk after operands...............................^ -***** user-generated error..............................^ - -00287 errors -00000 warnings diff --git a/disk.out b/disk.out index 815d07b0e6faee5f660d7250b00b0a884ea02e26..76fcdc5bfc91099ef8179a0418df44ceb8685b12 100644 GIT binary patch delta 451 zcmY*UPbdUY7@sxISYlJMiL8@yW80jzv@wkXX|++3At$s_4&$mOf1YR4HaXbCmN<}- zqNTQ&vZY+)BB=?ndfHsH7H^m5o8sW~{r-KwzK@lsD_ngz&9ySFIk_g$<)~|QR8KLY zAkrhfKVv1=-Az1U0jt^duplbAjj#Z~FHHzqsn^s~PIY+bl&D#(et1o+uuL^kKU&Pi z5*QsI5`_gohT&Io(+@<+!cH{CE62WN84RdbP#{PL_O~5-j-suCF(}qLmJLnxR8AKD zMO0%`>}!Z3qB^mMz=7r1wSq{08Foj|F-8aNOYSwJ2I-AwQiwY9vP`@3Jn?Ap#FIr| z@_GtI;)SmeWeltq!$dxZ%g7?%$Seq6GkDZ21bO1dqE!VwCE@vNi|#VI!{D*`D=X7T z;@1`dba^Ls7U5IUz-JJZ?Xm@C>j69V7xI@(U(hK=!;Fp_3&r)lhj0}Cgm62H#F_O= tT5WP0qOZ2oWRv?4P1~f7W!jS4uyhVA<4eW>p4hM{83B0kX}lHB{QwSW>yrQg delta 364 zcmaFL`-_J!wDalzGOqt+9RJJMUMNoFn>v|~@tfe~e=aVaZohndy4_eD0$v>XH(7v1 ze6tSI3`SYuzhJ5ExL-iIPIeG+=;8y$3l|>*y!bx(A+wyojXx-wPfq4%36)o4>5k** zlv7~o_T%Z~Q(@^27Eza}TJwE_S&4!9fu diff --git a/implementation/lsfs.c b/implementation/lsfs.c new file mode 100644 index 0000000..9e807f4 --- /dev/null +++ b/implementation/lsfs.c @@ -0,0 +1,112 @@ +#include "lsfs.h" +#include "../main.h" + +struct lsfs_file { + long file_id[2]; + long table_entry_pointer[2]; + Table_Entry_Kind entry_kind; + char* filename; + long owner_id; + long size[2]; + long creation_date[2]; + long access_time[2]; + long modification_time[2]; + long number_sector; + long table_entry_sector_index[2]; + long data_pointer[NUM_DATA_POINTERS * 2]; +}; + +int lsfs_disk_read_data_from_file(file, buffer_size, data, offset_to_next_entry) +lsfs_file *file; +int buffer_size; +char *data; +long offset_to_next_entry; +{ + int integer_file_size = file->size; + int integer_offset = offset_to_next_entry; + int integer_datapointer = 0; + int data_length = integer_file_size - integer_offset; + int amount_read = 0; + int amount_to_read = 0; + int remaining_offset = offset_to_next_entry; + /* printf("READ: buffer_size: %d\n", buffer_size); */ + /* printf("READ: Data length: %d\n", data_length); */ + /* printf("READ: Offset length: %d\n", offset_to_next_entry); */ + + + int data_pointer_index = 0; /* start at first data pointer. */ + + if (data_length > buffer_size) + { + data_length = buffer_size; + } + + while(data_length > 0) /* We have more to write */ + { + /* printf("READ: Remaing Data length: %d\n", data_length); */ + if (remaining_offset == 0) + { + char *tmp_buffer = calloc(DEFAULT_DATA_POINTER_SIZE, SECTOR_SIZE); + /* assert(tmp_buffer); */ + + if (data_length < (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE)) + { + amount_to_read = data_length; + } + else + { + amount_to_read = (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE); + } + /* disk_service_read_data_from_disk(lsfs_sector_offset index, uint32_t number_sector, void* data_buffer) */ + integer_datapointer = file->data_pointer[data_pointer_index]; + if (integer_datapointer == 0) + { + break; + } + disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], DEFAULT_DATA_POINTER_SIZE, tmp_buffer); + memcpy((data + amount_read), tmp_buffer, amount_to_read); + data_length -= amount_to_read; + amount_read += amount_to_read; + data_pointer_index++; + /* free(tmp_buffer); */ + } + else if (remaining_offset < (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE)) + { + char *tmp_buffer = calloc(1, (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE)); + /* assert(tmp_buffer); */ + + if (data_length < ((DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE) - remaining_offset) ) + { + amount_to_read = data_length; + } + else + { + 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); + + memcpy(data, (tmp_buffer + remaining_offset), amount_to_read); + data_length -= amount_to_read; + amount_read += amount_to_read; + remaining_offset -= amount_to_read; + + data_pointer_index++; + /* free(tmp_buffer); */ + } + else + { + /* We have to skip a whole data pointer: */ + remaining_offset -= (DEFAULT_DATA_POINTER_SIZE * SECTOR_SIZE); + data_pointer_index++; + } + + } + /* + time_t current_time; + time ( ¤t_time ); + file->access_time = current_time; + */ + return amount_read; + +} diff --git a/implementation/lsfs.h b/implementation/lsfs.h new file mode 100644 index 0000000..24701a1 --- /dev/null +++ b/implementation/lsfs.h @@ -0,0 +1,6 @@ +#ifndef LSFS_H +#define LSFS_H + +typedef struct lsfs_file lsfs_file; + +#endif \ No newline at end of file diff --git a/implementation/lsfs.s b/implementation/lsfs.s new file mode 100644 index 0000000..232ee80 --- /dev/null +++ b/implementation/lsfs.s @@ -0,0 +1,1846 @@ +! 1 +! 1 # 1 "implementation/lsfs.c" +! 1 # 4 "implementation/lsfs.h" +! 4 typedef struct lsfs_file lsfs_file; +!BCC_EOS +! 5 # 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 re +! 55 turn 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_next; +push bp +mov bp,sp +push di +push si +mov ax,[_global_heap_next] +pop si +pop di +pop bp +ret +!BCC_EOS +! 61 # 16 "implementation/../main.h" +! 16 } +! 17 # 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 String_Array *string_split_c(string, delim, keep_delim) +! 169 char *string; +export _string_split_c +_string_split_c: +!BCC_EOS +! 170 char delim; +!BCC_EOS +! 171 short keep_delim; +!BCC_EOS +! 172 { +! 173 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 +! 174 } +! 175 +! 176 Length_String *make_length_string_c(cstring) +! 177 char *cstring; +export _make_length_string_c +_make_length_string_c: +!BCC_EOS +! 178 { +! 179 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 +! 180 } +! 181 +! 182 Length_String *make_length_string(length, chars) +! 183 unsigned int length; +export _make_length_string +_make_length_string: +!BCC_EOS +! 184 char *chars; +!BCC_EOS +! 185 { +! 186 +! 187 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 +! 188 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 +! 189 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 +! 190 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 +! 191 +! 192 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 +! 193 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 +! 194 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 +! 195 +! 196 return legth_string +! 196 ; +mov ax,-6[bp] +add sp,*4 +pop si +pop di +pop bp +ret +!BCC_EOS +! 197 } +! 198 +! 199 String_Array *length_string_split(string, delim, keep_delim) +! Register BX SI used in function make_length_string +! 200 Length_String *string; +export _length_string_split +_length_string_split: +!BCC_EOS +! 201 char delim; +!BCC_EOS +! 202 short keep_delim; +!BCC_EOS +! 203 { +! 204 unsigned int i; +!BCC_EOS +! 205 unsigned int last; +!BCC_EOS +! 206 +! 207 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 +! 208 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 +! 209 String_Array *result; +!BCC_EOS +! 210 int k; +!BCC_EOS +! 211 +! 212 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 +! 213 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 +! 214 while(i < string->length) { +jmp .B +.C: +! 215 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 .D +.E: +! 216 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 .F +.10: +! 217 ++count; +! Debug: preinc unsigned int count = [S+$12-$C] (used reg = ) +mov ax,-$A[bp] +inc ax +mov -$A[bp],ax +!BCC_EOS +! 218 } +! 219 last = i; +.F: +! 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 +! 220 } +! 221 ++i; +.D: +! Debug: preinc unsigned int i = [S+$12-8] (used reg = ) +mov ax,-6[bp] +inc ax +mov -6[bp],ax +!BCC_EOS +! 222 } +! 223 if (i > last+1) { +.B: +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 .C +.11: +.A: +! 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 .12 +.13: +! 224 ++count; +! Debug: preinc unsigned int count = [S+$12-$C] (used reg = ) +mov ax,-$A[bp] +inc ax +mov -$A[bp],ax +!BCC_EOS +! 225 } +! 226 +! 227 result = create_length_string_array(count); +.12: +! 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 +! 228 +! 229 if (keep_delim) +mov ax,8[bp] +test ax,ax +je .14 +.15: +! 230 { +! 231 k = 0; +! Debug: eq int = const 0 to int k = [S+$12-$12] (used reg = ) +xor ax,ax +mov -$10[bp],ax +!BCC_EOS +! 232 } +! 233 else +! 234 { +jmp .16 +.14: +! 235 k = 1; +! Debug: eq int = const 1 to int k = [S+$12-$12] (used reg = ) +mov ax,*1 +mov -$10[bp],ax +!BCC_EOS +! 236 } +! 237 +! 238 i = 0; +.16: +! Debug: eq int = const 0 to unsigned int i = [S+$12-8] (used reg = ) +xor ax,ax +mov -6[bp],ax +!BCC_EOS +! 239 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 +! 240 while(i < string->length) { +jmp .18 +.19: +! 241 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 .1A +.1B: +! 242 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 .1C +.1D: +! 243 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 +! 244 } +! 245 last = i; +.1C: +! 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 +! 246 } +! 247 ++i; +.1A: +! Debug: preinc unsigned int i = [S+$12-8] (used reg = ) +mov ax,-6[bp] +inc ax +mov -6[bp],ax +!BCC_EOS +! 248 } +! 249 if (i > last+1) { +.18: +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 .19 +.1E: +.17: +! 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 .1F +.20: +! 250 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 +! 251 } +! 252 +! 253 return result; +.1F: +mov ax,-$E[bp] +add sp,*$C +pop si +pop di +pop bp +ret +!BCC_EOS +! 254 +! 255 } +! 256 +! 257 String_Array *create_length_string_array(array_size) +! Register BX SI used in function length_string_split +! 258 int array_size; +export _create_length_string_array +_create_length_string_array: +!BCC_EOS +! 259 { +! 260 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 +! 261 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 +! 262 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 +! 263 return result; +mov ax,-6[bp] +inc sp +inc sp +pop si +pop di +pop bp +ret +!BCC_EOS +! 264 } +! 265 +! 266 +! 267 Length_String *create_length_string(length, chars) +! Register BX used in function create_length_string_array +! 268 unsigned int length; +export _create_length_string +_create_length_string: +!BCC_EOS +! 269 char *chars; +!BCC_EOS +! 270 { +! 271 +! 272 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 +! 273 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 +! 274 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 +! 275 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 +! 276 +! 277 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 +! 278 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 +! 279 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 +! 280 +! 281 return legth_string; +mov ax,-6[bp] +add sp,*4 +pop si +pop di +pop bp +ret +!BCC_EOS +! 282 # 18 "implementation/../main.h" +! 18 } +! 19 # 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_ +! 4 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 # 22 "implementation/../main.h" +! 22 void dump_ax(input); +!BCC_EOS +! 23 void print_stack(argument); +!BCC_EOS +! 24 void print_newline(); +!BCC_EOS +! 25 +! 26 typedef struct Directory_Table Directory_Table; +!BCC_EOS +! 27 typedef struct Struct_Table_Entry Table_Entry; +!BCC_EOS +! 28 typedef struct struct_partition_control partition_control; +!BCC_EOS +! 29 typedef struct File_System_Control_Information FSCI; +!BCC_EOS +! 30 typedef struct meta_information_format mif; +!BCC_EOS +! 31 typedef struct tag_record tag_record; +!BCC_EOS +! 32 typedef struct Parameter_Struct Parameter_Struct; +!BCC_EOS +! 33 +! 34 typedef enum Table_Entry_Kind +! 35 { +! 36 +! 37 ENTRY_EMPTY = 0, +! 38 ENTRY_FILE = 1, +! 39 ENTRY_DIRECTORY = 2, +! 40 } Table_Entry_Kind; +!BCC_EOS +! 41 +! 42 typedef enum Service_Action +! 43 { +! 44 SERIVCE_LOAD_DISK = 1, +! 45 SERVICE_FIND_ENTRY = 2, +! 46 SERIVCE_READ_DATA = 3, +! 47 SERIVCE_WRITE_DATA = 4, +! 48 +! 49 } Service_Action; +!BCC_EOS +! 50 +! 51 struct Struct_Table_Entry +! 52 { +! 53 char filename[256]; +!BCC_EOS +! 54 long file_id[2]; +!BCC_EOS +! 55 long file_size[2]; +!BCC_EOS +! 56 void* ext_file_data_low; +!BCC_EOS +! 57 void* ext_file_data_high; +!BCC_EOS +! 58 long number_sector_s; +!BCC_EOS +! 59 short entry_kind; +!BCC_EOS +! 60 short extra_control_bits1; +!BCC_EOS +! 61 short extra_contro +! 61 l_bits2; +!BCC_EOS +! 62 short extra_control_bits3; +!BCC_EOS +! 63 long table_entry_sector_index[2]; +!BCC_EOS +! 64 long data_pointer[27 * 2]; +!BCC_EOS +! 65 }; +!BCC_EOS +! 66 +! 67 struct File_System_Control_Information +! 68 { +! 69 char filesystem_information[256]; +!BCC_EOS +! 70 long master_table_index[2]; +!BCC_EOS +! 71 long this_partition_offset_on_disk[2]; +!BCC_EOS +! 72 long next_free_sector[2]; +!BCC_EOS +! 73 long next_uniqe_id[2]; +!BCC_EOS +! 74 long next_sector_reuse_pointer[2]; +!BCC_EOS +! 75 long last_sector_index_on_partition[2]; +!BCC_EOS +! 76 long maximum_sectors_on_disk[2]; +!BCC_EOS +! 77 long sector_size_on_disk[2]; +!BCC_EOS +! 78 long not_used[48]; +!BCC_EOS +! 79 +! 80 }; +!BCC_EOS +! 81 +! 82 typedef struct Directory_Table +! 83 { +! 84 Table_Entry entries[16 ]; +!BCC_EOS +! 85 +! 86 }; +!BCC_EOS +! 87 +! 88 struct Parameter_Struct +! 89 { +! 90 char* path; +!BCC_EOS +! 91 char* new_path; +!BCC_EOS +! 92 int buffer_segment; +!BCC_EOS +! 93 int buffer_address; +!BCC_EOS +! 94 int buffer_size; +!BCC_EOS +! 95 int data_length; +!BCC_EOS +! 96 int byte_offset_into_file; +!BCC_EOS +! 97 Table_Entry_Kind entry_kind; +!BCC_EOS +! 98 }; +!BCC_EOS +! 99 # 4 "implementation/lsfs.c" +! 4 struct lsfs_file { +! 5 long file_id[2]; +!BCC_EOS +! 6 long table_entry_pointer[2]; +!BCC_EOS +! 7 Table_Entry_Kind entry_kind; +!BCC_EOS +! 8 char* filename; +!BCC_EOS +! 9 long owner_id; +!BCC_EOS +! 10 long size[2]; +!BCC_EOS +! 11 long creation_date[2]; +!BCC_EOS +! 12 long access_time[2]; +!BCC_EOS +! 13 long modification_time[2]; +!BCC_EOS +! 14 long number_sector; +!BCC_EOS +! 15 long table_entry_sector_index[2]; +!BCC_EOS +! 16 long data_pointer[27 * 2]; +!BCC_EOS +! 17 }; +!BCC_EOS +! 18 +! 19 int lsfs_disk_read_data_from_file(file, buffer_size, data, offset_to_next_entry) +! 20 lsfs_file *file; +export _lsfs_disk_read_data_from_file +_lsfs_disk_read_data_from_file: +!BCC_EOS +! 21 int buffer_size; +!BCC_EOS +! 22 char *data; +!BCC_EOS +! 23 long offset_to_next_entry; +!BCC_EOS +! 24 { +! 25 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 +! 26 int integer_offset = 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 +! 27 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 +! 28 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 +! 29 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 +! 30 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 +! 31 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 +! 32 +! 33 +! 34 +! 35 +! 36 +! 37 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 +! 38 +! 39 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 .21 +.22: +! 40 { +! 41 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 +! 42 } +! 43 +! 44 while(data_length > 0) +.21: +! 45 { +br .24 +.25: +! 46 +! 47 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 .26 +.27: +! 48 { +! 49 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 +! 50 +! 51 +! 52 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 .28 +.29: +! 53 { +! 54 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 +! 55 } +! 56 e +! 56 lse +! 57 { +jmp .2A +.28: +! 58 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 +! 59 } +! 60 +! 61 integer_datapointer = file->data_pointer[data_pointer_index]; +.2A: +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 +! 62 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 .2B +.2C: +! 63 { +! 64 break; +inc sp +inc sp +br .23 +!BCC_EOS +! 65 } +! 66 disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], 4 , tmp_buffer); +.2B: +! Debug: list * char tmp_buffer = [S+$18-$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+$1C-$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,*8 +!BCC_EOS +! 67 memcpy((data + amount_read), tmp_buffer, amount_to_read); +! Debug: list int amount_to_read = [S+$18-$12] (used reg = ) +push -$10[bp] +! Debug: list * char tmp_buffer = [S+$1A-$18] (used reg = ) +push -$16[bp] +! Debug: ptradd int amount_read = [S+$1C-$10] to * char data = [S+$1C+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,*6 +!BCC_EOS +! 68 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 +! 69 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 +! 70 data_pointer_index++; +! Debug: postinc int data_pointer_index = [S+$18-$16] (used reg = ) +mov ax,-$14[bp] +inc ax +mov -$14[bp],ax +!BCC_EOS +! 71 +! 72 } +inc sp +inc sp +! 73 else if (remaining_offset < (4 * 512 )) +br .2D +.26: +! Debug: lt int = const $800 to int remaining_offset = [S+$16-$14] (used reg = ) +mov ax,-$12[bp] +cmp ax,#$800 +bge .2E +.2F: +! 74 { +! 75 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 +! 76 +! 77 +! 78 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 .30 +.31: +! 79 { +! 80 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 +! 81 } +! 82 else +! 83 { +jmp .32 +.30: +! 84 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 +! 85 } +! 86 +! 87 disk_service_read_data_from_disk(file->data_pointer[data_pointer_index], 4 , tmp_buffer); +.32: +! Debug: list * char tmp_buffer = [S+$18-$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+$1C-$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,*8 +!BCC_EOS +! 88 +! 89 memcpy(data, (tmp_buffer + remaining_offset), amount_to_read); +! Debug: list int amount_to_read = [S+$18-$12] (used reg = ) +push -$10[bp] +! Debug: ptradd int remaining_offset = [S+$1A-$14] to * char tmp_buffer = [S+$1A-$18] (used reg = ) +mov ax,-$12[bp] +add ax,-$16[bp] +! Debug: list * char = ax+0 (used reg = ) +push ax +! Debug: list * char data = [S+$1C+6] (used reg = ) +push 8[bp] +! Debug: func () void = memcpy+0 (used reg = ) +call _memcpy +add sp,*6 +!BCC_EOS +! 90 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 +! 91 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 +! 92 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 +! 93 +! 94 data_pointer_index++; +! Debug: postinc int data_pointer_index = [S+$18-$16] (used reg = ) +mov ax,-$14[bp] +inc ax +mov -$14[bp],ax +!BCC_EOS +! 95 +! 96 } +inc sp +inc sp +! 97 else +! 98 { +jmp .33 +.2E: +! 99 +! 100 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 +! 101 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 +! 102 } +! 103 +! 104 } +.33: +.2D: +! 105 # 109 +! 109 +! 110 return amount_read; +.24: +! Debug: gt int = const 0 to int data_length = [S+$16-$E] (used reg = ) +mov ax,-$C[bp] +test ax,ax +bgt .25 +.34: +.23: +mov ax,-$E[bp] +add sp,*$10 +pop si +pop di +pop bp +ret +!BCC_EOS +! 111 +! 112 } +! 113 +! Register BX used in function lsfs_disk_read_data_from_file +.data +.bss + +! 0 errors detected diff --git a/main.c b/main.c index 68081ff..4fb6417 100644 --- a/main.c +++ b/main.c @@ -1,111 +1,17 @@ -// Adress to dump ax, 7C2A -// Address to print 7C47 -// -// -#include "std_singos/stdio.h" -#include "std_singos/stdlib.h" - -#include "std_singos/string.h" -#include "driver/disk.h" - -#define SPACE_MBR_RECORD 2048 // Sectors -#define SPACE_VBR_RECORD 2048 // Sectors -#define SIZE_FSCI_RECORD 1 // Sectors -#define DEFAULT_ENTRY_SIZE 1 // Sectors -#define SECTOR_SIZE 512 // BYTES -#define NUMBER_OF_MBR_PARTITIONS 4 -#define DEFAULT_FILE_SIZE 4 // This is in sectors -#define DEFAULT_DATA_POINTER_SIZE 4 // This is in sectors -#define DEFAULT_TABLE_SIZE 16 -#define NUM_DATA_POINTERS 27 - -void dump_ax(input); -void print_stack(argument); -void print_newline(); - -typedef struct Directory_Table Directory_Table; -typedef struct Struct_Table_Entry Table_Entry; -typedef struct struct_partition_control partition_control; -typedef struct File_System_Control_Information FSCI; -typedef struct meta_information_format mif; -typedef struct tag_record tag_record; -typedef struct lsfs_file lsfs_file; -typedef struct Parameter_Struct Parameter_Struct; - -typedef enum Table_Entry_Kind -{ - // These are specific values since, is has to corrospond to the implementation in assembly - ENTRY_EMPTY = 0, - ENTRY_FILE = 1, - ENTRY_DIRECTORY = 2, -} Table_Entry_Kind; - -typedef enum Service_Action -{ - SERIVCE_LOAD_DISK = 1, - SERVICE_FIND_ENTRY = 2, - SERIVCE_READ_DATA = 3, - SERIVCE_WRITE_DATA = 4, - -} Service_Action; - -struct Struct_Table_Entry -{ - char filename[256]; - long file_id[2]; - long file_size[2]; - void* ext_file_data_low; - void* ext_file_data_high; - long number_sector_s; // <- Just try to remove the last undercore and compile . - short entry_kind; - short extra_control_bits1; - short extra_control_bits2; - short extra_control_bits3; - long table_entry_sector_index[2]; - long data_pointer[NUM_DATA_POINTERS * 2]; // if it is a directory, the first pointer will be to the next table. -}; - -struct File_System_Control_Information -{ - char filesystem_information[256]; - long master_table_index[2]; - long this_partition_offset_on_disk[2]; - long next_free_sector[2]; - long next_uniqe_id[2]; // both files and directories gets this. - long next_sector_reuse_pointer[2]; - long last_sector_index_on_partition[2]; - long maximum_sectors_on_disk[2]; - long sector_size_on_disk[2]; - long not_used[48]; - -}; - -typedef struct Directory_Table -{ - Table_Entry entries[DEFAULT_TABLE_SIZE]; - -}; - -struct Parameter_Struct -{ - char* path; - char* new_path; - int buffer_segment; - int buffer_address; - int buffer_size; - int data_length; - int byte_offset_into_file; - Table_Entry_Kind entry_kind; -}; +/* Adress to dump ax, 7C2A*/ +/* Address to print 7C47*/ +/* */ +/* */ +#include "main.h" int main(selector, pointer_parameter_segment, pointer_parameter_struct) int selector; void* pointer_parameter_segment; void* pointer_parameter_struct; { - // selectot should be a "selector" for which disk service - // one wnats to use. - // 0 should not be used, to try to ensure that a value has been set explicitly. + /* selectot should be a "selector" for which disk service*/ + /* one wnats to use. */ + /* 0 should not be used, to try to ensure that a value has been set explicitly. */ FSCI fsci; Service_Action service_action; @@ -177,7 +83,7 @@ void* pointer_parameter_struct; /* What do we need to know: path - // Buffer: + Buffer: destination_segment destination_address buffer_size @@ -199,4 +105,4 @@ void* pointer_parameter_struct; } -//void load_ +/* void load_*/ diff --git a/main.h b/main.h new file mode 100644 index 0000000..f094fa2 --- /dev/null +++ b/main.h @@ -0,0 +1,100 @@ +#ifndef MAIN_H +#define MAIN_H + +#define SPACE_MBR_RECORD 2048 /* Sectors*/ +#define SPACE_VBR_RECORD 2048 /* Sectors*/ +#define SIZE_FSCI_RECORD 1 /* Sectors*/ +#define DEFAULT_ENTRY_SIZE 1 /* Sectors*/ +#define SECTOR_SIZE 512 /* BYTES*/ +#define NUMBER_OF_MBR_PARTITIONS 4 +#define DEFAULT_FILE_SIZE 4 /* This is in sectors*/ +#define DEFAULT_DATA_POINTER_SIZE 4 /* This is in sectors*/ +#define DEFAULT_TABLE_SIZE 16 +#define NUM_DATA_POINTERS 27 + +#include "std_singos/stdio.h" +#include "std_singos/stdlib.h" + +#include "std_singos/string.h" +#include "driver/disk.h" +#include "implementation/lsfs.h" + +void dump_ax(input); +void print_stack(argument); +void print_newline(); + +typedef struct Directory_Table Directory_Table; +typedef struct Struct_Table_Entry Table_Entry; +typedef struct struct_partition_control partition_control; +typedef struct File_System_Control_Information FSCI; +typedef struct meta_information_format mif; +typedef struct tag_record tag_record; +typedef struct Parameter_Struct Parameter_Struct; + +typedef enum Table_Entry_Kind +{ + /* These are specific values since, is has to corrospond to the implementation in assembly*/ + ENTRY_EMPTY = 0, + ENTRY_FILE = 1, + ENTRY_DIRECTORY = 2, +} Table_Entry_Kind; + +typedef enum Service_Action +{ + SERIVCE_LOAD_DISK = 1, + SERVICE_FIND_ENTRY = 2, + SERIVCE_READ_DATA = 3, + SERIVCE_WRITE_DATA = 4, + +} Service_Action; + +struct Struct_Table_Entry +{ + char filename[256]; + long file_id[2]; + long file_size[2]; + void* ext_file_data_low; + void* ext_file_data_high; + long number_sector_s; /* <- Just try to remove the last undercore and compile . */ + short entry_kind; + short extra_control_bits1; + short extra_control_bits2; + short extra_control_bits3; + long table_entry_sector_index[2]; + long data_pointer[NUM_DATA_POINTERS * 2]; /* if it is a directory, the first pointer will be to the next table. */ +}; + +struct File_System_Control_Information +{ + char filesystem_information[256]; + long master_table_index[2]; + long this_partition_offset_on_disk[2]; + long next_free_sector[2]; + long next_uniqe_id[2]; /* both files and directories gets this. */ + long next_sector_reuse_pointer[2]; + long last_sector_index_on_partition[2]; + long maximum_sectors_on_disk[2]; + long sector_size_on_disk[2]; + long not_used[48]; + +}; + +typedef struct Directory_Table +{ + Table_Entry entries[DEFAULT_TABLE_SIZE]; + +}; + +struct Parameter_Struct +{ + char* path; + char* new_path; + int buffer_segment; + int buffer_address; + int buffer_size; + int data_length; + int byte_offset_into_file; + Table_Entry_Kind entry_kind; +}; + +#endif diff --git a/main.s b/main.s index 98b5b66..cbc41c3 100644 --- a/main.s +++ b/main.s @@ -9,9 +9,7 @@ pop bp retf ! 1 ! 1 # 1 "main.c" -! 1 # 5 -! 5 #include "std_singos/stdio.h" -! 1 +! 1 # 1 "std_singos/stdio.h" ! 1 void print(string); !BCC_EOS ! 2 void* dump_ax_return(input); @@ -121,7 +119,7 @@ ret ! 54 { export _print_newline _print_newline: -! 55 #asm +! 55 #asm !BCC_ASM printCRLF: @@ -131,12 +129,11 @@ _print_newline: mov al, #10 int #0x10 ret - ! 63 endasm +! 63 endasm !BCC_ENDASM ! 64 } ret -! 65 -! 6 # 1 "std_singos/stdlib.h" +! 65 # 1 "std_singos/stdlib.h" ! 1 unsigned int global_heap_start = 0; export _global_heap_start _global_heap_start: @@ -155,19 +152,21 @@ _global_heap_next: ! 4 ! 5 void* malloc(num_bytes); !BCC_EOS -! 6 int set_heap_settings(param_start, param_end); +! 6 void* calloc(number_elements, size); !BCC_EOS -! 7 unsigned int get_heap_next(); +! 7 int set_heap_settings(param_start, param_end); !BCC_EOS -! 8 -! 9 void* malloc(num_bytes) -! 10 int num_bytes; +! 8 unsigned int get_heap_next(); +!BCC_EOS +! 9 +! 10 void* malloc(num_bytes) +! 11 int num_bytes; .text export _malloc _malloc: !BCC_EOS -! 11 { -! 12 unsigned int allocated_pointer = global_heap_next; +! 12 { +! 13 unsigned int allocated_pointer = global_heap_next; push bp mov bp,sp push di @@ -178,21 +177,21 @@ dec sp mov ax,[_global_heap_next] mov -6[bp],ax !BCC_EOS -! 13 global_heap_next = global_heap_next + num_bytes; +! 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 -! 14 if (global_heap_next > global_heap_end) +! 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: -! 15 { -! 16 return 0; +! 16 { +! 17 return 0; xor ax,ax inc sp inc sp @@ -201,9 +200,9 @@ pop di pop bp ret !BCC_EOS -! 17 } -! 18 -! 19 return allocated_pointer; +! 18 } +! 19 +! 20 return allocated_pointer; .1: mov ax,-6[bp] inc sp @@ -213,17 +212,126 @@ pop di pop bp ret !BCC_EOS -! 20 } -! 21 -! 22 int set_heap_settings(param_start, param_end) -! 23 unsigned int param_start; +! 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 -! 24 unsigned int param_end; +! 50 unsigned int param_end; !BCC_EOS -! 25 { -! 26 global_heap_start = param_start; +! 51 { +! 52 global_heap_start = param_start; push bp mov bp,sp push di @@ -232,30 +340,30 @@ push si mov ax,4[bp] mov [_global_heap_start],ax !BCC_EOS -! 27 global_heap_next = param_start; +! 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 -! 28 global_heap_end = param_end; +! 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 -! 29 return 0; +! 55 return 0; xor ax,ax pop si pop di pop bp ret !BCC_EOS -! 30 } -! 31 -! 32 unsigned int get_heap_next() -! 33 { +! 56 } +! 57 +! 58 unsigned int get_heap_next() +! 59 { export _get_heap_next _get_heap_next: -! 34 return global_heap_next; +! 60 return global_heap_next; push bp mov bp,sp push di @@ -266,55 +374,56 @@ pop di pop bp ret !BCC_EOS -! 35 # 6 "main.c" -! 6 } -! 7 # 3 "std_singos/string.h" -! 3 typedef struct Length_String { -! 4 short dynamic; +! 61 # 16 "main.h" +! 16 } +! 17 # 2 "std_singos/string.h" +! 2 type +! 2 def struct Length_String { +! 3 short dynamic; !BCC_EOS -! 5 unsigned int length; +! 4 unsigned int length; !BCC_EOS -! 6 char *chars; +! 5 char *chars; !BCC_EOS -! 7 } Length_String; +! 6 } Length_String; !BCC_EOS -! 8 -! 9 typedef struct String_Array { -! 10 unsigned int length; +! 7 +! 8 typedef struct String_Array { +! 9 unsigned int length; !BCC_EOS -! 11 Length_String **strings; +! 10 Length_String **strings; !BCC_EOS -! 12 } String_Array; +! 11 } String_Array; !BCC_EOS -! 13 -! 14 void strcpy (destination, destination_segment, source, source_segment ); +! 12 +! 13 void strcpy (destination, destination_segment, source, source_segment ); !BCC_EOS -! 15 int strlen (source, source_segment); +! 14 int strlen (source, source_segment); !BCC_EOS -! 16 void memcpy (destination, destination_segment, source, source_segment, num_bytes ); +! 15 void memcpy (destination, destination_segment, source, source_segment, num_bytes ); !BCC_EOS -! 17 -! 18 -! 19 String_Array *string_split_c(string, delim, keep_delim); +! 16 +! 17 +! 18 String_Array *string_split_c(string, delim, keep_delim); !BCC_EOS -! 20 Length_String *make_length_string(length, chars); +! 19 Length_String *make_length_string(length, chars); !BCC_EOS -! 21 Length_String *make_length_string_c(cstring); +! 20 Length_String *make_length_string_c(cstring); !BCC_EOS -! 22 String_Array *length_string_split(string, delim, keep_delim); +! 21 String_Array *length_string_split(string, delim, keep_delim); !BCC_EOS -! 23 String_Array *create_length_string_array(array_size); +! 22 String_Array *create_length_string_array(array_size); !BCC_EOS -! 24 Length_String *create_length_string(length, chars); +! 23 Length_String *create_length_string(length, chars); !BCC_EOS +! 24 ! 25 ! 26 -! 27 -! 28 int strlen (source, source_segment) -! 29 { +! 27 int strlen (source, source_segment) +! 28 { export _strlen _strlen: -! 30 #asm +! 29 #asm !BCC_ASM _strlen.source set 2 _strlen.source_segment set 4 @@ -345,24 +454,24 @@ push bp pop bx pop ds pop bp -! 58 endasm +! 57 endasm !BCC_ENDASM -! 59 } +! 58 } ret -! 60 -! 61 void strcpy (destination, destination_segment, source, source_segment ) -! 62 char *destination; +! 59 +! 60 void strcpy (destination, destination_segment, source, source_segment ) +! 61 char *destination; export _strcpy _strcpy: !BCC_EOS -! 63 int destination_segment; +! 62 int destination_segment; !BCC_EOS -! 64 char *source; +! 63 char *source; !BCC_EOS -! 65 int source_segment; +! 64 int source_segment; !BCC_EOS -! 66 { -! 67 #asm +! 65 { +! 66 #asm !BCC_ASM _strcpy.source set 6 _strcpy.destination set 2 @@ -373,7 +482,7 @@ _strcpy.destination_segment set 4 ; IN di: the second (zero terminated) string ; OUT SF and ZF (same semantics as cmp) -! 73 77 +! 72 76 push bp mov bp,sp @@ -392,7 +501,7 @@ _strcpy.destination_segment set 4 mov si, ax mov ax, 10[bp]; ; mov ds, ax - mov cx, 0x050 + mov cx, 0x050 ;TODO(Jrn) Hardcded number of bytes to copy .label_strcpy_loop: movsb cmp cx, 0x0 @@ -408,26 +517,26 @@ _strcpy.destination_segment set 4 pop ax pop bp -! 111 endasm +! 110 endasm !BCC_ENDASM -! 112 } +! 111 } ret -! 113 -! 114 void memcpy (destination, destination_segment, source, source_segment, num_bytes) -! 115 void *destination; +! 112 +! 113 void memcpy (destination, destination_segment, source, source_segment, num_bytes) +! 114 void *destination; export _memcpy _memcpy: !BCC_EOS -! 116 int destination_segment; +! 115 int destination_segment; !BCC_EOS -! 117 void *source; +! 116 void *source; !BCC_EOS -! 118 int source_segment; +! 117 int source_segment; !BCC_EOS -! 119 int num_bytes; +! 118 int num_bytes; !BCC_EOS -! 120 { -! 121 #asm +! 119 { +! 120 #asm !BCC_ASM _memcpy.source set 6 _memcpy.destination set 2 @@ -439,7 +548,7 @@ _memcpy.destination_segment set 4 ; IN di: the second (zero terminated) string ; OUT SF and ZF (same semantics as cmp) -! 127 132 +! 126 131 push bp mov bp,sp @@ -474,23 +583,22 @@ _memcpy.destination_segment set 4 pop ax pop bp -! 166 endasm +! 165 endasm !BCC_ENDASM -! 167 } +! 166 } ret -! 168 -! 169 String_Array *string_split_c(string, delim, keep_delim) -! 170 char *string; +! 167 +! 168 String_Array *string_split_c(string, delim, keep_delim) +! 169 char *string; export _string_split_c _string_split_c: !BCC_EOS -! 171 char delim -! 171 ; +! 170 char delim; !BCC_EOS -! 172 short keep_delim; +! 171 short keep_delim; !BCC_EOS -! 173 { -! 174 return length_string_split(make_length_string_c(string), delim, keep_delim); +! 172 { +! 173 return length_string_split(make_length_string_c(string), delim, keep_delim); push bp mov bp,sp push di @@ -518,15 +626,15 @@ pop di pop bp ret !BCC_EOS -! 175 } -! 176 -! 177 Length_String *make_length_string_c(cstring) -! 178 char *cstring; +! 174 } +! 175 +! 176 Length_String *make_length_string_c(cstring) +! 177 char *cstring; export _make_length_string_c _make_length_string_c: !BCC_EOS -! 179 { -! 180 return make_length_string(strlen(cstring, 0x7e0), cstring); +! 178 { +! 179 return make_length_string(strlen(cstring, 0x7e0), cstring); push bp mov bp,sp push di @@ -552,18 +660,18 @@ pop di pop bp ret !BCC_EOS -! 181 } -! 182 -! 183 Length_String *make_length_string(length, chars) -! 184 unsigned int length; +! 180 } +! 181 +! 182 Length_String *make_length_string(length, chars) +! 183 unsigned int length; export _make_length_string _make_length_string: !BCC_EOS -! 185 char *chars; +! 184 char *chars; !BCC_EOS -! 186 { -! 187 -! 188 Length_String *legth_string = malloc(sizeof(Length_String)); +! 185 { +! 186 +! 187 Length_String *legth_string = malloc(sizeof(Length_String)); push bp mov bp,sp push di @@ -580,8 +688,7 @@ inc sp ! Debug: eq * void = ax+0 to * struct Length_String legth_string = [S+8-8] (used reg = ) mov -6[bp],ax !BCC_EOS -! 189 -! 190 char *copy = malloc(length + 1); +! 188 char *copy = malloc(length + 1); dec sp dec sp ! Debug: add int = const 1 to unsigned int length = [S+$A+2] (used reg = ) @@ -596,7 +703,7 @@ inc sp ! Debug: eq * void = ax+0 to * char copy = [S+$A-$A] (used reg = ) mov -8[bp],ax !BCC_EOS -! 191 memcpy(copy, 0x7e0, chars, 0x7e0, length); +! 189 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 = ) @@ -613,7 +720,7 @@ push -8[bp] call _memcpy add sp,*$A !BCC_EOS -! 192 copy[length] = ''; +! 190 copy[length] = ''; ! Debug: ptradd unsigned int length = [S+$A+2] to * char copy = [S+$A-$A] (used reg = ) mov ax,4[bp] add ax,-8[bp] @@ -622,27 +729,27 @@ mov bx,ax xor al,al mov [bx],al !BCC_EOS -! 193 -! 194 legth_string->dynamic = 0; +! 191 +! 192 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 -! 195 legth_string->length = length; +! 193 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 -! 196 legth_string->chars = (char *)chars; +! 194 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 -! 197 -! 198 return legth_string; +! 195 +! 196 return legth_string; mov ax,-6[bp] add sp,*4 pop si @@ -650,25 +757,26 @@ pop di pop bp ret !BCC_EOS -! 199 } -! 200 -! 201 String_Array *length_string_split(string, delim, keep_delim) +! 197 } +! 198 +! 199 String_Array *length_string_split(string, delim, keep_delim) ! Register BX SI used in function make_length_string -! 202 Length_String *string; +! 200 Length_String *string; export _length_string_split _length_string_split: !BCC_EOS -! 203 char delim; +! 201 char delim; !BCC_EOS -! 204 short keep_delim; +! 202 short keep_delim; !BCC_EOS -! 205 { -! 206 unsigned int i; +! 203 { +! 204 unsigned int i; !BCC_EOS -! 207 unsigned int last; +! 205 unsi +! 205 gned int last; !BCC_EOS -! 208 -! 209 unsigned int count = 0; +! 206 +! 207 unsigned int count = 0; push bp mov bp,sp push di @@ -678,33 +786,33 @@ add sp,*-6 xor ax,ax mov -$A[bp],ax !BCC_EOS -! 210 unsigned int insert_index = 0; +! 208 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 -! 211 String_Array *result; +! 209 String_Array *result; !BCC_EOS -! 212 int k; +! 210 int k; !BCC_EOS -! 213 -! 214 i = 0; +! 211 +! 212 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 -! 215 last = 0; +! 213 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 -! 216 while(i < string->length) { -jmp .4 -.5: -! 217 if (string->chars[i] == delim) { +! 214 while(i < string->length) { +jmp .B +.C: +! 215 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] @@ -713,64 +821,64 @@ mov bx,ax ! Debug: logeq char delim = [S+$12+4] to char = [bx+0] (used reg = ) mov al,[bx] cmp al,6[bp] -jne .6 -.7: -! 218 if (i > last+1) { +jne .D +.E: +! 216 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 .8 -.9: -! 219 ++count; +jae .F +.10: +! 217 ++count; ! Debug: preinc unsigned int count = [S+$12-$C] (used reg = ) mov ax,-$A[bp] inc ax mov -$A[bp],ax !BCC_EOS -! 220 } -! 221 last = i; -.8: +! 218 } +! 219 last = i; +.F: ! 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 -! 222 } -! 223 ++i; -.6: +! 220 } +! 221 ++i; +.D: ! Debug: preinc unsigned int i = [S+$12-8] (used reg = ) mov ax,-6[bp] inc ax mov -6[bp],ax !BCC_EOS -! 224 } -! 225 if (i > last+1) { -.4: +! 222 } +! 223 if (i > last+1) { +.B: 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 .5 +jb .C +.11: .A: -.3: ! 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 .B -.C: -! 226 ++count; +jae .12 +.13: +! 224 ++count; ! Debug: preinc unsigned int count = [S+$12-$C] (used reg = ) mov ax,-$A[bp] inc ax mov -$A[bp],ax !BCC_EOS -! 227 } -! 228 -! 229 result = create_length_string_array(count); -.B: +! 225 } +! 226 +! 227 result = create_length_string_array(count); +.12: ! 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 = ) @@ -780,45 +888,45 @@ 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 -! 230 -! 231 if (keep_delim) +! 228 +! 229 if (keep_delim) mov ax,8[bp] test ax,ax -je .D -.E: -! 232 { -! 233 k = 0; +je .14 +.15: +! 230 { +! 231 k = 0; ! Debug: eq int = const 0 to int k = [S+$12-$12] (used reg = ) xor ax,ax mov -$10[bp],ax !BCC_EOS -! 234 } -! 235 else -! 236 { -jmp .F -.D: -! 237 k = 1; +! 232 } +! 233 else +! 234 { +jmp .16 +.14: +! 235 k = 1; ! Debug: eq int = const 1 to int k = [S+$12-$12] (used reg = ) mov ax,*1 mov -$10[bp],ax !BCC_EOS -! 238 } -! 239 -! 240 i = 0; -.F: +! 236 } +! 237 +! 238 i = 0; +.16: ! Debug: eq int = const 0 to unsigned int i = [S+$12-8] (used reg = ) xor ax,ax mov -6[bp],ax !BCC_EOS -! 241 last = 0; +! 239 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 -! 242 while(i < string->length) { -jmp .11 -.12: -! 243 if (string->chars[i] == delim) { +! 240 while(i < string->length) { +jmp .18 +.19: +! 241 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] @@ -827,17 +935,17 @@ mov bx,ax ! Debug: logeq char delim = [S+$12+4] to char = [bx+0] (used reg = ) mov al,[bx] cmp al,6[bp] -jne .13 -.14: -! 244 if (i > last+1) { +jne .1A +.1B: +! 242 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 .15 -.16: -! 245 result->strings[insert_index++] = create_length_string(i-(last+k), string->chars+(last+k)); +jae .1C +.1D: +! 243 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] @@ -877,39 +985,39 @@ mov [bx],si inc sp inc sp !BCC_EOS -! 246 } -! 247 last = i; -.15: +! 244 } +! 245 last = i; +.1C: ! 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 -! 248 } -! 249 ++i; -.13: +! 246 } +! 247 ++i; +.1A: ! Debug: preinc unsigned int i = [S+$12-8] (used reg = ) mov ax,-6[bp] inc ax mov -6[bp],ax !BCC_EOS -! 250 } -! 251 if (i > last+1) { -.11: +! 248 } +! 249 if (i > last+1) { +.18: 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 .12 +jb .19 +.1E: .17: -.10: ! 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: -! 252 result->strings[insert_index++] = create_length_string(i-(last+k), ((string->chars)+(last+k))); +jae .1F +.20: +! 250 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] @@ -949,10 +1057,10 @@ mov [bx],si inc sp inc sp !BCC_EOS -! 253 } -! 254 -! 255 return result; -.18: +! 251 } +! 252 +! 253 return result; +.1F: mov ax,-$E[bp] add sp,*$C pop si @@ -960,17 +1068,17 @@ pop di pop bp ret !BCC_EOS +! 254 +! 255 } ! 256 -! 257 } -! 258 -! 259 String_Array *create_length_string_array(array_size) +! 257 String_Array *create_length_string_array(array_size) ! Register BX SI used in function length_string_split -! 260 int array_size; +! 258 int array_size; export _create_length_string_array _create_length_string_array: !BCC_EOS -! 261 { -! 262 String_Array *result = malloc(sizeof(String_Array)); +! 259 { +! 260 String_Array *result = malloc(sizeof(String_Array)); push bp mov bp,sp push di @@ -987,13 +1095,13 @@ inc sp ! Debug: eq * void = ax+0 to * struct String_Array result = [S+8-8] (used reg = ) mov -6[bp],ax !BCC_EOS -! 263 result->length = array_size; +! 261 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 -! 264 result->strings = malloc(array_size * sizeof(Length_String)); +! 262 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 @@ -1010,7 +1118,7 @@ mov bx,-6[bp] ! Debug: eq * void = ax+0 to * * struct Length_String = [bx+2] (used reg = ) mov 2[bx],ax !BCC_EOS -! 265 return result; +! 263 return result; mov ax,-6[bp] inc sp inc sp @@ -1019,21 +1127,20 @@ pop di pop bp ret !BCC_EOS -! 266 } -! 267 -! 268 -! 269 Length_String *create_length_str +! 264 } +! 265 +! 266 +! 267 Length_String *create_length_string(length, chars) ! Register BX used in function create_length_string_array -! 269 ing(length, chars) -! 270 unsigned int length; +! 268 unsigned int length; export _create_length_string _create_length_string: !BCC_EOS -! 271 char *chars; +! 269 char *chars; !BCC_EOS -! 272 { -! 273 -! 274 Length_String *legth_string = malloc(sizeof(Length_String)); +! 270 { +! 271 +! 272 Length_String *legth_string = malloc(sizeof(Length_String)); push bp mov bp,sp push di @@ -1050,7 +1157,7 @@ inc sp ! Debug: eq * void = ax+0 to * struct Length_String legth_string = [S+8-8] (used reg = ) mov -6[bp],ax !BCC_EOS -! 275 char *copy = malloc(length + 1); +! 273 char *copy = malloc(length + 1); dec sp dec sp ! Debug: add int = const 1 to unsigned int length = [S+$A+2] (used reg = ) @@ -1065,7 +1172,7 @@ inc sp ! Debug: eq * void = ax+0 to * char copy = [S+$A-$A] (used reg = ) mov -8[bp],ax !BCC_EOS -! 276 memcpy(copy, 0x7e0, chars, 0x7e0, length); +! 274 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 = ) @@ -1082,7 +1189,7 @@ push -8[bp] call _memcpy add sp,*$A !BCC_EOS -! 277 copy[length] = ''; +! 275 copy[length] = ''; ! Debug: ptradd unsigned int length = [S+$A+2] to * char copy = [S+$A-$A] (used reg = ) mov ax,4[bp] add ax,-8[bp] @@ -1091,27 +1198,27 @@ mov bx,ax xor al,al mov [bx],al !BCC_EOS -! 278 -! 279 legth_string->dynamic = 1; +! 276 +! 277 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 -! 280 legth_string->length = length; +! 278 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 -! 281 legth_string->chars = copy; +! 279 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 -! 282 -! 283 return legth_string; +! 280 +! 281 return legth_string; mov ax,-6[bp] add sp,*4 pop si @@ -1119,9 +1226,9 @@ pop di pop bp ret !BCC_EOS -! 284 # 8 "main.c" -! 8 } -! 9 # 1 "driver/disk.h" +! 282 # 18 "main.h" +! 18 } +! 19 # 1 "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 @@ -1190,17 +1297,10 @@ _disk_service_read_data_from_disk.index set 2 !BCC_ENDASM ! 52 } ret -! 53 # 12 "main.c" -! 12 #define SPACE_VBR_RECORD 2048 -! 13 -! 14 #define DEFAULT_ENTRY_SIZE 1 -! 15 -! 16 #define NUMBER_OF_MBR_PARTITIONS 4 -! 17 -! 18 #define DEFAULT_DATA_POINTER_SIZE 4 -! 19 -! 20 -! 21 +! 53 # 4 "implementation/lsfs.h" +! 4 typedef struct lsfs_file lsfs_file; +!BCC_EOS +! 5 # 22 "main.h" ! 22 void dump_ax(input); !BCC_EOS ! 23 void print_stack(argument); @@ -1214,144 +1314,142 @@ ret !BCC_EOS ! 28 typedef struct struct_partition_control partition_control; !BCC_EOS -! 29 typedef struct File_System_Control_ -! 29 Information FSCI; +! 29 typedef struct File_System_Control_Information FSCI; !BCC_EOS ! 30 typedef struct meta_information_format mif; !BCC_EOS ! 31 typedef struct tag_record tag_record; !BCC_EOS -! 32 typedef struct lsfs_file lsfs_file; +! 32 typedef struct Parameter_Struct Parameter_Struct; !BCC_EOS -! 33 typedef struct Parameter_Struct Parameter_Struct; +! 33 +! 34 typedef enum Table_Entry_Kind +! 35 { +! 36 +! 37 ENTRY_EMPTY = 0, +! 38 ENTRY_FILE = 1, +! 39 ENTRY_DIRECTORY = 2, +! 40 } Table_Entry_Kind; !BCC_EOS -! 34 -! 35 typedef enum Table_Entry_Kind -! 36 { -! 37 -! 38 ENTRY_EMPTY = 0, -! 39 ENTRY_FILE = 1, -! 40 ENTRY_DIRECTORY = 2, -! 41 } Table_Entry_Kind; -!BCC_EOS -! 42 -! 43 typedef enum Service_Action -! 44 { -! 45 SERIVCE_LOAD_DISK = 1, -! 46 SERVICE_FIND_ENTRY = 2, -! 47 SERIVCE_READ_DATA = 3, -! 48 SERIVCE_WRITE_DATA = 4, -! 49 -! 50 } Service_Action; +! 41 +! 42 typedef enum Service_Action +! 43 { +! 44 SERIVCE_LOAD_DISK = 1, +! 45 SERVICE_FIND_ENTRY = 2, +! 46 SERIVCE_READ_DATA = 3, +! 47 SERIVCE_WRITE_DATA = 4, +! 48 +! 49 } Service_Action; !BCC_EOS -! 51 -! 52 struct Struct_Table_Entry -! 53 { -! 54 char filename[256]; +! 50 +! 51 struct Struct_Table_Entry +! 52 { +! 53 char filename[256]; !BCC_EOS -! 55 long file_id[2]; +! 54 long file_id[2]; !BCC_EOS -! 56 long file_size[2]; +! 55 long file_size[2]; !BCC_EOS -! 57 void* ext_file_data_low; +! 56 void* ext_file_data_low; !BCC_EOS -! 58 void* ext_file_data_high; +! 57 void* ext_file_data_high; !BCC_EOS -! 59 long number_sector_s; +! 58 long number_sector_s; !BCC_EOS -! 60 short entry_kind; +! 59 short entry_kind; !BCC_EOS -! 61 short extra_control_bits1; +! 60 short extra_control_bits1; !BCC_EOS -! 62 short extra_control_bits2; +! 61 short extra_control_bits2; !BCC_EOS -! 63 short extra_control_bits3; +! 62 short extra_control_bits3; !BCC_EOS -! 64 long table_entry_sector_index[2]; +! 63 long table_entry_sector_index[2]; !BCC_EOS -! 65 long data_pointer[27 * 2]; +! 64 long data_pointer[27 * 2]; !BCC_EOS -! 66 }; +! 65 }; !BCC_EOS -! 67 -! 68 struct File_System_Control_Information -! 69 { -! 70 char filesystem_information[256]; +! 66 +! 67 struct File_Syst +! 67 em_Control_Information +! 68 { +! 69 char filesystem_information[256]; !BCC_EOS -! 71 long master_table_index[2]; +! 70 long master_table_index[2]; !BCC_EOS -! 72 long this_partition_offset_on_disk[2]; +! 71 long this_partition_offset_on_disk[2]; !BCC_EOS -! 73 long next_free_sector[2]; +! 72 long next_free_sector[2]; !BCC_EOS -! 74 long next_uniqe_id[2]; +! 73 long next_uniqe_id[2]; !BCC_EOS -! 75 long next_sector_reuse_pointer[2]; +! 74 long next_sector_reuse_pointer[2]; !BCC_EOS -! 76 long last_sector_index_on_partition[2]; +! 75 long last_sector_index_on_partition[2]; !BCC_EOS -! 77 long maximum_sectors_on_disk[2]; +! 76 long maximum_sectors_on_disk[2]; !BCC_EOS -! 78 long sector_size_on_disk[2]; +! 77 long sector_size_on_disk[2]; !BCC_EOS -! 79 long not_used[48]; +! 78 long not_used[48]; !BCC_EOS -! 80 -! 81 }; +! 79 +! 80 }; !BCC_EOS -! 82 -! 83 typedef struct Directory_Table -! 84 { -! 85 Table_Entry entries[16 ]; +! 81 +! 82 typedef struct Directory_Table +! 83 { +! 84 Table_Entry entries[16 ]; !BCC_EOS -! 86 -! 87 }; +! 85 +! 86 }; !BCC_EOS -! 88 -! 89 struct Parameter_Struct -! 90 { -! 91 char* path; +! 87 +! 88 struct Parameter_Struct +! 89 { +! 90 char* path; !BCC_EOS -! 92 char* new_path; +! 91 char* new_path; !BCC_EOS -! 93 int buffer_segment; +! 92 int buffer_segment; !BCC_EOS -! 94 int buffer_address; +! 93 int buffer_address; !BCC_EOS -! 95 int buffer_size; +! 94 int buffer_size; !BCC_EOS -! 96 int data_length; +! 95 int data_length; !BCC_EOS -! 97 int byte_offset_into_file; +! 96 int byte_offset_into_file; !BCC_EOS -! 98 Table_Entry_Kind entry_kind; +! 97 Table_Entry_Kind entry_kind; !BCC_EOS -! 99 }; +! 98 }; !BCC_EOS -! 100 -! 101 int main(selector, pointer_parameter_segment, pointer_parameter_struct) -! 102 int selector; +! 99 # 7 "main.c" +! 7 int main(selector, pointer_parameter_segment, pointer_parameter_struct) +! 8 int selector; export _main _main: !BCC_EOS -! 103 void* pointer_parameter_segment; +! 9 void* pointer_parameter_segment; !BCC_EOS -! 104 void* pointer_parameter_struct; +! 10 void* pointer_parameter_struct; !BCC_EOS -! 105 { -! 106 -! 107 -! 108 -! 109 FSCI fsci; +! 11 { +! 12 +! 13 +! 14 +! 15 FSCI fsci; !BCC_EOS -! 110 -! 111 Service_Action service_action; +! 16 +! 17 Service_Action service_action; !BCC_EOS -! 112 Directory_Table current_table; +! 18 Directory_Table current_table; !BCC_EOS -! 113 Parameter_Struct parameter_struct; +! 19 Parameter_Struct parameter_struct; !BCC_EOS -! 114 int local_segment = 0x7e0; +! 20 int local_segment = 0x7e0; push bp mov bp,sp push di @@ -1361,64 +1459,63 @@ add sp,#-$2214 mov ax,#$7E0 mov -$2218[bp],ax !BCC_EOS -! 115 unsigned int heap_start = 0x2000; +! 21 unsigned int heap_start = 0x2000; dec sp dec sp ! Debug: eq int = const $2000 to unsigned int heap_start = [S+$221C-$221C] (used reg = ) mov ax,#$2000 mov -$221A[bp],ax !BCC_EOS -! 116 unsigned int heap_end = 0xffff; +! 22 unsigned int heap_end = 0xffff; dec sp dec sp ! Debug: eq unsigned int = const $FFFF to unsigned int heap_end = [S+$221E-$221E] (used reg = ) mov ax,#$FFFF mov -$221C[bp],ax !BCC_EOS -! 117 int stack_segment = 0x8fc0; +! 23 int stack_segment = 0x8fc0; dec sp dec sp ! Debug: eq unsigned int = const $8FC0 to int stack_segment = [S+$2220-$2220] (used reg = ) mov ax,#$8FC0 mov -$221E[bp],ax !BCC_EOS -! 118 int path_length; +! 24 int path_length; !BCC_EOS -! 119 long index_as_long; +! 25 long index_as_long; !BCC_EOS -! 120 -! 121 -! 121 char *local_path = 0; +! 26 +! 27 char *local_path = 0; add sp,*-8 ! Debug: eq int = const 0 to * char local_path = [S+$2228-$2228] (used reg = ) xor ax,ax mov -$2226[bp],ax !BCC_EOS -! 122 service_action = selector; +! 28 service_action = selector; ! Debug: eq int selector = [S+$2228+2] to int service_action = [S+$2228-$208] (used reg = ) mov ax,4[bp] mov -$206[bp],ax !BCC_EOS -! 123 -! 124 switch (service_action) +! 29 +! 30 switch (service_action) mov ax,-$206[bp] -! 125 { -br .1C -! 126 case SERIVCE_LOAD_DISK: -! 127 { -.1D: -! 128 -! 129 -! 130 -! 131 -! 132 index_as_long = pointer_parameter_struct; +! 31 { +br .23 +! 32 case SERIVCE_LOAD_DISK: +! 33 { +.24: +! 34 +! 35 +! 36 +! 37 +! 38 index_as_long = pointer_parameter_struct; ! Debug: eq * void pointer_parameter_struct = [S+$2228+6] to long index_as_long = [S+$2228-$2226] (used reg = ) mov ax,8[bp] xor bx,bx mov -$2224[bp],ax mov -$2222[bp],bx !BCC_EOS -! 133 disk_service_read_data_from_disk(index_as_long, 1, &fsci, stack_segment); +! 39 disk_service_read_data_from_disk(index_as_long, 1, &fsci, stack_segment); ! Debug: list int stack_segment = [S+$2228-$2220] (used reg = ) push -$221E[bp] ! Debug: list * struct File_System_Control_Information fsci = S+$222A-$206 (used reg = ) @@ -1434,20 +1531,20 @@ push -$2224[bp] call _disk_service_read_data_from_disk add sp,*$A !BCC_EOS -! 134 print("File System has been loaded: "); -! Debug: list * char = .1E+0 (used reg = ) -mov bx,#.1E +! 40 print("File System has been loaded: "); +! Debug: list * char = .25+0 (used reg = ) +mov bx,#.25 push bx ! Debug: func () void = print+0 (used reg = ) call _print inc sp inc sp !BCC_EOS -! 135 print_newline(); +! 41 print_newline(); ! Debug: func () void = print_newline+0 (used reg = ) call _print_newline !BCC_EOS -! 136 set_heap_settings(heap_start, heap_end); +! 42 set_heap_settings(heap_start, heap_end); ! Debug: list unsigned int heap_end = [S+$2228-$221E] (used reg = ) push -$221C[bp] ! Debug: list unsigned int heap_start = [S+$222A-$221C] (used reg = ) @@ -1456,7 +1553,7 @@ push -$221A[bp] call _set_heap_settings add sp,*4 !BCC_EOS -! 137 print_stack(fsci.filesystem_information); +! 43 print_stack(fsci.filesystem_information); ! Debug: list * char fsci = S+$2228-$206 (used reg = ) lea bx,-$204[bp] push bx @@ -1465,21 +1562,21 @@ call _print_stack inc sp inc sp !BCC_EOS -! 138 print_newline(); +! 44 print_newline(); ! Debug: func () void = print_newline+0 (used reg = ) call _print_newline !BCC_EOS -! 139 } break; -br .1A +! 45 } break; +br .21 !BCC_EOS -! 140 case SERVICE_FIND_ENTRY: -! 141 { -.1F: -! 142 String_Array *path_array; +! 46 case SERVICE_FIND_ENTRY: +! 47 { +.26: +! 48 String_Array *path_array; !BCC_EOS -! 143 int i; +! 49 int i; !BCC_EOS -! 144 memcpy(¶meter_struct, stack_segment, pointer_parameter_struct, pointer_parameter_segment, sizeof(Parameter_Struct)); +! 50 memcpy(¶meter_struct, stack_segment, pointer_parameter_struct, pointer_parameter_segment, sizeof(Parameter_Struct)); ! Debug: list int = const $10 (used reg = ) mov ax,*$10 push ax @@ -1496,7 +1593,7 @@ push bx call _memcpy add sp,*$A !BCC_EOS -! 145 path_length = strlen(parameter_struct.path, pointer_parameter_segment); +! 51 path_length = strlen(parameter_struct.path, pointer_parameter_segment); ! Debug: list * void pointer_parameter_segment = [S+$222C+4] (used reg = ) push 6[bp] ! Debug: list * char parameter_struct = [S+$222E-$2218] (used reg = ) @@ -1507,7 +1604,7 @@ add sp,*4 ! Debug: eq int = ax+0 to int path_length = [S+$222C-$2222] (used reg = ) mov -$2220[bp],ax !BCC_EOS -! 146 local_path = malloc(256); +! 52 local_path = malloc(256); ! Debug: list int = const $100 (used reg = ) mov ax,#$100 push ax @@ -1518,7 +1615,8 @@ inc sp ! Debug: eq * void = ax+0 to * char local_path = [S+$222C-$2228] (used reg = ) mov -$2226[bp],ax !BCC_EOS -! 147 memcpy(local_path, local_segment, parameter_struct.path, pointer_parameter_segment, path_length); +! 53 +! 53 memcpy(local_path, local_segment, parameter_struct.path, pointer_parameter_segment, path_length); ! Debug: list int path_length = [S+$222C-$2222] (used reg = ) push -$2220[bp] ! Debug: list * void pointer_parameter_segment = [S+$222E+4] (used reg = ) @@ -1533,7 +1631,7 @@ push -$2226[bp] call _memcpy add sp,*$A !BCC_EOS -! 148 local_path[path_length] = 0; +! 54 local_path[path_length] = 0; ! Debug: ptradd int path_length = [S+$222C-$2222] to * char local_path = [S+$222C-$2228] (used reg = ) mov ax,-$2220[bp] add ax,-$2226[bp] @@ -1542,7 +1640,7 @@ mov bx,ax xor al,al mov [bx],al !BCC_EOS -! 149 print(local_path); +! 55 print(local_path); ! Debug: list * char local_path = [S+$222C-$2228] (used reg = ) push -$2226[bp] ! Debug: func () void = print+0 (used reg = ) @@ -1550,8 +1648,8 @@ call _print inc sp inc sp !BCC_EOS -! 150 -! 151 path_array = string_split_c(local_path, '/', 0); +! 56 +! 57 path_array = string_split_c(local_path, '/', 0); ! Debug: list int = const 0 (used reg = ) xor ax,ax push ax @@ -1566,25 +1664,25 @@ add sp,*6 ! Debug: eq * struct String_Array = ax+0 to * struct String_Array path_array = [S+$222C-$222A] (used reg = ) mov -$2228[bp],ax !BCC_EOS -! 152 -! 153 print_newline(); +! 58 +! 59 print_newline(); ! Debug: func () void = print_newline+0 (used reg = ) call _print_newline !BCC_EOS -! 154 print_newline(); +! 60 print_newline(); ! Debug: func () void = print_newline+0 (used reg = ) call _print_newline !BCC_EOS -! 155 for (i = 0; i < path_array->length; ++i) +! 61 for (i = 0; i < path_array->length; ++i) ! Debug: eq int = const 0 to int i = [S+$222C-$222C] (used reg = ) xor ax,ax mov -$222A[bp],ax !BCC_EOS !BCC_EOS -! 156 { -jmp .22 -.23: -! 157 print(path_array->strings[i]->chars); +! 62 { +jmp .29 +.2A: +! 63 print(path_array->strings[i]->chars); mov bx,-$2228[bp] ! Debug: ptradd int i = [S+$222C-$222C] to * * struct Length_String = [bx+2] (used reg = ) mov ax,-$222A[bp] @@ -1599,38 +1697,38 @@ call _print inc sp inc sp !BCC_EOS -! 158 print_newline(); +! 64 print_newline(); ! Debug: func () void = print_newline+0 (used reg = ) call _print_newline !BCC_EOS -! 159 } -! 160 print_newline(); -.21: +! 65 } +! 66 print_newline(); +.28: ! Debug: preinc int i = [S+$222C-$222C] (used reg = ) mov ax,-$222A[bp] inc ax mov -$222A[bp],ax -.22: +.29: mov bx,-$2228[bp] ! Debug: lt unsigned int = [bx+0] to int i = [S+$222C-$222C] (used reg = ) mov ax,-$222A[bp] cmp ax,[bx] -jb .23 -.24: -.20: +jb .2A +.2B: +.27: ! Debug: func () void = print_newline+0 (used reg = ) call _print_newline !BCC_EOS -! 161 print_newline(); +! 67 print_newline(); ! Debug: func () void = print_newline+0 (used reg = ) call _print_newline !BCC_EOS -! 162 -! 163 print_newline(); +! 68 +! 69 print_newline(); ! Debug: func () void = print_newline+0 (used reg = ) call _print_newline !BCC_EOS -! 164 disk_service_read_data_from_disk(fsci.master_table_index[0], 16 , ¤t_table, stack_segment); +! 70 disk_service_read_data_from_disk(fsci.master_table_index[0], 16 , ¤t_table, stack_segment); ! Debug: list int stack_segment = [S+$222C-$2220] (used reg = ) push -$221E[bp] ! Debug: list * struct Directory_Table current_table = S+$222E-$2208 (used reg = ) @@ -1646,20 +1744,20 @@ push -$104[bp] call _disk_service_read_data_from_disk add sp,*$A !BCC_EOS -! 165 print("Current table: "); -! Debug: list * char = .25+0 (used reg = ) -mov bx,#.25 +! 71 print("Current table: "); +! Debug: list * char = .2C+0 (used reg = ) +mov bx,#.2C push bx ! Debug: func () void = print+0 (used reg = ) call _print inc sp inc sp !BCC_EOS -! 166 print_newline(); +! 72 print_newline(); ! Debug: func () void = print_newline+0 (used reg = ) call _print_newline !BCC_EOS -! 167 print_stack(current_table.entries[0].filename); +! 73 print_stack(current_table.entries[0].filename); ! Debug: list * char current_table = S+$222C-$2208 (used reg = ) lea bx,-$2206[bp] push bx @@ -1668,11 +1766,11 @@ call _print_stack inc sp inc sp !BCC_EOS -! 168 print_newline(); +! 74 print_newline(); ! Debug: func () void = print_newline+0 (used reg = ) call _print_newline !BCC_EOS -! 169 print_stack(current_table.entries[1].filename); +! 75 print_stack(current_table.entries[1].filename); ! Debug: list * char current_table = S+$222C-$2008 (used reg = ) lea bx,-$2006[bp] push bx @@ -1681,11 +1779,11 @@ call _print_stack inc sp inc sp !BCC_EOS -! 170 print_newline(); +! 76 print_newline(); ! Debug: func () void = print_newline+0 (used reg = ) call _print_newline !BCC_EOS -! 171 print_stack(current_table.entries[2].filename); +! 77 print_stack(current_table.entries[2].filename); ! Debug: list * char current_table = S+$222C-$1E08 (used reg = ) lea bx,-$1E06[bp] push bx @@ -1694,76 +1792,75 @@ call _print_stack inc sp inc sp !BCC_EOS -! 172 print_newline(); +! 78 print_newline(); ! Debug: func () void = print_newline+0 (used reg = ) call _print_newline !BCC_EOS -! 173 -! 174 } break; -jmp .1A +! 79 +! 80 } break; +jmp .21 !BCC_EOS -! 175 case SERIVCE_READ_DATA: -! 176 { -.26: -! 177 # 185 -! 185 -! 186 print("Hit READ case"); -! Debug: list * char = .27+0 (used reg = ) -mov bx,#.27 +! 81 case SERIVCE_READ_DATA: +! 82 { +.2D: +! 83 # 91 +! 91 +! 92 print("Hit READ case"); +! Debug: list * char = .2E+0 (used reg = ) +mov bx,#.2E push bx ! Debug: func () void = print+0 (used reg = ) call _print inc sp inc sp !BCC_EOS -! 187 } break; -jmp .1A +! 93 } break; +jmp .21 !BCC_EOS -! 188 case SERI -! 188 VCE_WRITE_DATA: -! 189 { -.28: -! 190 print("Hit WRITE case"); -! Debug: list * char = .29+0 (used reg = ) -mov bx,#.29 +! 94 case SERIVCE_WRITE_DATA: +! 95 { +.2F: +! 96 print("Hit WRITE case"); +! Debug: list * char = .30+0 (used reg = ) +mov bx,#.30 push bx ! Debug: func () void = print+0 (used reg = ) call _print inc sp inc sp !BCC_EOS -! 191 } break; -jmp .1A +! 97 } break; +jmp .21 !BCC_EOS -! 192 default: -! 193 { -.2A: -! 194 print("Default case"); -! Debug: list * char = .2B+0 (used reg = ) -mov bx,#.2B +! 98 default: +! 99 { +.31: +! 100 print("Default case"); +! Debug: list * char = .32+0 (used reg = ) +mov bx,#.32 push bx ! Debug: func () void = print+0 (used reg = ) call _print inc sp inc sp !BCC_EOS -! 195 } -! 196 } -! 197 -! 198 return 0; -jmp .1A -.1C: +! 101 } +! 102 } +! 103 +! 104 return 0; +jmp .21 +.23: add sp,*-4 sub ax,*1 -beq .1D +beq .24 sub ax,*1 -beq .1F +beq .26 sub ax,*1 -je .26 +je .2D sub ax,*1 -je .28 -jmp .2A -.1A: +je .2F +jmp .31 +.21: ..FFFF = -$222C add sp,*4 xor ax,ax @@ -1773,28 +1870,28 @@ pop di pop bp ret !BCC_EOS -! 199 -! 200 } -! 201 +! 105 +! 106 } +! 107 ! Register BX used in function main -.2B: -.2C: +.32: +.33: .ascii "Default case" .byte 0 -.29: -.2D: +.30: +.34: .ascii "Hit WRITE case" .byte 0 -.27: .2E: +.35: .ascii "Hit READ case" .byte 0 -.25: -.2F: +.2C: +.36: .ascii "Current table: " .byte 0 -.1E: -.30: +.25: +.37: .ascii "File System has been loaded: " .byte 0 .bss diff --git a/std_singos/stdlib.h b/std_singos/stdlib.h index e40eb7f..7e7bebe 100644 --- a/std_singos/stdlib.h +++ b/std_singos/stdlib.h @@ -3,6 +3,7 @@ unsigned int global_heap_end = 0; unsigned int global_heap_next = 0; void* malloc(num_bytes); +void* calloc(number_elements, size); int set_heap_settings(param_start, param_end); unsigned int get_heap_next(); @@ -19,6 +20,31 @@ int num_bytes; return allocated_pointer; } +void* calloc(number_elements, size) +unsigned int number_elements; +unsigned int size; +{ + int i; + char* temp_pointer; + unsigned int num_bytes = number_elements * size; + void* allocated_pointer = global_heap_next; + global_heap_next = global_heap_next + num_bytes; + if (global_heap_next > global_heap_end) + { + return 0; /* No more memory */ + } + + /* Since this is calloc, we set the memory to zero */ + temp_pointer = allocated_pointer; + for (i = 0; i < num_bytes; ++i) + { + *temp_pointer = 0; + temp_pointer++; + } + + return allocated_pointer; +} + int set_heap_settings(param_start, param_end) unsigned int param_start; unsigned int param_end; diff --git a/std_singos/string.h b/std_singos/string.h index 683d7f8..6a6fbca 100644 --- a/std_singos/string.h +++ b/std_singos/string.h @@ -1,5 +1,4 @@ - typedef struct Length_String { short dynamic; unsigned int length; @@ -15,7 +14,7 @@ void strcpy (destination, destination_segment, source, source_segment ); int strlen (source, source_segment); void memcpy (destination, destination_segment, source, source_segment, num_bytes ); -// Additionals to standard c lib. +/* Additionals to standard c lib. */ String_Array *string_split_c(string, delim, keep_delim); Length_String *make_length_string(length, chars); Length_String *make_length_string_c(cstring); @@ -92,7 +91,7 @@ int source_segment; mov si, ax mov ax, SOURCE_SEGMENT; mov ds, ax - mov cx, 0x050 // TODO(Jørn) Hardcded number of bytes to copy + mov cx, 0x050 ;TODO(Jørn) Hardcded number of bytes to copy .label_strcpy_loop: movsb cmp cx, 0x0 @@ -186,8 +185,7 @@ char *chars; { Length_String *legth_string = malloc(sizeof(Length_String)); - - char *copy = malloc(length + 1); // Space for null terminator + char *copy = malloc(length + 1); /* Space for null terminator */ memcpy(copy, 0x7e0, chars, 0x7e0, length); copy[length] = '\0'; @@ -272,7 +270,7 @@ char *chars; { Length_String *legth_string = malloc(sizeof(Length_String)); - char *copy = malloc(length + 1); // Space for null terminator + char *copy = malloc(length + 1); /* Space for null terminator */ memcpy(copy, 0x7e0, chars, 0x7e0, length); copy[length] = '\0';