home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / jËzyki_programowania / oberon / system / amigabase.mod (.txt) < prev    next >
Oberon Text  |  1977-12-31  |  2KB  |  84 lines

  1. Syntax10.Scn.Fnt
  2. Syntax20.Scn.Fnt
  3. MODULE AmigaBase; (* cn/shml 8-Mar-1993 *)
  4. IMPORT
  5.  S:=SYSTEM;
  6. CONST
  7.  d0*=0; d1*=1; d2*=2; d3*=3; d4*=4; d5*=5; d6*=6; d7*=7;
  8.  a0*=8; a1*=9; a2*=10; a3*=11; a4*=12; a5*=13; a6*=14; a7*=15;
  9.  Regs*=RECORD
  10.   d*:ARRAY 8 OF LONGINT;
  11.   a*:ARRAY 6 OF LONGINT;
  12.  END;
  13.  LibProc=PROCEDURE;
  14.  base:LONGINT;
  15.  proc:LONGINT;
  16.  tmpR:Regs;
  17. PROCEDURE -PushA6 2FH,0EH;
  18. (* MOVE.L A6,-(A7) *)
  19.     NOTE
  20.         The following two procedures are dependent on the compiler
  21.         code generation, as they contain PC-relative offsets.
  22.     (* NEW COMPILER *)
  23.     PROCEDURE -Call 04EH,0BBH,001H,061H,0FFH,086H;
  24.     (* new compiler: JSR (-8,SB=-122(PC))  (base) *)
  25.     PROCEDURE -StoreA0 04DH,0FAH,0FFH,068H,02CH,088H;
  26.     (* new compiler: LEA -32,SB=-152(PC),A6   MOVE.L A0,(A6) *)
  27.     (* OLD COMPILER *)
  28.     PROCEDURE -Call 04EH,0BBH,001H,061H,0FFH,082H;
  29.     (* old compiler: JSR (-8,SB=-126(PC))  (base) *)
  30.     PROCEDURE -StoreA0 04DH,0FAH,0FFH,064H,02CH,088H;
  31.     (* old compiler: LEA -32,SB=-156(PC),A6   MOVE.L A0,(A6) *)
  32. PROCEDURE -PopA6 02CH,05FH;
  33. PROCEDURE LibCall*(libBase:LONGINT; offset:LONGINT; VAR r:Regs);
  34.  WARNING: LibCall is *NOT* reentrant.
  35. BEGIN
  36.  tmpR:=r;
  37.  base:=libBase;
  38.  proc:=libBase+offset;
  39.  S.PUTREG(a0,tmpR.a[0]);
  40.  S.PUTREG(a1,tmpR.a[1]);
  41.  S.PUTREG(a2,tmpR.a[2]);
  42.  S.PUTREG(a3,tmpR.a[3]);
  43.  S.PUTREG(a4,tmpR.a[4]);
  44.  S.PUTREG(a5,tmpR.a[5]);
  45.  S.PUTREG(d0,tmpR.d[0]);
  46.  S.PUTREG(d1,tmpR.d[1]);
  47.  S.PUTREG(d2,tmpR.d[2]);
  48.  S.PUTREG(d3,tmpR.d[3]);
  49.  S.PUTREG(d4,tmpR.d[4]);
  50.  S.PUTREG(d5,tmpR.d[5]);
  51.  S.PUTREG(d6,tmpR.d[6]);
  52.  S.PUTREG(d7,tmpR.d[7]);
  53.  PushA6;
  54.  S.PUTREG(a6,base);
  55.  Call;
  56. (* proc(); Uses A0 register, therfore replaced by assembler hack *)
  57.  StoreA0;
  58. (* S.GETREG(a0,tmpR.a[0]); destroys A0 before saving, therefore assembler needed *)
  59.  PopA6;
  60. (* S.GETREG(d0,tmpR.d[0]);
  61.  S.GETREG(d1,tmpR.d[1]);
  62.  S.GETREG(d2,tmpR.d[2]);
  63.  S.GETREG(d3,tmpR.d[3]);
  64.  S.GETREG(d4,tmpR.d[4]);
  65.  S.GETREG(d5,tmpR.d[5]);
  66.  S.GETREG(d6,tmpR.d[6]);
  67.  S.GETREG(d7,tmpR.d[7]);
  68.  S.GETREG(a1,tmpR.a[1]);
  69.  S.GETREG(a2,tmpR.a[2]);
  70.  S.GETREG(a3,tmpR.a[3]);
  71.  S.GETREG(a4,tmpR.a[4]);
  72.  S.GETREG(a5,tmpR.a[5]);
  73.  r:=tmpR;*)
  74.  S.GETREG(d0,r.d[0]); (* I think that is enough *)
  75.  S.GETREG(d1,r.d[1]);
  76. END LibCall;
  77. PROCEDURE ExecBase*():LONGINT;
  78.  p:LONGINT;
  79. BEGIN
  80.  S.GET(4,p);
  81.  RETURN p;
  82. END ExecBase;
  83. END AmigaBase.
  84.