t28_farparam.pas 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. program t28;
  2. var
  3. g : integer ;
  4. unused : integer ;
  5. (* Seventy parameters, laid out the way TP3 lays them out: the LAST declared
  6. one sits at BP+4 and each earlier parameter is 2 bytes farther from BP, so
  7. p1 is at +142 and p8 at +128 -- the first offsets an 8-bit displacement
  8. cannot represent -- and their accesses must use the 4-byte mod=10 form;
  9. that is what check_framedisp.py asserts.
  10. A call caps at 16 arguments, so p1..p54 are never passed and reading them
  11. returns stack garbage. `unused' takes that sum and is never printed, so
  12. the point of the fixture is the ENCODING and the printed value must stay
  13. deterministic. The 16 arguments that ARE passed land on p55..p70, which
  14. is why `g' reads those two: p55 is where the FIRST argument goes and p70
  15. is where the LAST one goes, so p55 + p70 = 1 + 16. Do not read any of
  16. this as a claim that a 70-argument call works. *)
  17. procedure far (p1 : integer,
  18. p2 : integer,
  19. p3 : integer,
  20. p4 : integer,
  21. p5 : integer,
  22. p6 : integer,
  23. p7 : integer,
  24. p8 : integer,
  25. p9 : integer,
  26. p10 : integer,
  27. p11 : integer,
  28. p12 : integer,
  29. p13 : integer,
  30. p14 : integer,
  31. p15 : integer,
  32. p16 : integer,
  33. p17 : integer,
  34. p18 : integer,
  35. p19 : integer,
  36. p20 : integer,
  37. p21 : integer,
  38. p22 : integer,
  39. p23 : integer,
  40. p24 : integer,
  41. p25 : integer,
  42. p26 : integer,
  43. p27 : integer,
  44. p28 : integer,
  45. p29 : integer,
  46. p30 : integer,
  47. p31 : integer,
  48. p32 : integer,
  49. p33 : integer,
  50. p34 : integer,
  51. p35 : integer,
  52. p36 : integer,
  53. p37 : integer,
  54. p38 : integer,
  55. p39 : integer,
  56. p40 : integer,
  57. p41 : integer,
  58. p42 : integer,
  59. p43 : integer,
  60. p44 : integer,
  61. p45 : integer,
  62. p46 : integer,
  63. p47 : integer,
  64. p48 : integer,
  65. p49 : integer,
  66. p50 : integer,
  67. p51 : integer,
  68. p52 : integer,
  69. p53 : integer,
  70. p54 : integer,
  71. p55 : integer,
  72. p56 : integer,
  73. p57 : integer,
  74. p58 : integer,
  75. p59 : integer,
  76. p60 : integer,
  77. p61 : integer,
  78. p62 : integer,
  79. p63 : integer,
  80. p64 : integer,
  81. p65 : integer,
  82. p66 : integer,
  83. p67 : integer,
  84. p68 : integer,
  85. p69 : integer,
  86. p70 : integer) ;
  87. begin
  88. g := p55 + p70 ;
  89. unused := p8 + p1
  90. end ;
  91. begin
  92. far (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) ;
  93. writeln (g)
  94. end.