multiboot.pp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. unit multiboot;
  2. interface
  3. type
  4. PMBModule = ^TMBModule;
  5. TMBModule = packed record
  6. mod_start,
  7. mod_end: PtrUInt;
  8. name: pchar;
  9. reserved: DWord;
  10. end;
  11. PMemoryMap = ^TMemoryMap;
  12. TMemoryMap = packed record
  13. size,
  14. base_lower,
  15. base_upper,
  16. length_lower,
  17. length_upper,
  18. mtype: DWord;
  19. end;
  20. PElfSectionHeaderTable = ^TElfSectionHeaderTable;
  21. TElfSectionHeaderTable = packed record
  22. num,
  23. size,
  24. addr,
  25. shndx: DWord;
  26. end;
  27. PMultibootinfo = ^TMultibootinfo;
  28. TMultiBootInfo = packed record
  29. Flags,
  30. MemLower, MemUpper,
  31. BootDevice,
  32. CmdLine,
  33. ModuleCount: DWord;
  34. ModuleAddress: PMBModule;
  35. ElfSection: TElfSectionHeaderTable;
  36. MMapLength: longint;
  37. MMapAddress: PMemoryMap;
  38. end;
  39. var MultibootTable: PMultibootinfo;
  40. implementation
  41. {$asmmode att}
  42. procedure MultibootHeader; nostackframe; assembler;
  43. const
  44. MULTIBOOT_PAGE_ALIGN = 1; // Align modules on a 4kB boundary
  45. MULTIBOOT_MEMORY_INFO = 2; // Memory info table is valid
  46. MULTIBOOT_AOUT_KLUDGE = 1 shl 16; // A.OUT kludge follows the header
  47. MultibootSig = $1BADB002;
  48. MultibootFlags = MULTIBOOT_MEMORY_INFO;
  49. MultibootChksum = -(MultibootSig + MultibootFlags);
  50. asm
  51. .init
  52. .long MultibootSig
  53. .long MultibootFlags
  54. .long MultibootChksum
  55. .text
  56. end;
  57. procedure haltproc; assembler; nostackframe; public name '_haltproc';
  58. asm
  59. .Lloop:
  60. jmp .Lloop
  61. end;
  62. procedure PASCALMAIN; external name 'PASCALMAIN';
  63. procedure Start; assembler; nostackframe; public name '_START';
  64. asm
  65. cli
  66. movl %ebx, MultibootTable
  67. jmp PASCALMAIN
  68. end;
  69. end.