Skip to content

Commit

Permalink
Refactor for less apps size
Browse files Browse the repository at this point in the history
  • Loading branch information
marfgold1 committed Apr 30, 2022
1 parent 241b9df commit c4bcf1d
Show file tree
Hide file tree
Showing 21 changed files with 427 additions and 289 deletions.
42 changes: 28 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,30 +54,45 @@ Selain implementasi yang diwajibkan pada spesifikasi _milestone_, dilakukan pula
Pada _milestone 3_, ada beberapa implementasi tambahan:
1. Pembuatan _library_ dan _syscall_ `executeProgram`
- Fungsionalitas-fungsionalitas yang ada sebelumnya dipindahkan ke beberapa library (dalam folder `src/library` seperti berikut:
- `args.c`: fungsionalitas untuk melakukan _parsing_ argumen dan valdiasi direktori
- `args.c`: fungsionalitas untuk melakukan _parsing_ argumen dan validasi direktori
- `fileio.c`: fungsionalitas untuk melakukan penulisan dan pembacaan file (implementasi lebih lanjut dari _read/write_)
- `program.c`: inisialisasi program
- `shell_common.c`: fungsionalitas untuk mengatur _shell_
- `std_lib.c`: seperti milestone sebelumnya, std_lib mengandung fungsi-fungsi dasar seperti mod, div, memcpy, strcpy, dan lain-lain
- `std_lib.c`: seperti milestone sebelumnya, std_lib mengandung fungsi-fungsi dasar seperti mod, div, memcpy, dan lain-lain
- `string.c`: fungsi-fungsi untuk melakukan operasi pada string (strcpy, strcat, strlen)
- `syscall.c`: fungsionalitas layar yang diterjemahkan dalam bentuk _system call_
- `textio.c`: fungsi-fungsi untuk meng-_handle_ input/output program (gets/puts)
- `syscall.c`: fungsionalitas lain yang diterjemahkan dalam bentuk _system call_
- `textio.c`: fungsi-fungsi untuk meng-_handle_ input/output program `(gets/puts)`
- Pemanggilan fungsi-fungsi pada _library_ dilakukan via `handleInterrupt21`, yang mengatur fungsi-fungsi yang harus dijalankan melalui _interrupt_ tertentu. Implementasi `executeProgram` juga telah dilakukan di _kernel_.
2. Pembuatan aplikasi _shell_
- Shell yang sebelumnya terpasang di _kernel_ via model _shared memory_ diubah menjadi model _message passing_. _Shell_ dan fungsionalitas dalam _shell_ diletakkan dalam folder `apps`
- Aplikasi di folder `apps` dapat diakses secara _global_ maupun _local_
- Eksekusi local dapat dilakukan dengan:
- `/bin/<nama util>`, misalkan `/bin/cat <nama file>`
- `cd` ke folder `bin`, lalu gunakan utilitas dengan sintaks `./<nama util>`, misal `./cat <nama file>`
- **Absolute path:** `/bin/<nama util>`, misalkan `/bin/cat <nama file>`
- **Relative path:** `cd` ke folder `bin`, lalu gunakan utilitas dengan sintaks `./<nama util>`, misal `./cat <nama file>`
3. _Multiple program_
- Pengguna dapat melakukan eksekusi _utility_ secara berantai. Eksekusi _utility_ memanfaatkan `exit` per eksekusinya.
- Pengguna dapat melakukan eksekusi _utility_ secara berantai. Eksekusi _utility_ memanfaatkan mesage passing dan `exit` per eksekusinya.

Selain implementasi yang diwajibkan pada spesifikasi _milestone_, dilakukan pula implementasi tambahan sebagai tujuan kreativitas sebagai berikut:

1. Pembuatan permainan Snake pada `apps`
2. Pembuatan _text editor_ Nano pada `apps`
- Layaknya utilitas sebelumnya, eksekusi kedua ini memanfaatkan `exit`.
3. Kompilasi OS dapat dilakukan dengan opsi aplikasi apa saja yang ingin di-include (lebih lanjut di bagian **Cara Menjalankan OS**)
4. Pengguna dapat menambahkan program baru dengan cara berikut:
1. Buat file di dalam folder `apps` dengan nama yang diinginkan
2. Pastikan struktur kode seperti berikut:
```c
#include "../library/program.h"

int main() {
struct shell_data data;
getShellData(&data);
// Kode diletakkan disini
exit(&data);
}
```
3. Gunakan library yang tersedia seperti textio.h, string.h, fileio.h dengan `#include "../library/<nama_library>"`.
4. Tidak perlu melakukan perubahan pada makefile, program otomatis akan diinjeksi ke dalam sistem operasi.
5. Silahkan melakukan eksplorasi sebebas-bebasnya ^_^
### Requirements
Expand All @@ -96,18 +111,17 @@ Selain implementasi yang diwajibkan pada spesifikasi _milestone_, dilakukan pula
```
2. Buka WSL2, lalu navigasi ke _folder_ `root` dan jalankan perintah berikut untuk melakukan instalasi _library_:
```
```shell
sudo apt update
sudo apt install nasm bcc bin86 bochs bochs-x make
```

Selanjutnya, jalankan kompilasi makefile menggunakan perintah berikut:
Selanjutnya, jalankan kompilasi makefile menggunakan salah satu dari perintah berikut:

```
```shell
make build-run //untuk menjalankan kompilasi seperti biasa
make tc-run TC=<KARAKTER> // untuk menjalankan kompilasi dengan
test case tertentu
make tc-run APPS="shell <urutan rantai aplikasi>" // untuk menjalankan kompilasi dengan aplikasi tertentu
make tc-run TC=<KARAKTER> // untuk menjalankan kompilasi dengan test case tertentu
make tc-run APPS="shell <urutan rantai aplikasi, dipisahkan dengan spasi>" // untuk menjalankan kompilasi dengan aplikasi tertentu. Contoh: make tc-run APPS="shell cp snake mv".
```
**[IMPORTANT]** Keterbatasan _node_ akan menyebabkan beberapa _testcase_ tidak ter-_load_ secara penuh, misalnya testcase B yang menggunakan seluruh _node_
Expand Down
22 changes: 22 additions & 0 deletions src/c/apps/help.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#include "../library/program.h"
#include "../library/textio.h"

int main() {
struct shell_data data;
getShellData(&data);
endl;
putsc("cd <DEST>", COLOR_LIGHT_CYAN);
puts("- Moves current working directory to destination path"); endl;
putsc("ls", COLOR_LIGHT_CYAN);
puts(" - Displays content of current directory"); endl;
putsc("mv <FILE> <DEST_PATH>", COLOR_LIGHT_CYAN);
puts(" - Moves a file to destination path"); endl;
putsc("mkdir <DIR_NAME>", COLOR_LIGHT_CYAN);
puts(" - Creates a new directory in current working directory"); endl;
putsc("cat <FILE>", COLOR_LIGHT_CYAN);
puts(" - Prints the content of a file"); endl;
putsc("cp <FILE> <DEST_PATH> / <NEW_NAME>", COLOR_LIGHT_CYAN);
puts(" - Copies a file to a path or to the same path with different name"); endl;
endl;
exit(&data);
}
25 changes: 25 additions & 0 deletions src/c/apps/ily.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#include "../library/program.h"
#include "../library/textio.h"
#include "../library/string.h"

int main() {
struct shell_data data;
bool is_valid = false;
getShellData(&data);
puts("i "); putsc("love", COLOR_LIGHT_RED); puts(" you, so "); putsc("much.", COLOR_LIGHT_GREEN); endl;
puts("please be my "); putsc("angel", COLOR_LIGHT_MAGENTA); puts(", "); putsc("baby.", COLOR_LIGHT_BLUE); endl;
while (!is_valid) {
puts("your response: (yes/no) "); gets(data.cwd.input); endl;
is_valid = strcmp(data.cwd.input, "yes") || strcmp(data.cwd.input, "no");
if (is_valid) {
if (strcmp(data.cwd.input,"yes")) {
puts("thank you "); putsc("<3", COLOR_LIGHT_MAGENTA); endl;
} else {
putsc("asge.", COLOR_LIGHT_RED); endl;
}
} else {
putsc("invalid response.", COLOR_LIGHT_RED); endl;
}
}
exit(&data);
}
3 changes: 1 addition & 2 deletions src/c/apps/mkdir.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,14 @@ void main(){
char* path;
struct parsed_arg args;
struct shell_data data;
struct node_entry node;
struct file_metadata metadata;
enum fs_retcode ret;
getShellData(&data);
if (data.cwd.arg_count > 1 && data.cwd.arg_count <= 5) {
for(i=1; i<data.cwd.arg_count; i++) {
path = data.arg.argv[i];
parsePathArg(path, data.cwd.current_dir, &args);
if (checkIsExist(path, args.arg_ldir) && checkIsDirectory(&node, path, args.arg_ldir)) {
if (checkIsExist(path, args.arg_ldir) && checkIsDirectory(args.node, path, args.arg_ldir)) {
metadata.parent_index = args.arg_ldir;
metadata.buffer = 0;
strcpy(metadata.node_name, args.name_res);
Expand Down
23 changes: 22 additions & 1 deletion src/c/apps/shell.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#include "../library/program.h"
#include "../library/textio.h"
#include "../library/fileio.h"
#include "../library/string.h"
#include "../library/syscall.h"

void printCWD(byte current_dir);

Expand All @@ -15,7 +17,26 @@ int main() {
puts(" >> ");
gets(data.cwd.input);
endl;
runner(&data);
if (strcmp("cls", data.cwd.input)){
cls();
} else if (strcmp("help", data.cwd.input)) {
endl;
putsc("cd <DEST>", COLOR_LIGHT_CYAN);
puts("- Moves current working directory to destination path"); endl;
putsc("ls", COLOR_LIGHT_CYAN);
puts(" - Displays content of current directory"); endl;
putsc("mv <FILE> <DEST_PATH>", COLOR_LIGHT_CYAN);
puts(" - Moves a file to destination path"); endl;
putsc("mkdir <DIR_NAME>", COLOR_LIGHT_CYAN);
puts(" - Creates a new directory in current working directory"); endl;
putsc("cat <FILE>", COLOR_LIGHT_CYAN);
puts(" - Prints the content of a file"); endl;
putsc("cp <FILE> <DEST_PATH> / <NEW_NAME>", COLOR_LIGHT_CYAN);
puts(" - Copies a file to a path or to the same path with different name"); endl;
endl;
} else {
runner(&data);
}
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/c/apps/snake.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ int main() {
curPos[0] = 0;
}
if (curPos[1] < 0) {
curPos[1] = MAX_CURSOR_Y;
} else if (curPos[1] > MAX_CURSOR_Y) {
curPos[1] = MAX_CURSOR_Y - 1;
} else if (curPos[1] > MAX_CURSOR_Y - 1) {
curPos[1] = 0;
}
cnt = 0;
Expand Down
22 changes: 22 additions & 0 deletions src/c/apps/title.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#include "../library/program.h"
#include "../library/textio.h"

int main() {
struct shell_data data;
getShellData(&data);
putsc("====================================================", 0x0A); endl;
putsc("|| _ _ _____ _____ _____ ||", 0x0A); endl;
putsc("|| | \\ | | | _ / ___| / __ \\ ||", 0x0A); endl;
putsc("|| | \\| | _____ _| | | \\ `--. ______| / \\/ ||", 0x0A); endl;
putsc("|| | . ` |/ _ \\ \\ /\\ / / | | |`--. \\______| | ||", 0x0A); endl;
putsc("|| | |\\ | __/\\ V V /\\ \\_/ /\\__/ / | \\__/\\ ||", 0x0A); endl;
putsc("|| \\_| \\_/\\___| \\_/\\_/ \\___/\\____/ \\____/ ||", 0x0A); endl;
putsc("|| v.3.0.0 ||", 0x0A); endl;
putsc("====================================================", 0x0A); endl;
putsc(" Made by three dudes: ", 0x0A); endl;
putsc("- 13520103 - Amar Fadil", 0x0A); endl;
putsc("- 13520124 - Owen Christian Wijaya", 0x0A); endl;
putsc("- 13520139 - Fachry Dennis Heraldi", 0x0A); endl;
endl;endl;
exit(&data);
}
44 changes: 44 additions & 0 deletions src/c/includes/struct_lib.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#ifndef __STRUCT_LIB_H
#define __STRUCT_LIB_H

