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

From Lazarus wiki
Revision as of 20:30, 5 January 2008 by Adezm (talk | contribs)
Jump to navigationJump to search

"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. In general, you don't touch any segment registers - all your data are available in flat memory model, where everything is available using 32-bit addressing and ds=es=ss (i.e. no instructions like lds/les needed, no mov es:[xx],yy, etc.). There's one exception directly related to the previous point related to sharing data with 16-bit code - if you pass parameters to/receive results from 16-bit code/functions, you need to translate the 16:16 16-bit addresses to 0:32 addresses used in 32-bit code and vice versa (as described above) and then you obviously might need to change some segment registers too immediately before/after the 16-bit function call (however, these cases are normally solved using helper functions like the DPMI support function for calling 16-bit interrupts, i.e. your code wouldn't be directly messing with segment registers anyway).
  5. Implementation of interrupt service routines or callbacks triggered from real mode requires using special features like locking of memory, etc. - read DPMI specification and potentially have a look at implementation of unit Mouse for GO32v2.