diff options
Diffstat (limited to 'packages/amunits/src/coreunits/amigalib.pas')
-rw-r--r-- | packages/amunits/src/coreunits/amigalib.pas | 428 |
1 files changed, 428 insertions, 0 deletions
diff --git a/packages/amunits/src/coreunits/amigalib.pas b/packages/amunits/src/coreunits/amigalib.pas new file mode 100644 index 0000000000..2f08b859de --- /dev/null +++ b/packages/amunits/src/coreunits/amigalib.pas @@ -0,0 +1,428 @@ +{ + This file is part of the Free Pascal run time library. + + A file in Amiga system run time library. + Copyright (c) 1998-2003 by Nils Sjoholm + member of the Amiga RTL development team. + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} + +{ + History: + + Added DoMethodA, DoSuperMethodA, CoerceMethodA and SetSuperAttrsA. + + I've translated those from amigae. I'm not sure that they are + correct but it's a start. Now you can try to make some tests + with mui. + 30 Jul 2000. + + Added stuff for commodities. + FreeIEvents + CxCustom + CxDebug + CxFilter + CxSender + CxSignal + CxTranslate + 19 Aug 2000. + + Rewrote Createport and DeletePort. + 06 Sep 2000. + + Added two printf, one with pchar and one with string. + They use array of const so this unit compiles with + mode objfpc. + 05 Nov 2002. + + Added the define use_amiga_smartlink + 13 Jan 2003. + + nils.sjoholm@mailbox.swipnet.se +} + +{$mode objfpc} +{$I useamigasmartlink.inc} +{$ifdef use_amiga_smartlink} + {$smartlink on} +{$endif use_amiga_smartlink} + +unit amigalib; + + +INTERFACE + +uses exec,intuition,utility,commodities,inputevent,amigados; + +{* Exec support functions from amiga.lib *} + +procedure BeginIO (ioRequest: pIORequest); +function CreateExtIO (port: pMsgPort; size: Longint): pIORequest; +procedure DeleteExtIO (ioReq: pIORequest); +function CreateStdIO (port: pMsgPort): pIOStdReq; +procedure DeleteStdIO (ioReq: pIOStdReq); +function CreatePort (name: PChar; pri: longint): pMsgPort; +procedure DeletePort (port: pMsgPort); +function CreateTask (name: STRPTR; pri: longint; + initPC : Pointer; + stackSize : ULONG): pTask; +procedure DeleteTask (task: pTask); +procedure NewList (list: pList); + +{* Commodities support functions from amiga.lib *} +procedure FreeIEvents (events: pInputEvent); +function CxCustom + (action: pointer; + id: longint): pCxObj; + +function CxDebug (id: long): pCxObj; +function CxFilter (d: STRPTR): pCxObj; +function CxSender + (port: pMsgPort; + id: longint): pCxObj; + +function CxSignal + (task: pTask; + sig: byte): pCxObj; + +function CxTranslate (ie: pInputEvent): pCxObj; + + +function DoMethodA(obj : pObject_; msg : APTR): ulong; +function DoSuperMethodA(cl : pIClass; obj : pObject_; msg : APTR): ulong; +function CoerceMethodA(cl : pIClass; obj : pObject_; msg : APTR): ulong; +function SetSuperAttrsA(cl : pIClass; obj: pObject_; msg : APTR): ulong; + +{ + + NAME + printf - print a formatted output line to the standard output. + + SYNOPSIS + printf(formatstring [,value [,values] ] ); + + FUNCTION + Format the output in accordance with specifications in the format + string. + + INPUTS + formatString - a C-language-like NULL-terminated format string, + with the following supported % options: + + %[flags][width][.limit][length]type + + $ - must follow the arg_pos value, if specified + flags - only one allowed. '-' specifies left justification. + width - field width. If the first character is a '0', the + field is padded with leading 0s. + . - must precede the field width value, if specified + limit - maximum number of characters to output from a string. + (only valid for %s or %b). + length - size of input data defaults to word (16-bit) for types c, + d, u and x, 'l' changes this to long (32-bit). + type - supported types are: + b - BSTR, data is 32-bit BPTR to byte count followed + by a byte string. A NULL BPTR is treated as an + empty string. (V36) + d - signed decimal + u - unsigned decimal + x - hexadecimal with hex digits in uppercase + X - hexadecimal with hex digits in lowercase + s - string, a 32-bit pointer to a NULL-terminated + byte string. A NULL pointer is treated + as an empty string. + c - character + + value(s) - numeric variables or addresses of null-terminated strings + to be added to the format information. + + NOTE + The global "_stdout" must be defined, and contain a pointer to + a legal AmigaDOS file handle. Using the standard Amiga startup + module sets this up. In other cases you will need to define + stdout, and assign it to some reasonable value (like what the + dos.library/Output() call returns). This code would set it up: + + ULONG stdout; + stdout=Output(); + + BUGS + This function will crash if the resulting stream after + parameter substitution is longer than 140 bytes. + +} + +procedure printf(Fmtstr : pchar; Args : array of const); +procedure printf(Fmtstr : string; Args : array of const); + +IMPLEMENTATION + +uses pastoc; + +{* Exec support functions from amiga.lib *} + +procedure BeginIO (ioRequest: pIORequest); +begin + asm + move.l a6,-(a7) + move.l ioRequest,a1 ; get IO Request + move.l 20(a1),a6 ; extract Device ptr + jsr -30(a6) ; call BEGINIO directly + move.l (a7)+,a6 + end; +end; + +function CreateExtIO (port: pMsgPort; size: Longint): pIORequest; +var + IOReq: pIORequest; +begin + IOReq := NIL; + if port <> NIL then + begin + IOReq := AllocMem(size, MEMF_CLEAR or MEMF_PUBLIC); + if IOReq <> NIL then + begin + IOReq^.io_Message.mn_Node.ln_Type := NT_REPLYMSG; + IOReq^.io_Message.mn_Length := size; + IOReq^.io_Message.mn_ReplyPort := port; + end; + end; + CreateExtIO := IOReq; +end; + + +procedure DeleteExtIO (ioReq: pIORequest); +begin + if ioReq <> NIL then + begin + ioReq^.io_Message.mn_Node.ln_Type := $FF; + ioReq^.io_Message.mn_ReplyPort := pMsgPort(-1); + ioReq^.io_Device := pDevice(-1); + ExecFreeMem(ioReq, ioReq^.io_Message.mn_Length); + end +end; + + +function CreateStdIO (port: pMsgPort): pIOStdReq; +begin + CreateStdIO := pIOStdReq(CreateExtIO(port, sizeof(tIOStdReq))) +end; + + +procedure DeleteStdIO (ioReq: pIOStdReq); +begin + DeleteExtIO(pIORequest(ioReq)) +end; + + +function Createport(name : PChar; pri : longint): pMsgPort; +var + sigbit : Byte; + port : pMsgPort; +begin + sigbit := AllocSignal(-1); + if sigbit = -1 then CreatePort := nil; + port := Allocmem(sizeof(tMsgPort),MEMF_CLEAR or MEMF_PUBLIC); + if port = nil then begin + FreeSignal(sigbit); + CreatePort := nil; + end; + with port^ do begin + if assigned(name) then + mp_Node.ln_Name := name + else mp_Node.ln_Name := nil; + mp_Node.ln_Pri := pri; + mp_Node.ln_Type := NT_MsgPort; + mp_Flags := PA_Signal; + mp_SigBit := sigbit; + mp_SigTask := FindTask(nil); + end; + if assigned(name) then AddPort(port) + else NewList(addr(port^.mp_MsgList)); + CreatePort := port; +end; + +procedure DeletePort (port: pMsgPort); +begin + if port <> NIL then + begin + if port^.mp_Node.ln_Name <> NIL then + RemPort(port); + + port^.mp_Node.ln_Type := $FF; + port^.mp_MsgList.lh_Head := pNode(-1); + FreeSignal(port^.mp_SigBit); + ExecFreeMem(port, sizeof(tMsgPort)); + end; +end; + + +function CreateTask (name: STRPTR; pri: longint; + initPC: pointer; stackSize: ULONG): pTask; +var + memlist : pMemList; + task : pTask; + totalsize : Longint; +begin + task := NIL; + stackSize := (stackSize + 3) and not 3; + totalsize := sizeof(tMemList) + sizeof(tTask) + stackSize; + + memlist := AllocMem(totalsize, MEMF_PUBLIC + MEMF_CLEAR); + if memlist <> NIL then begin + memlist^.ml_NumEntries := 1; + memlist^.ml_ME[0].me_Un.meu_Addr := Pointer(memlist + 1); + memlist^.ml_ME[0].me_Length := totalsize - sizeof(tMemList); + + task := pTask(memlist + sizeof(tMemList) + stackSize); + task^.tc_Node.ln_Pri := pri; + task^.tc_Node.ln_Type := NT_TASK; + task^.tc_Node.ln_Name := name; + task^.tc_SPLower := Pointer(memlist + sizeof(tMemList)); + task^.tc_SPUpper := Pointer(task^.tc_SPLower + stackSize); + task^.tc_SPReg := task^.tc_SPUpper; + + NewList(@task^.tc_MemEntry); + AddTail(@task^.tc_MemEntry,@memlist^.ml_Node); + + AddTask(task,initPC,NIL) + end; + CreateTask := task; +end; + + +procedure DeleteTask (task: pTask); +begin + RemTask(task) +end; + + +procedure NewList (list: pList); +begin + with list^ do + begin + lh_Head := pNode(@lh_Tail); + lh_Tail := NIL; + lh_TailPred := pNode(@lh_Head) + end +end; + +procedure FreeIEvents (events: pInputEvent); +begin + while events <> NIL do + begin + FreeMem (events, sizeof (tInputEvent)); + events := events^.ie_NextEvent + end +end; + +function CxCustom + (action: pointer; + id: longint): pCxObj; +begin + CxCustom := CreateCxObj(CX_CUSTOM, longint(action), id) +end; + +function CxDebug (id: long): pCxObj; +begin + CxDebug := CreateCxObj(CX_DEBUG, id, 0) +end; + +function CxFilter (d: STRPTR): pCxObj; +begin + CxFilter := CreateCxObj(CX_FILTER, longint(d), 0) +end; + +function CxSender + (port: pMsgPort; + id: longint): pCxObj; +begin + CxSender := CreateCxObj(CX_SEND, longint(port), id) +end; + +function CxSignal + (task: pTask; + sig: byte): pCxObj; +begin + CxSignal:= CreateCxObj(CX_SIGNAL, longint(task), sig) +end; + +function CxTranslate (ie: pInputEvent): pCxObj; +begin + CxTranslate := CreateCxObj(CX_TRANSLATE, longint(ie), 0) +end; + +function DoMethodA(obj : pObject_; msg : APTR): ulong; +var + o : p_Object; +begin + if assigned(obj) then begin + o := p_Object(obj); + DoMethodA := CallHookPkt(@o^.o_Class^.cl_Dispatcher, obj,msg); + end else DoMethodA := 0; +end; + +function DoSuperMethodA(cl : pIClass; obj : pObject_; msg : APTR): ulong; +begin + if assigned(obj) and assigned(cl) then + DoSuperMethodA := CallHookPkt(@cl^.cl_Super^.cl_Dispatcher,obj,msg) + else DoSuperMethodA := 0; +end; + +function CoerceMethodA(cl : pIClass; obj : pObject_; msg : APTR): ulong; +begin + if assigned(cl) and assigned(obj) then + CoerceMethodA := CallHookPkt(@cl^.cl_Dispatcher,obj,msg) + else CoerceMethodA := 0; +end; + +function SetSuperAttrsA(cl : pIClass; obj: pObject_; msg : APTR): ulong; +var + arr : array[0..2] of longint; +begin + arr[0] := OM_SET; + arr[1] := longint(msg); + arr[2] := 0; + SetSuperAttrsA := DoSuperMethodA(cl, obj, @arr); +end; + +var + argarray : array [0..20] of longint; + +function gettheconst(args : array of const): pointer; +var + i : longint; + +begin + + for i := 0 to High(args) do begin + case args[i].vtype of + vtinteger : argarray[i] := longint(args[i].vinteger); + vtpchar : argarray[i] := longint(args[i].vpchar); + vtchar : argarray[i] := longint(args[i].vchar); + vtpointer : argarray[i] := longint(args[i].vpointer); + vtstring : argarray[i] := longint(pas2c(args[i].vstring^)); + end; + end; + gettheconst := @argarray; +end; + +procedure printf(Fmtstr : pchar; Args : array of const); +begin + VPrintf(Fmtstr,gettheconst(Args)); +end; + +procedure printf(Fmtstr : string; Args : array of const); +begin + VPrintf(pas2c(Fmtstr) ,gettheconst(Args)); +end; + + +end. |