Porting low-level DOS code for TP/BP to GO32v2 with FPC/id

From Lazarus wiki
Jump to: navigation, search

English (en) Bahasa Indonesia (id)

"Kode DOS tingkat-rendah" merujuk ke rutin assembler, pemakaian fungsi DOS dan BIOS, dll. Halaman ini mencoba untuk menyediakan petunjuk yang berkenaan dengan hal umum yang menarik ketika mengalihkan kode tersebut yang asalnya ditulis untuk TP/BP ke target GO32v2 dengan FPC (atau mungkin target lain yang mirip seperti WDOSX). Jangan mengharapkan tutorial detil - mencampurkan kode tingkat-rendah selalu memerlukan banyak pengetahuan dan pengalaman, dan mengalihkan kode 16-bit lama yang ditulis untuk mode real ke 32-bit mode protected bahkan menjadi lebih rumit.

  1. Baca manual, wiki dan pernyataan kontribusi milis pada konvensi pemanggilan FPC (misalnya bagaimana parameter dioperkan ke function/procedure dan bagaimana organisasi stack dan seperti apa pemrosesannya) - ini tentunya berbeda dengan TP/BP. Selain itu, ini termasuk perubahan kode menggunakan [bp].
  2. Secara umum, anda harus menggunakan register 32-bit daripada register 16-bit (Saya percaya ada beberapa penurunan kecepatan pada beberapa CPU saat menggunakan register 16-bit, tapi yang lebih penting, fungsi yang dipakai kembali (seperti disediakan oleh DPMI host) mungkin _memerlukan_ penyediaan parameter dalam register 32-bit sebagai kebalikan dari fungsi standar DOS) - misalnya eax daripada ax, dll.
  3. Jika Anda perlu untuk menukar data dengan kode 16-bit seperti fungsi BIOS (ya, ini termasuk fungsi membaca/menulis sektor), pemakaian bufer memori harus ditempatkan dalam area memori di mana kode 16-bit bisa mengaksesnya (= di dalam MB pertama pada RAM) jika kode Anda mengalokasikan bufer dan Anda perlu memastikan bahwa Anda dapat mengaksesnya juga. Ini dilakukan dengan menggunakan fungsi DPMI (baca spesifikasi DPMI untuk keterangan lebih lanjut, atau setidaknya melihat pada beberapa kode FPC RTL yang menggunakan fungsi int 31h ini).
  4. Secara umum, Anda tidak menyentuh register segmwn manapun - semua data tersedia dalam model memori flat, di mana semuanya tersedia menggunakan pengalamatan 32-bit dan ds=es=ss (misalnya tidak ada instruksi seperti lds/les yang diperlukan, tidak ada mov es:[xx],yy, dll.). Ada satu kekecualian secara langsung terkait dengan poin sebelumnya mengenai berbagi data dengan kode 16-bit - jika Anda mengoper parameters ke/menerima hasil dari kode/fungsi 16-bit, Anda perlu menterjemahkan alamat 16:16 16-bit ke alamat 0:32 yang dipakai dalam kode 32-bit dan sebaliknya (seperti dijelaskan di atas) dan selanjutnya jelas Anda perlu untuk mengubah beberapa register segmen juga segera sebelum/setelah fungsi panggil 16-bit (akan tetapi, kasus ini normalnya diselesaikan menggunakan fungsi bantuan seperti fungsi dukungan DPMI untuk memanggil interupsi 16-bit, misalnya kode Anda tidak ingin bercampur dengan register segmen).
  5. Implementasi rutin layanan interupsi atau callback yang dipicu dari mode real memerlukan pemakaian fitur khusus seperi penguncian memori, dll. - baca spesifikasi DPMI dan mungkin melihat implementasi pada unit Mouse untuk GO32v2.