#include "constant.h"
#include "std_type.h"

struct parsed_arg {
byte arg_cdir;
byte arg_ldir;
char name_res[14];
struct node_entry *node;
bool is_traversed; // is traversed with apply path (absolute/relative)
};

// 256 * 8 (2048 / 4 sector) args
struct shell_arguments {
char argv[MAX_ARGS][MAX_INPUT];
};

enum parser_retcode {
INPUT_TRAIL = 0,
INPUT_END = 1,
UNCLOSED_STRING = 2,
ARG_LIMIT = 3
};

// 256 + 1 + 2 + 2 (512/1 sector) input
struct shell_cwd {
char input[MAX_INPUT];
byte current_dir;
int cur_inp_idx;
int arg_count;
int prog_count;
enum parser_retcode parse_ret;
};

// 256 + 1 + 2 + 2 (1 sector) + 4 sector arg + 4 sector hist
// shell data starts from sector 0x120
struct shell_data {
struct shell_cwd cwd;
struct shell_arguments arg;
};

#endif
47 changes: 27 additions & 20 deletions src/c/kernel/kernel.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,21 @@
#include "../system/keyboard.h"
#include "../includes/constant.h"
#include "../system/filesystem.h"
#include "../system/program.h"
#include "kernel.h"

int main()
{
int i = 0, j = 0;
struct file_metadata shell_bin;
enum fs_retcode ret;
byte buffer[512 * 16];
bool is_title_avail;
makeInterrupt21();
intr(INT_VIDEO, VIDEO_MODE, 0, 0, 0); // set video mode to 03
fillMap(); // call fillMap function
// find shell and read it.
strcpy(shell_bin.node_name, "shell");
shell_bin.buffer = buffer;
clear(buffer, 512*16);
shell_bin.parent_index = 0;
read(&shell_bin, &ret);
if (ret == 0) {
printTitle();
// load once
for (i = 0; i < 8192; i++) {
putInMemory(0x2000, i, buffer[i]);
}
executeProgram(0x2000);
// find title and read it
if (!__init("shell", 0x2000, 0x0)) {
printStringColored("Error loading OS...\nCan't find shell executable. Please rebuild the OS and include shell app.", COLOR_LIGHT_RED);
} else {
printStringColored("Error loading OS...\nCan't find shell executable. Please rebuild the OS.", COLOR_LIGHT_RED);
is_title_avail = __init("title", 0x3000, 0x0);
executeProgram((is_title_avail ? 0x3000 : 0x2000));
}
while(true);
}
Expand Down Expand Up @@ -123,11 +112,29 @@ void handleInterrupt21(int ax, int bx, int cx, int dx) {
break;
}
break;
case 0x5:
case 0x5: // program and arguments utils
switch (REG_H(ax)) {
case 0:
case 0x0:
executeProgram(bx);
break;
case 0x1:
parseArgs(bx);
break;
case 0x2:
parsePathArg(bx, cx, dx);
break;
case 0x3:
ax = isDirectory(bx, cx);
break;
case 0x4:
ax = initProgram(bx, cx);
break;
case 0x9:
getShellData(bx);
break;
case 0xA:
setShellData(bx);
break;
default:
break;
}
Expand Down
Loading

1 comment on commit c4bcf1d

@Lock1
Copy link

@Lock1 Lock1 commented on c4bcf1d May 3, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lancar jaya milestone 3-nya. Snakenya ngegas gan kalo ga di-throttle IPS-nya

Please sign in to comment.