Instruction.mod 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. IMPLEMENTATION MODULE Instruction ;
  2. FROM Memory IMPORT ReadByte, ReadWord, ReadSlot, WriteSlot ;
  3. FROM Local IMPORT GetIP, SetIP, GetSP, SetSP, GetFP, SetFP, GetGP, SetGP,
  4. GetOFP, SetOFP ;
  5. FROM Stack IMPORT Push, Pop, Reserve ;
  6. FROM Global IMPORT GetModuleProcs, GetCurrentModule, SetCurrentModule,
  7. FindModuleByBase, GetModuleBase ;
  8. PROCEDURE Fetch () : CARDINAL ;
  9. VAR b: CARDINAL ;
  10. BEGIN
  11. b := ReadByte (GetIP ()) ;
  12. SetIP (GetIP () + 1) ;
  13. RETURN b ;
  14. END Fetch ;
  15. PROCEDURE FetchSignedByte () : INTEGER ;
  16. VAR b: CARDINAL ;
  17. BEGIN
  18. b := Fetch () ;
  19. IF b >= 128 THEN
  20. RETURN VAL (INTEGER, b) - 256 ;
  21. ELSE
  22. RETURN VAL (INTEGER, b) ;
  23. END ;
  24. END FetchSignedByte ;
  25. PROCEDURE FetchWord () : CARDINAL ;
  26. VAR v: CARDINAL ;
  27. BEGIN
  28. v := ReadWord (GetIP ()) ;
  29. SetIP (GetIP () + 4) ;
  30. RETURN v ;
  31. END FetchWord ;
  32. PROCEDURE FetchSignedWord () : INTEGER ;
  33. BEGIN
  34. RETURN VAL (INTEGER, FetchWord ()) ;
  35. END FetchSignedWord ;
  36. PROCEDURE FetchQuad () : LONGCARD ;
  37. VAR v: LONGCARD ;
  38. BEGIN
  39. v := ReadSlot (GetIP ()) ;
  40. SetIP (GetIP () + 8) ;
  41. RETURN v ;
  42. END FetchQuad ;
  43. PROCEDURE LoadString (n: CARDINAL) ;
  44. BEGIN
  45. Push (GetIP ()) ;
  46. SetIP (GetIP () + VAL (LONGCARD, n)) ;
  47. END LoadString ;
  48. PROCEDURE ProcedureAddress (mod, obj: CARDINAL) : LONGCARD ;
  49. VAR slot, rel: LONGCARD ;
  50. BEGIN
  51. slot := GetModuleProcs (mod) + VAL (LONGCARD, obj) * 8 ;
  52. rel := ReadSlot (slot) ;
  53. RETURN slot + VAL (LONGCARD, VAL (LONGINT, rel)) ;
  54. END ProcedureAddress ;
  55. PROCEDURE CallProcedure (mod, obj: CARDINAL) ;
  56. BEGIN
  57. Push (ProcedureAddress (mod, obj)) ;
  58. END CallProcedure ;
  59. PROCEDURE Enter (k: CARDINAL) ;
  60. BEGIN
  61. Push (GetFP ()) ;
  62. Push (GetOFP ()) ;
  63. SetFP (GetSP ()) ;
  64. Push (GetIP ()) ;
  65. SetSP (GetSP () - VAL (LONGCARD, 255 - k) * 8) ;
  66. END Enter ;
  67. PROCEDURE Leave (n: CARDINAL) ;
  68. BEGIN
  69. SetSP (GetFP ()) ;
  70. SetOFP (Pop ()) ;
  71. SetFP (Pop ()) ;
  72. SetIP (Pop ()) ;
  73. IF (n MOD 128) # 0 THEN
  74. SetSP (GetSP () + VAL (LONGCARD, n MOD 128) * 8) ;
  75. END ;
  76. IF n >= 128 THEN
  77. SetGP (GetOFP ()) ;
  78. SetCurrentModule (FindModuleByBase (GetGP ())) ;
  79. SetGP (GetModuleBase (GetCurrentModule ())) ;
  80. END ;
  81. END Leave ;
  82. END Instruction.