n8086util.pas 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. {
  2. Copyright (c) 2014 by Nikolay Nikolov
  3. i8086 version of some node tree helper routines
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. ****************************************************************************
  16. }
  17. unit n8086util;
  18. {$i fpcdefs.inc}
  19. interface
  20. uses
  21. ngenutil;
  22. type
  23. ti8086nodeutils = class(tnodeutils)
  24. class procedure InsertMemorySizes; override;
  25. class procedure InsertStackSegment;
  26. end;
  27. implementation
  28. uses
  29. sysutils,cutils,
  30. globtype,globals,cpuinfo,
  31. aasmbase,aasmdata,aasmtai;
  32. class procedure ti8086nodeutils.InsertMemorySizes;
  33. begin
  34. inherited;
  35. if current_settings.x86memorymodel in x86_far_data_models then
  36. InsertStackSegment;
  37. end;
  38. class procedure ti8086nodeutils.InsertStackSegment;
  39. var
  40. stacksizeleft,stackblock: LongInt;
  41. i: Integer;
  42. begin
  43. maybe_new_object_file(current_asmdata.asmlists[al_globals]);
  44. new_section(current_asmdata.asmlists[al_globals],sec_stack,'__stack', 16);
  45. current_asmdata.asmlists[al_globals].concat(tai_symbol.Createname_global('___stack', AT_DATA, stacksize));
  46. { HACK: since tai_datablock's size parameter is aint, which cannot be
  47. larger than 32767 on i8086, but we'd like to support stack size of
  48. up to 64kb, we may need to use several tai_datablocks to reserve
  49. the stack segment }
  50. i:=0;
  51. stacksizeleft:=stacksize;
  52. while stacksizeleft>0 do
  53. begin
  54. stackblock:=min(stacksizeleft,high(aint));
  55. current_asmdata.asmlists[al_globals].concat(tai_datablock.Create('___stackblock'+IntToStr(i),stackblock));
  56. dec(stacksizeleft,stackblock);
  57. inc(i);
  58. end;
  59. end;
  60. begin
  61. cnodeutils:=ti8086nodeutils;
  62. end.