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 >
Wrap
Oberon Text
|
1977-12-31
|
2KB
|
84 lines
Syntax10.Scn.Fnt
Syntax20.Scn.Fnt
MODULE AmigaBase; (* cn/shml 8-Mar-1993 *)
IMPORT
S:=SYSTEM;
CONST
d0*=0; d1*=1; d2*=2; d3*=3; d4*=4; d5*=5; d6*=6; d7*=7;
a0*=8; a1*=9; a2*=10; a3*=11; a4*=12; a5*=13; a6*=14; a7*=15;
Regs*=RECORD
d*:ARRAY 8 OF LONGINT;
a*:ARRAY 6 OF LONGINT;
END;
LibProc=PROCEDURE;
base:LONGINT;
proc:LONGINT;
tmpR:Regs;
PROCEDURE -PushA6 2FH,0EH;
(* MOVE.L A6,-(A7) *)
NOTE
The following two procedures are dependent on the compiler
code generation, as they contain PC-relative offsets.
(* NEW COMPILER *)
PROCEDURE -Call 04EH,0BBH,001H,061H,0FFH,086H;
(* new compiler: JSR (-8,SB=-122(PC)) (base) *)
PROCEDURE -StoreA0 04DH,0FAH,0FFH,068H,02CH,088H;
(* new compiler: LEA -32,SB=-152(PC),A6 MOVE.L A0,(A6) *)
(* OLD COMPILER *)
PROCEDURE -Call 04EH,0BBH,001H,061H,0FFH,082H;
(* old compiler: JSR (-8,SB=-126(PC)) (base) *)
PROCEDURE -StoreA0 04DH,0FAH,0FFH,064H,02CH,088H;
(* old compiler: LEA -32,SB=-156(PC),A6 MOVE.L A0,(A6) *)
PROCEDURE -PopA6 02CH,05FH;
PROCEDURE LibCall*(libBase:LONGINT; offset:LONGINT; VAR r:Regs);
WARNING: LibCall is *NOT* reentrant.
BEGIN
tmpR:=r;
base:=libBase;
proc:=libBase+offset;
S.PUTREG(a0,tmpR.a[0]);
S.PUTREG(a1,tmpR.a[1]);
S.PUTREG(a2,tmpR.a[2]);
S.PUTREG(a3,tmpR.a[3]);
S.PUTREG(a4,tmpR.a[4]);
S.PUTREG(a5,tmpR.a[5]);
S.PUTREG(d0,tmpR.d[0]);
S.PUTREG(d1,tmpR.d[1]);
S.PUTREG(d2,tmpR.d[2]);
S.PUTREG(d3,tmpR.d[3]);
S.PUTREG(d4,tmpR.d[4]);
S.PUTREG(d5,tmpR.d[5]);
S.PUTREG(d6,tmpR.d[6]);
S.PUTREG(d7,tmpR.d[7]);
PushA6;
S.PUTREG(a6,base);
Call;
(* proc(); Uses A0 register, therfore replaced by assembler hack *)
StoreA0;
(* S.GETREG(a0,tmpR.a[0]); destroys A0 before saving, therefore assembler needed *)
PopA6;
(* S.GETREG(d0,tmpR.d[0]);
S.GETREG(d1,tmpR.d[1]);
S.GETREG(d2,tmpR.d[2]);
S.GETREG(d3,tmpR.d[3]);
S.GETREG(d4,tmpR.d[4]);
S.GETREG(d5,tmpR.d[5]);
S.GETREG(d6,tmpR.d[6]);
S.GETREG(d7,tmpR.d[7]);
S.GETREG(a1,tmpR.a[1]);
S.GETREG(a2,tmpR.a[2]);
S.GETREG(a3,tmpR.a[3]);
S.GETREG(a4,tmpR.a[4]);
S.GETREG(a5,tmpR.a[5]);
r:=tmpR;*)
S.GETREG(d0,r.d[0]); (* I think that is enough *)
S.GETREG(d1,r.d[1]);
END LibCall;
PROCEDURE ExecBase*():LONGINT;
p:LONGINT;
BEGIN
S.GET(4,p);
RETURN p;
END ExecBase;
END AmigaBase.