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.