Seri Bedah Kode RezaOS — Bagian 9: Dinamika Animasi dan Manajemen Waktu Boot Services

Setelah menyiapkan geometri dan jalur latar belakang pada bagian sebelumnya, tahap selanjutnya adalah menghidupkan antarmuka tersebut. Dalam pengembangan sistem operasi, memberikan umpan balik visual (visual feedback) sangatlah penting untuk menunjukkan bahwa proses inisialisasi sedang berlangsung secara aktif. Tanpa animasi, pengguna mungkin akan mengira sistem mengalami kegagalan fungsi (hang) selama fase pemuatan kernel.

Bagian ini akan membedah secara mendalam logika pergerakan piksel, penggunaan layanan waktu UEFI (Stall), serta mekanisme konfirmasi status akhir proses.


1. Logika Pengisian Bar: Iterasi Kolom-per-Kolom

Untuk menciptakan efek “mengisi”, kita tidak menggambar seluruh kotak sekaligus, melainkan menggambar garis vertikal tipis secara berurutan dari kiri ke kanan.

// Animasi Pengisian Bar
for (UINT32 i = 0; i < BarWidth; i++) {
    for (UINT32 t = 0; t < BarHeight; t++) {
         UINT32 Index = ((BarY + t) * PixelsPerScanLine) + (BarXStart + i);
         VideoBuffer[Index] = WarnaLoading;
    }
    // Delay 20ms per pixel
    uefi_call_wrapper(SystemTable->BootServices->Stall, 1, 20000); 
}

Analisis Teknis Perulangan:

  • Loop Eksternal (i): Mengontrol pergerakan horizontal (poros X). Nilai i merepresentasikan kemajuan (progress) dari 0 hingga BarWidth (300 piksel).
  • Loop Internal (t): Mengontrol ketebalan vertikal (poros Y). Pada setiap posisi X, kita mewarnai piksel sebanyak BarHeight (4 piksel) ke bawah agar garis terlihat sebagai batang, bukan sekadar titik.
  • Kalkulasi Indeks Memori: Rumus ((BarY + t) * PixelsPerScanLine) + (BarXStart + i) memastikan bahwa warna WarnaLoading (Cyan) menimpa jalur abu-abu tepat di posisi yang sama secara presisi di dalam framebuffer.

2. Manajemen Waktu dengan Boot Services Stall

Salah satu tantangan dalam pemrograman bare-metal adalah CPU bekerja sangat cepat. Tanpa intervensi waktu, loop di atas akan selesai dalam hitungan mikrodetik, sehingga animasi tidak akan terlihat oleh mata manusia. Di sinilah fungsi Stall berperan.

uefi_call_wrapper(SystemTable->BootServices->Stall, 1, 20000);

Bedah Teknis Fungsi Stall:

  • Unit Waktu: Fungsi Stall menerima parameter dalam satuan mikrodetik (µs).
  • Konversi Waktu: Kode di atas menggunakan nilai 20.000. Secara matematis:
    • 20.000 µs = 20 milidetik (ms).
  • Estimasi Durasi Total: Karena batang memiliki lebar 300 piksel, total waktu pemuatan dapat dihitung:
    • 300 piksel * 20 ms/piksel = 6.000 ms = 6 detik.
  • Akurasi: Fungsi Stall di tingkat firmware sangat akurat karena sering kali menggunakan hardware timer internal CPU atau chipset (seperti HPET atau APIC timer).

3. Konfirmasi Status Akhir: Pesan [ OK ]

Setelah animasi pengisian selesai, sistem harus memberikan konfirmasi visual terakhir bahwa fase pemuatan telah berhasil diselesaikan sebelum berlanjut ke tahap berikutnya.

// 7. FINISH - Tampilkan pesan siap
uefi_call_wrapper(SystemTable->ConOut->SetCursorPosition, 2, SystemTable->ConOut, 32, 14);
Print(L"    [ OK ]    ");

Analisis Penempatan:

  • Sinkronisasi Posisi: Kita memindahkan kursor ke kolom 32 dan baris 14. Posisi ini berada tepat di bawah loading bar yang baru saja selesai diisi.
  • Estetika Teks: Penggunaan kurung siku [ OK ] adalah konvensi standar dalam dunia sistem operasi (seperti pada proses boot Linux) untuk menandakan keberhasilan sebuah layanan atau fase.
  • Spasi Tambahan: Penambahan spasi di awal dan akhir teks berfungsi untuk memastikan teks tersebut terlihat terpusat (centered) relatif terhadap lebar loading bar di atasnya.

Kesimpulan Bagian 9

Bab ini menunjukkan bagaimana RezaOS berinteraksi dengan dimensi waktu. Melalui perpaduan antara manipulasi memori video yang linear dan pemanfaatan layanan timer dari firmware, kita berhasil menciptakan pengalaman pengguna yang dinamis dan informatif. Animasi ini merupakan jembatan psikologis yang meyakinkan pengguna bahwa sistem sedang mempersiapkan kernel untuk mengambil alih kendali sepenuhnya.


Langkah Selanjutnya:

Pada bagian kesepuluh sekaligus penutup dari seri bedah kode ini, kita akan membahas mengenai Infinite Loop (Halt) dan Return Status. Kita akan melihat bagaimana sistem “menahan” diri agar tampilan tetap bertahan dan bagaimana standar protokol pengembalian status bekerja di UEFI.