home *** CD-ROM | disk | FTP | other *** search
- unit Rexx;
-
- INTERFACE
- uses Exec;
-
-
- type
- pRexxMsg = ^tRexxMsg;
- tRexxMsg = record
- rm_Node: tMessage;
- rm_TaskBlock: pointer;
- rm_LibBase: pointer;
- rm_Action: longint;
- rm_Result1: longint;
- rm_Result2: longint;
- rm_Args: array [0..15] of STRPTR;
- rm_PassPort: pMsgPort;
- rm_CommAddr: STRPTR;
- rm_FileExt: STRPTR;
- rm_Stdin: longint;
- rm_Stdout: longint;
- rm_avail: longint;
- end;
-
- pRexxTask = ^tRexxTask;
- tRexxTask = record
- rt_Global: array [0..199] of shortint;
- rt_MsgPort: tMsgPort;
- rt_Flags: byte;
- rt_SigBit: shortint;
- rt_ClientID: pointer;
- rt_MsgPkt: pointer;
- rt_TaskID: pointer;
- rt_RexxPort: pointer;
- rt_ErrTrap: pointer;
- rt_StackPtr: pointer;
- rt_Header1: tList;
- rt_Header2: tList;
- rt_Header3: tList;
- rt_Header4: tList;
- rt_Header5: tList;
- end;
-
- pNexxStr = ^tNexxStr;
- tNexxStr = record
- ns_Ivalue: longint;
- ns_Length: word;
- ns_Flags: byte;
- ns_Hash: byte;
- ns_Buff: array [0..7] of shortint;
- end;
-
- pRexxRsrc = ^tRexxRsrc;
- tRexxRsrc = record
- rr_Node: tNode;
- rr_Func: integer;
- rr_Base: pointer;
- rr_Size: longint;
- rr_Arg1: longint;
- rr_Arg2: longint;
- end;
-
- pRexxMsgPort = ^tRexxMsgPort;
- tRexxMsgPort = record
- rmp_Node: tRexxRsrc;
- rmp_Port: tMsgPort;
- rmp_ReplyList: tList;
- end;
-
- pIoBuff = ^tIoBuff;
- tIoBuff = record
- iobNode: tRexxRsrc;
- iobRpt: pointer;
- iobRct: longint;
- iobDFH: longint;
- iobLock: pointer;
- iobBct: longint;
- iobArea: array [0..203] of shortint;
- end;
-
- pSrcNode = ^tSrcNode;
- tSrcNode = record
- sn_Succ: pSrcNode;
- sn_Pred: pSrcNode;
- sn_Ptr: pointer;
- sn_Size: longint;
- end;
-
- pRxsLib = ^tRxsLib;
- tRxsLib = record
- rl_Node: tLibrary;
- rl_Flags: byte;
- rl_Shadow: byte;
- rl_SysBase: pointer;
- rl_DOSBase: pointer;
- rl_IeeeDPBase: pointer;
- rl_SegList: longint;
- rl_NIL: longint;
- rl_Chunk: longint;
- rl_MaxNest: longint;
- rl_NULL: pNexxStr;
- rl_FALSE: pNexxStr;
- rl_TRUE: pNexxStr;
- rl_REXX: pNexxStr;
- rl_COMMAND: pNexxStr;
- rl_STDIN: pNexxStr;
- rl_STDOUT: pNexxStr;
- rl_STDERR: pNexxStr;
- rl_Version: STRPTR;
- rl_TaskName: STRPTR;
- rl_TaskPri: longint;
- rl_TaskSeg: longint;
- rl_StackSize: longint;
- rl_RexxDir: STRPTR;
- rl_CTABLE: STRPTR;
- rl_Notice: STRPTR;
- rl_RexxPort: tMsgPort;
- rl_ReadLock: word;
- rl_TraceFH: longint;
- rl_TaskList: tList;
- rl_NumTask: integer;
- rl_LibList: tList;
- rl_NumLib: integer;
- rl_ClipList: tList;
- rl_NumClip: integer;
- rl_MsgList: tList;
- rl_NumMsg: integer;
- rl_PgmList: tList;
- rl_NumPgm: integer;
- rl_TraceCnt: word;
- rl_avail: integer;
- end;
-
- pRexxArg = ^tRexxArg;
- tRexxArg = record
- ra_Size: longint;
- ra_Length: word;
- ra_Flags: byte;
- ra_Hash: byte;
- ra_Buff: array [0..7] of shortint;
- end;
-
-
-
- var
- RexxSysBase: pLibrary;
-
-
- const
- NSF_OWNED = $C1;
- GLOBALSZ = $C8;
- MAXRMARG = $F;
- CTB_UPPER = 6;
- CTF_LOWER = $80;
- RXFB_NOIO = $10;
- RXIO_WRITE = 2;
- CTF_UPPER = $40;
- RXIO_EXIST = $FFFFFFFF;
- ACTION_STACK = $7D2;
- NSF_DPNUM = $28;
- RXREMLIB = $9000000;
- RXFF_NOIO = $10000;
- RXADDFH = $7000000;
- RLFB_STOP = 6;
- NSB_KEEP = 0;
- MEMQUANT = $10;
- NSF_KEEP = 1;
- RLFB_SUSP = 2;
- RXREMCON = $B000000;
- MEMMASK = $FFFFFFF0;
- ERRC_MSG = 0;
- RXSTNAME = 'ARexx';
- RTFB_SUSP = 2;
- ACTION_QUEUE = $7D3;
- RXSSTACK = $1000;
- RLFMASK = 7;
- RXSCHUNK = $400;
- RRT_FILE = 3;
- RXIO_CURR = 0;
- RXIO_END = 1;
- KEEPNUM = $9A;
- RXBUFFSZ = $CC;
- RXIO_STRF = 0;
- RC_ERROR = $A;
- RRT_CLIP = 5;
- KEEPSTR = $86;
- RXSNAME = 'rexxsyslib.library';
- RXCLOSE = $3000000;
- RXTCCLS = $D000000;
- RXCODEMASK = $FF000000;
- RXIO_APPEND = 3;
- RLFB_TRACE = 0;
- RC_WARN = 5;
- RXTCOPN = $C000000;
- RRT_LIB = 1;
- RRT_HOST = 4;
- RLFB_CLOSE = 7;
- RTFB_TRACE = 0;
- NSB_EXT = 6;
- CTB_REXXSPC = 5;
- NSF_EXT = $40;
- RRT_PORT = 2;
- RXSNEST = $20;
- RXFB_NONRET = $14;
- RXFB_STRING = $12;
- RTFB_CLOSE = 7;
- CTB_ALPHA = 2;
- ERR10_001 = 1;
- ERR10_010 = $A;
- CTF_REXXSPC = $20;
- ERR10_002 = 2;
- ERR10_011 = $B;
- ERR10_020 = $14;
- RXCOMM = $1000000;
- RXFUNC = $2000000;
- DT_DEV = 0;
- DT_DIR = 1;
- ERR10_003 = 3;
- ERR10_012 = $C;
- ERR10_021 = $15;
- ERR10_030 = $1E;
- RXFF_NONRET = $100000;
- RXIO_BEGIN = $FFFFFFFF;
- RXSTPRI = 0;
- ERR10_004 = 4;
- ERR10_013 = $D;
- ERR10_022 = $16;
- ERR10_031 = $1F;
- ERR10_040 = $28;
- NSB_BINARY = 4;
- RXFF_STRING = $40000;
- CTF_ALPHA = 4;
- ERR10_005 = 5;
- ERR10_014 = $E;
- ERR10_023 = $17;
- ERR10_032 = $20;
- ERR10_041 = $29;
- ERR10_006 = 6;
- ERR10_015 = $F;
- ERR10_024 = $18;
- ERR10_033 = $21;
- ERR10_042 = $2A;
- RRT_ANY = 0;
- CTB_SPACE = 0;
- ERR10_007 = 7;
- ERR10_016 = $10;
- ERR10_025 = $19;
- ERR10_034 = $22;
- ERR10_043 = $2B;
- RXQUERY = $4000000;
- ERR10_008 = 8;
- ERR10_017 = $11;
- ERR10_026 = $1A;
- ERR10_035 = $23;
- ERR10_044 = $2C;
- NSB_NUMBER = 3;
- NSF_BINARY = $10;
- RXFB_RESULT = $11;
- RXSDIR = 'REXX';
- CTB_REXXOPR = 4;
- ERR10_009 = 9;
- ERR10_018 = $12;
- ERR10_027 = $1B;
- ERR10_036 = $24;
- ERR10_045 = $2D;
- ERR10_019 = $13;
- ERR10_028 = $1C;
- ERR10_037 = $25;
- ERR10_046 = $2E;
- CTF_SPACE = 1;
- ERR10_029 = $1D;
- ERR10_038 = $26;
- ERR10_047 = $2F;
- CTB_DIGIT = 1;
- ERR10_039 = $27;
- ERR10_048 = $30;
- NSF_NUMBER = 8;
- RXFF_RESULT = $20000;
- CTF_REXXOPR = $10;
- MEMCLEAR = $10000;
- NSF_ALPHA = 6;
- RTFB_TCUSE = 3;
- RXFB_TOKEN = $13;
- CTF_DIGIT = 2;
- NSB_SOURCE = 7;
- RLFB_HALT = 1;
- CTB_REXXSYM = 3;
- RXADDLIB = $8000000;
- RXARGMASK = $F;
- RXFF_TOKEN = $80000;
- NSF_SOURCE = $80;
- DT_VOL = 2;
- CTF_REXXSYM = 8;
- NXADDLEN = 9;
- NSB_STRING = 1;
- RTFB_HALT = 1;
- NSB_FLOAT = 5;
- NSF_STRING = 2;
- RXADDCON = $A000000;
- NSF_FLOAT = $20;
- NSF_INTNUM = $1A;
- RC_OK = 0;
- RXIO_READ = 1;
- NSB_NOTNUM = 2;
- RC_FATAL = $14;
- MEMQUICK = 1;
- CTB_LOWER = 7;
- NSF_NOTNUM = 4;
- RTFB_WAIT = 6;
-
-
- function CreateArgstring
- (string_: STRPTR;
- length: long): STRPTR;
-
- procedure DeleteArgstring (argstring: STRPTR);
- function LengthArgstring (argstring: STRPTR): long;
- function CreateRexxMsg
- (port: pMsgPort;
- extension: STRPTR;
- host: STRPTR): pRexxMsg;
-
- procedure DeleteRexxMsg (packet: pRexxMsg);
- procedure ClearRexxMsg
- (msgptr: pRexxMsg;
- count: long);
-
- function FillRexxMsg
- (msgptr: pRexxMsg;
- count: long;
- mask: long): boolean;
-
- function IsRexxMsg (msgptr: pRexxMsg): boolean;
- procedure LockRexxBase (resource: long);
- procedure UnlockRexxBase (resource: long);
-
-
- function ARG0 (rmp: pRexxMsg): pbyte;
- function ARG1 (rmp: pRexxMsg): pbyte;
- function ARG2 (rmp: pRexxMsg): pbyte;
- function CLVALUE (rrp: pRexxRsrc): pbyte;
- function IVALUE (nsPtr: pNexxStr): longint;
- function LLOFFSET (rrp: pRexxRsrc): longint;
- function LLVERS (rrp: pRexxRsrc): longint;
-
- (* Amiga.lib ARexx support *)
- function CheckRexxMsg (rexxmsg: pMessage): boolean;
- function GetRexxVar (rexxmsg: pMessage;
- name: STRPTR; result: ppByte): longint;
- function SetRexxVar (rexxmsg: pMessage;
- name, value: STRPTR; length: longint): longint;
-
-
- IMPLEMENTATION
- function ARG0;
- begin
- ARG0 := rmp^.rm_Args[0]
- end;
-
- function ARG1;
- begin
- ARG1 := rmp^.rm_Args[1]
- end;
-
- function ARG2;
- begin
- ARG2 := rmp^.rm_Args[2]
- end;
-
- function IVALUE;
- begin
- IVALUE := nsPtr^.ns_Ivalue
- end;
-
- function CLVALUE;
- begin
- CLVALUE := pbyte(rrp^.rr_Arg1)
- end;
-
- function LLOFFSET;
- begin
- LLOFFSET := rrp^.rr_Arg1
- end;
-
- function LLVERS;
- begin
- LLVERS := rrp^.rr_Arg2
- end;
-
- procedure CheckRexxMsg_; xassembler;
- asm
- movem.l d2/a2/a6,-(sp)
- move.l a0,a2
- move.l SysBase,a6
- lea @2(pc),a1
- moveq #0,d0
- jsr -$228(a6)
- move.l d0,d2
- beq @1
- movea.l d0,a1
- jsr -$19E(a6)
- moveq #0,d0
- cmp.l $18(a2),d2
- bne @1
- move.l $14(a2),d1
- beq @1
- move.l a2,a0
- move.l d2,a6
- jsr -$A8(a6)
- @1:
- tst.l d0
- movem.l (sp)+,d2/a2/a6
- rts
-
- @2: dc.b 'rexxsyslib.library',0
- end;
-
- function CheckRexxMsg (rexxmsg: pMessage): boolean; assembler;
- asm
- move.l rexxmsg,a0
- jsr CheckRexxMsg_
- sne d0
- neg.b d0
- move.b d0,@result
- end;
-
- procedure rexx2; xassembler;
- asm
- movem.l d0/a1,-(sp)
- addq.l #8,d0
- addq.l #1,d0
- jsr -$72(a6)
- movem.l (sp)+,d0/a1
- beq @1
- move.l a0,-(sp)
- clr.l (a0)
- move.w d0,4(a0)
- move.b #2,6(a0)
- clr.b 8(a0,d0.l)
- addq.l #8,a0
- jsr -$10E(a6)
- move.l (sp)+,a0
- move.b d0,7(a0)
- @1:
- move.l a0,d0
- end;
-
- procedure rexx3; xassembler;
- asm
- move.l a1,d1
- beq @1
- moveq #1,d0
- and.b 6(a1),d0
- bne @1
- move.w 4(a1),d0
- addq.l #8,d0
- addq.l #1,d0
- jsr -$78(a6)
- @1:
- end;
-
- procedure rexx1; xassembler;
- asm
- movem.l d2-d3/a2-a3,-(sp)
- moveq #0,d2
- moveq #0,d3
- jsr -$120(a6)
- move.l a0,a1
- move.l a4,a0
- jsr rexx2
- move.l d0,a2
- beq @3
- lea 8(a2),a1
- move.w 4(a2),d0
- move.l a1,d1
- @1:
- cmpi.b #$2E,(a1)+
- dbeq d0,@1
- bne @2
- exg d1,a1
- sub.l a1,d1
- move.l a2,d3
- move.l a4,a0
- move.l d1,d0
- jsr rexx2
- move.l d0,a2
- beq @3
- @2:
- lea 8(a2),a0
- jsr -$66(a6)
- cmp.w 4(a2),d1
- beq @4
- moveq #$28,d2
- bra @4
- @3:
- moveq #3,d2
- @4:
- tst.l d2
- beq @5
- move.l a4,a0
- move.l a2,a1
- jsr rexx3
- move.l a4,a0
- move.l d3,a1
- jsr rexx3
- @5:
- move.l a2,a1
- move.l d3,d1
- move.l d2,d0
- movem.l (sp)+,d2-d3/a2-a3
- end;
-
- procedure GetRexxVar_; xassembler;
- asm
- movem.l d2-d3/a2-a6,-(sp)
- move.l a0,a2
- move.l a1,a3
- jsr CheckRexxMsg_
- beq @1
- move.l $18(a2),a6
- move.l $14(a2),a0
- jsr -$6C(a6)
- move.l a0,a4
- move.l a3,a0
- jsr rexx1
- bne @2
- move.l a1,a2
- move.l d1,d2
- move.l a4,a0
- move.l d2,d0
- moveq #0,d1
- jsr -$48(a6)
- moveq #0,d0
- addq.l #8,a1
- tst.l d1
- beq @2
- suba.l a1,a1
- bra @2
- @1:
- moveq #$A,d0
- @2:
- tst.l d0
- movem.l (sp)+,d2-d3/a2-a6
- end;
-
- function GetRexxVar (rexxmsg: pMessage;
- name: STRPTR; result: ppByte): longint; assembler;
- asm
- move.l rexxmsg,a0
- move.l name,a1
- jsr GetRexxVar_
- move.l d0,@result
- bne @1
- move.l result,a0
- move.l a1,(a0)
- @1:
- end;
-
- procedure rexx4; xassembler;
- asm
- move.l a3,-(sp)
- move.l $14(a2),a3
- move.l a2,0(a1)
- movem.l $FC(a3),d0-d1
- movem.l a0-a1,$FC(a3)
- movem.l d0-d1,4(a1)
- move.l (sp)+,a3
- end;
-
- procedure rexx5; xassembler;
- asm
- move.l 0(a0),a1
- move.l $14(a1),a1
- movem.l 4(a0),d0-d1
- movem.l d0-d1,$FC(a1)
- end;
-
- procedure SetRexxVar_; xassembler;
- asm
- movem.l d2-d7/a2-a6,-(sp)
- lea -$C(sp),sp
- move.l a0,a2
- move.l a1,a3
- move.l d0,a5
- move.l d1,d3
- lea @1(pc),a0
- move.l sp,a1
- jsr rexx4
- move.l a2,a0
- jsr CheckRexxMsg_
- beq @2
- move.l $18(a2),a6
- moveq #9,d0
- cmpi.l #$FFFF,d3
- bgt @3
- move.l $14(a2),a0
- jsr -$6C(a6)
- move.l a0,a4
- move.l a3,a0
- jsr rexx1
- bne @3
- move.l a1,a2
- move.l d1,d2
- move.l a4,a0
- move.l d2,d0
- jsr -$42(a6)
- move.l d0,d4
- move.l a4,a0
- move.l a5,a1
- move.l d3,d0
- jsr rexx2
- beq @1
- move.l a4,a0
- move.l d0,a1
- move.l d4,d0
- jsr -$54(a6)
- moveq #0,d0
- bra @3
- @1:
- moveq #3,d0
- bra @3
- @2:
- moveq #$A,d0
- @3:
- move.l sp,a0
- move.l d0,-(sp)
- jsr rexx5
- move.l (sp)+,d0
- lea $C(sp),sp
- movem.l (sp)+,d2-d7/a2-a6
- end;
-
- function SetRexxVar (rexxmsg: pMessage;
- name, value: STRPTR; length: longint): longint; assembler;
- asm
- move.l rexxmsg,a0
- move.l name,a1
- move.l value,d0
- move.l length,d1
- jsr SetRexxVar_
- move.l d0,@result
- end;
-
- function CreateArgstring; xassembler;
- asm
- move.l a6,-(sp)
- movem.l 8(sp),d0/a0
- move.l RexxSysBase,a6
- jsr -$7E(a6)
- move.l d0,$10(sp)
- move.l (sp)+,a6
- end;
-
- procedure DeleteArgstring; xassembler;
- asm
- move.l a6,-(sp)
- move.l 8(sp),a0
- move.l RexxSysBase,a6
- jsr -$84(a6)
- move.l (sp)+,a6
- end;
-
- function LengthArgstring; xassembler;
- asm
- move.l a6,-(sp)
- move.l 8(sp),a0
- move.l RexxSysBase,a6
- jsr -$8A(a6)
- move.l d0,$C(sp)
- move.l (sp)+,a6
- end;
-
- function CreateRexxMsg; xassembler;
- asm
- move.l a6,-(sp)
- lea 8(sp),a6
- move.l (a6)+,d0
- move.l (a6)+,a1
- move.l (a6)+,a0
- move.l RexxSysBase,a6
- jsr -$90(a6)
- move.l d0,$14(sp)
- move.l (sp)+,a6
- end;
-
- procedure DeleteRexxMsg; xassembler;
- asm
- move.l a6,-(sp)
- move.l 8(sp),a0
- move.l RexxSysBase,a6
- jsr -$96(a6)
- move.l (sp)+,a6
- end;
-
- procedure ClearRexxMsg; xassembler;
- asm
- move.l a6,-(sp)
- movem.l 8(sp),d0/a0
- move.l RexxSysBase,a6
- jsr -$9C(a6)
- move.l (sp)+,a6
- end;
-
- function FillRexxMsg; xassembler;
- asm
- move.l a6,-(sp)
- lea 8(sp),a6
- move.l (a6)+,d1
- move.l (a6)+,d0
- move.l (a6)+,a0
- move.l RexxSysBase,a6
- jsr -$A2(a6)
- tst.l d0
- sne d0
- neg.b d0
- move.b d0,$14(sp)
- move.l (sp)+,a6
- end;
-
- function IsRexxMsg; xassembler;
- asm
- move.l a6,-(sp)
- move.l 8(sp),a0
- move.l RexxSysBase,a6
- jsr -$A8(a6)
- tst.l d0
- sne d0
- neg.b d0
- move.b d0,$C(sp)
- move.l (sp)+,a6
- end;
-
- procedure LockRexxBase; xassembler;
- asm
- move.l a6,-(sp)
- move.l 8(sp),d0
- move.l RexxSysBase,a6
- jsr -$1C2(a6)
- move.l (sp)+,a6
- end;
-
- procedure UnlockRexxBase; xassembler;
- asm
- move.l a6,-(sp)
- move.l 8(sp),d0
- move.l RexxSysBase,a6
- jsr -$1C8(a6)
- move.l (sp)+,a6
- end;
-
- end.
-