kpottie@icarus.cs.kuleuven.ac.be (Pottie Karl) (01/31/91)
I recently found this file for writing simple inits in Pascal. It worked
fine till I tried to use variables
unit install;
interface
procedure main;
implementation
const
YourTrapGoesHere = $A9E9;
type
long_t = array[0..0] of longint;
long_ptr = ^long_t;
long_hdl = ^long_ptr;
procedure main;
var
beep: Handle;
long: long_hdl;
addr: longint;
begin
beep := Get1Resource('CODE', 128);
DetachResource(beep);
long := long_hdl(beep);
addr := GetTrapAddress(YourTrapGoesHere);
long^^[5] := $2F3C; { MOVE.L <addr>,-(A7) }
long^^[6] := addr;
SetTrapAddress(longint(beep^) + 22, YourTrapGoesHere)
end;
end.
unit beep;
interface
procedure main;
implementation
procedure main;
begin
sysbeep(1);
end;
end.
This all works fine until I try to use variables, like here:
unit beep;
interface
procedure main;
implementation
procedure main;
var
ourParam: ParmBlkPtr;
begin
ourParam^.ioVRefNum := 1;
if PBMountvol(ourParam) = noMacDskErr then
begin
SysBeep(1);
end
end;
end.
How can I use variables in an init in Pascal ??martin@cs.uchicago.edu (Charles Martin) (02/01/91)
kpottie@icarus (Pottie Karl) writes: >I recently found this file for writing simple inits in Pascal. It worked >fine till I tried to use variables How odd, to see one's own code reappear after many months... that bit of code I wrote before is buggy. Basically, the offsets were incorrect, which ended up overwriting the instructions that put the address of the code into A0 and ToolScratch (which you wouldn't miss in Pascal). Probably also overwrote the jump to main, which is why you crash as soon as you do anything exciting. Here's another try. Note: this is meant to be used with THINK Pascal code resources. THINK Pascal adds a default header that we will mangle to make our head patch. All we do is push the real trap address on the stack before entering our code segment, so the RTS puts us in the real trap with the same arguments. Modulo error checking, N...TrapAddress, and etc., here is the installer: unit install; interface procedure main; implementation const trap = <...>; type code_hdl = ^code_ptr; code_ptr = ^code_t; code_t = array [0..0] of integer; procedure main; var code: code_hdl; addr: longint; begin code := code_hdl (Get1Resource ('CODE',128)); DetachResource (Handle(code)); addr := GetTrapAddress (trap); code^^ [5] := $2F3C; { MOVE.L #<addr>,-(A7) } code^^ [6] := HiWord (addr); code^^ [7] := LoWord (addr); SetTrapAddress (longint(code^)+10, trap) end; end. Hope this helps! Charles Martin // martin@cs.uchicago.edu