page@swan.ulowell.edu (Bob Page) (03/16/89)
Submitted-by: G35@DHDURZ1.BITNET (Guenther Werner) Posting-number: Volume 89, Issue 53 Archive-name: kernel/xoper13.2 # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # Xoper.asm2 # Xoper.doc # This archive created: Wed Mar 15 12:40:15 1989 cat << \SHAR_EOF > Xoper.asm2 bsr putnam bra hu5 hu3 move.l 172(a4),d1 bne.s hu4 noprogload move.l #notload,d0 bra putnam hu4 move.l #cliprocs,d0 bsr putnam lsl.l #2,d1 move.l d1,a4 move.l 60(a4),d1 beq.s noprogload move.l #procloaded,d0 bsr putstr move.l 16(a4),d0 bsr putbcpl bsr newline hu5 lea hunkheader(PC),a0 bsr puthead hu6 move.l d1,d0 bsr hexa lsl.l #2,d1 move.l d1,a4 move.l d1,d0 addq.l #4,d0 bsr hexa move.l -4(a4),d0 bsr hexa bsr newline move.l 0(a4),d1 bne.s hu6 rts ;change the priority of a node pri bsr getnum tst.b d7 beq syntax move.b d2,newpri bsr nodenam2 moveq.l #5,d7 lea DevNode(PC),a4 bsr findnam tst.b d7 beq.s pi1 move.l d0,a1 move.b newpri,9(a1) cmp.l #SemNode,a4 ble.s pi2 move.l #listerr,d0 bra putnam pi2 CALL Forbid,_SysBase(PC) CALL Remove,_SysBase(PC) move.l d0,a1 move.l a4,a0 move.l 0(a0),d6 lea 0(a6,d6),a0 CALL Enqueue,_SysBase(PC) CALL Permit,_SysBase(PC) pi1 rts ;set all break signals of a task break move.l #$f000,d0 bra setthem signal bsr readhex tst.b d7 beq syntax setthem move.l d0,savedat bsr nodenam moveq.l #2,d7 lea TReNode(PC),a4 bsr findnam tst.b d7 beq.s pi1 move.l d0,a1 move.l savedat,d0 and.l 18(a1),d0 CALL Signal,_SysBase(PC) rts hide cmp.b #10,0(a0) bne.s hid5 bra syntax hid5 lea hidestart(PC),a2 move.l a2,d3 hid0 tst.l 0(a2) beq.s hid1 move.l 0(a2),a2 lea 4(a2),a1 bsr strcmp tst d0 beq.s hid2 move.l a2,d3 bra.s hid0 hid1 move.l a0,a4 bsr strlen2 addq #5,d0 move.l #65536,d1 CALL AllocMem,_SysBase(PC) tst.l d0 beq.s hid4 move.l d0,a1 move.l d0,0(a2) lea 4(a1),a1 hid3 cmp.b #10,0(a4) beq.s hid4 move.b (a4)+,(a1)+ bra.s hid3 hid4 rts hid2 move.l d3,a3 move.l 0(a2),0(a3) freehidden lea 4(a2),a0 bsr strlen addq #5,d0 move.l a2,a1 CALL FreeMem,_SysBase(PC) rts freehidmem move.l hidestart(PC),a4 fhm0 move.l a4,d0 beq.s fhm1 move.l a4,a2 move.l 0(a2),a4 bsr freehidden bra fhm0 fhm1 rts ;'flushlibs' flush move.l #$ffffff,d0 clr.l d1 CALL AllocMem,_SysBase(PC) rts ;display library->lib_IDString info bsr nodenam2 moveq.l #2,d7 lea DevNode(PC),a4 bsr findnam tst.b d7 beq.s fhm1 move.l d0,a0 move.l 24(a0),d0 beq.s if1 move.l d0,d1 andi.l #$ff000000,d1 bne.s if1 bra putnam if1 move.l #noinfo,d0 bsr putstr move.l a5,d0 bra putnam capture move.l _SysBase(PC),a1 lea 42(a1),a0 moveq #2,d6 lea coldtxt,a4 cap0 move.l a4,d0 bsr putstr move.l 0(a0),d0 bne.s cap1 move.l #unset,d0 bsr putstr bra cap2 cap1 bsr hexa cap2 bsr newline lea 15(a4),a4 lea 4(a0),a0 dbf d6,cap0 move.l #kicktxt,d0 bsr putstr move.l 546(a1),a0 cmpa.l #0,a0 bne.s kickm3 move.l #unset,d0 bra putnam kickm3 move.l a0,-(a7) bsr newline lea kickhead(PC),a0 bsr puthead move.l (a7)+,a0 kickm0 cmpa.l #0,a0 bne.s kickm1 rts kickm1 move.w 14(a0),d6 subq #1,d6 lea 16(a0),a2 kickm2 move.l 0(a2),d0 bsr hexa move.l 0(a2),d0 move.l 4(a2),d4 add.l d4,d0 bsr hexa move.l d4,d0 clr.b d3 bsr longdec bsr newline lea 8(a2),a2 dbf d6,kickm2 move.l 0(a0),a0 bra kickm0 rts clrcold move.l _SysBase,a0 clr.l 42(a0) bra.s chksum clrcool move.l _SysBase,a0 clr.l 46(a0) bra.s chksum clrwarm move.l _SysBase,a0 clr.l 50(a0) chksum lea 34(a0),a1 move #22,d0 addchk add (a1)+,d1 dbf d0,addchk not d1 move.w d1,82(a0) rts setwindow tst.b fromfile bne.s wiw1 move.l #wiwerr,d0 bra putnam wiw1 lea window_l(PC),a3 moveq #3,d5 wiw0 bsr getnum tst d7 beq.s wiw2 move.w d2,0(a3) lea 2(a3),a3 dbf d5,wiw0 wiw2 rts ;display ExecBase->LastAlert lastalert movem.l $100,d1-d2 tst.l d1 bne.s al1 move.l _SysBase(PC),a0 movem.l 514(a0),d1-d2 bra.s al1 alert movem.l $100,d1-d2 cmp.l #'HELP',0 beq.s al1 move.l #noguru,d0 bra putnam al1 move.l #gurutxt,d0 bsr putstr move.l d1,d0 bsr hex8 lea out,a0 move.l ptr(PC),d0 move.b #'.',-1(a0,d0) move.l d2,d0 bsr hex8 bra newline ;toggle '<MORE>' on/off moretst tst.b fromfile beq.s mtst1 bchg #0,morefl2 rts mtst1 bchg #0,morefl rts ;toggle CPUSE task list usage bchg #0,usageflag rts ;toggle task-header display on/off nohead bchg #0,headon rts ;toggle hide entries on/off hidden bchg #0,hideon rts ;toggle sort on/off sort bchg #0,sorton rts ;toggle task-ports display on/off taskports bchg #0,tports clo1 rts ;Open a library openlib bsr nodenam2 move.l a5,a1 clr.l d0 CALL OpenLibrary,_SysBase(PC) tst.l d0 beq fn5 opli1 bsr clearscr bra showlibs ;close it closelib bsr nodenam2 clr.l d7 lea LibNode(PC),a4 bsr findnam tst.b d7 beq.s clo1 move.l d0,a1 CALL CloseLibrary,_SysBase(PC) bra opli1 ;end Xoper but stay in background hold lea 4(a7),a7 bra.s instback quithold lea in,a0 lea dummy,a1 qh1 move.b (a1)+,d0 move.b d0,(a0)+ cmp.b #10,d0 bne.s qh1 instback tst.b background bne.s cleanit move.b #1,background bsr installh cleanit tst.l fileptr beq.s ib1 move.l window(PC),a0 move.w 4(a0),window_l move.w 6(a0),window_t move.w 8(a0),window_w move.w 10(a0),window_h move.l fileptr(PC),d1 CALL Close,dosbase(PC) clr.l fileptr ib1 clr.b running move.l mysignal(PC),d0 CALL Wait,_SysBase(PC) move.b #1,running bra restart ;fill all unused memory-chunks with a longword clear clr.l d0 cmp.b #10,0(a0) beq.s clr5 bsr readhex tst.b d7 beq syntax clr5 move.l _SysBase(PC),a0 clr.l parmtxt lea 322(a0),a0 move.w #$4000,$dff09a clr1 move.l 0(a0),a0 tst.l 0(a0) beq.s clr4 move.l 16(a0),a1 clr2 tst.l 0(a1) beq.s clr1 add.l #1,parmtxt move.l 4(a1),d1 sub.l #8,d1 beq.s clr31 lsr.l #2,d1 subq.l #1,d1 lea 8(a1),a2 clr3 move.l d0,(a2)+ dbf d1,clr3 clr31 move.l 0(a1),a1 bra.s clr2 clr4 move.w #-$4000,$dff09a move.l parmtxt(PC),d0 bsr bytedec move.l #clrtxt,d0 bra putnam ;find a named node ;d7 = number of lists to search through ;a4 = pointer to the first entry in the ; list-offset-table ;a5 = pointer to name ;returns: ;d7 = TRUE/FALSE 1/0 ;d0 = node findnam cmp.b #'$',0(a5) bne.s fn2 move.l d7,d2 move.l a5,a0 bsr readhex tst.b d7 beq.s fn6 move.l d2,d7 bsr tstnode tst.l d5 bne.s fn3 bra fn5 fn6 move.l d2,d7 fn2 move.l _SysBase(PC),a0 adda.l 0(a4),a0 move.l a5,a1 fn4 CALL FindName,_SysBase(PC) tst.l d0 bne.s fn1 lea 4(a4),a4 dbf d7,fn2 fn5 move.l #namerr,d0 bsr putstr move.l a5,d0 bsr putnam clr.b d7 rts fn1 move.b procnum(PC),d2 beq.s fn3 move.l d0,a0 cmp.b 143(a0),d2 bne.s fn4 fn3 moveq.l #1,d7 rts ;list-offset-table TRuNode dc.l 276 TReNode dc.l 406 TWaNode dc.l 420 DevNode dc.l 350 LibNode dc.l 378 ResNode dc.l 336 MemNode dc.l 322 PorNode dc.l 392 SemNode dc.l 532 ;Node has been entered in hex. Check if this node exsists tstnode tst.b fromfile bne.s illegalhex move.l d0,d1 and.l #$ff000001,d1 beq.s inrange move.l #adrerr,d0 bsr putnam illegalhex clr.l d5 rts inrange movem.l d7/a4,-(a7) cmp.l #TRuNode,a4 bne.s inrange1 move.l _SysBase(PC),a0 cmp.l 276(a0),d0 beq.s nodefound subq #1,d7 lea 4(a4),a4 inrange1 move.w #$4000,$dff09a getlist move.l _SysBase(PC),a0 add.l 0(a4),a0 nxtnode tst.l 0(a0) beq.s nxtlist cmp.l a0,d0 beq.s nodefound move.l 0(a0),a0 bra.s nxtnode nxtlist lea 4(a4),a4 dbf d7,getlist move.w #-$4000,$dff09a movem.l d0/d7/a4,-(a7) move.l #noderr,d0 bsr putnam bsr readline movem.l (a7)+,d0/d7/a4 or.b #32,dummy cmp.b #'y',dummy beq.s nodefound1 clr.l d5 movem.l (a7)+,d7/a4 rts nodefound move.w #-$4000,$dff09a nodefound1 move.b #1,d5 etst movem.l (a7)+,d7/a0 rts ;clear our window clearscr tst.b fromfile bne.s cscr1 move.l #cls,d2 move.l fileptr,d1 moveq.l #6,d3 CALL Write,dosbase(PC) cscr1 rts ;allocate FileInfoBlock allocfinfo move.l #260,d0 clr.l d1 CALL AllocMem,_SysBase(PC) move.l d0,finfoptr rts ;free FileInfoBlock freefinfo move.l #260,d0 move.l finfoptr,a1 CALL FreeMem,_SysBase(PC) rts ;Examine ,d0=Lock getfinfo move.l d0,d1 move.l finfoptr,d2 CALL Examine,dosbase(PC) rts ;construct a Pathname from a lock ;d0=Lock ,resulting string is written to window getpath movem.l d1-d7/a0-a6,-(a7) move.l d0,d1 CALL DupLock,dosbase(PC) lea out,a4 clr.b -(a4) gp0 tst.l d0 beq.s putall move.l d0,-(a7) bsr getfinfo move.l finfoptr,a0 move.l 4(a0),d4 lea 8(a0),a0 bsr strlen lea -1(a4),a5 tst.l d4 bmi.s nodir move.b #'/',-(a4) nodir subq #1,d0 bmi.s nofnam gp1 move.b 0(a0,d0),-(a4) dbf d0,gp1 nofnam move.l 0(a7),d1 CALL ParentDir,dosbase(PC) move.l d0,d4 move.l (a7)+,d1 CALL UnLock,dosbase(PC) move.l d4,d0 bra gp0 putall cmp.b #'/',0(a5) bne.s gp2 move.b #':',0(a5) gp2 move.l a4,d0 bsr putnam movem.l (a7)+,d1-d7/a0-a6 rts strlen move.l a0,-(a7) move.l #-1,d0 strl2 addq.l #1,d0 tst.b (a0)+ bne.s strl2 move.l (a7)+,a0 rts strlen2 move.l a0,-(a7) move.l #-1,d0 strl22 addq.l #1,d0 cmp.b #10,(a0)+ bne.s strl22 move.l (a7)+,a0 rts ;write a title and underline ;a0 = pointer to text puthead1 bsr strlen move.l d0,d5 move.l a0,d0 bra putstr puthead2 bsr strlen add.l d0,d5 bra.s ph2 puthead bsr strlen move.l d0,d5 ph2 move.l a0,d0 bsr putnam lea out,a0 move.l a0,d0 ph1 move.b #'-',(a0)+ dbf d5,ph1 move.b #$9b,(a0)+ move.b #'K',(a0)+ move.b #$0a,(a0)+ clr.b 0(a0) bra putstr ;move cursor to a column ;d0 = current position ;d1 = column tab move.l a3,-(a7) lea out,a3 sp5 cmp.b d1,d0 bcc.s sp4 move.b #' ',0(a3,d0) addq.b #1,d0 bra.s sp5 sp4 move.l d1,ptr move.l (a7)+,a3 rts ;convert ascii to byte ;a0 = pointer to text ;d0 = byte getnum cmp.b #'$',0(a0) bne.s isdec bsr readhex move.l d0,d2 rts isdec clr.w d2 clr.w d3 clr.b d6 clr.b d7 cmp.b #'-',0(a0) bne.s gn1 lea 1(a0),a0 moveq.l #1,d6 gn1 move.b (a0)+,d3 cmp.b #'9',d3 bhi.s gn2 cmp.b #'0',d3 bcs.s gn2 moveq.l #1,d7 and.b #$f,d3 muls #10,d2 add.w d3,d2 bra.s gn1 gn2 tst.b d6 beq.s gn3 neg.w d2 gn3 tst.b d7 bne.s gn4 lea -1(a0),a0 gn4 rts ;convert hex to longword ;a0 = pointer to text ;returns d0=value ;d7 = ok/error 1/0 readhex movem.l d1-d6/a1-a5,-(a7) moveq #1,d7 cmp.b #'$',0(a0) bne.s rh3 lea 1(a0),a0 rh3 clr.l d0 cmpi.b #10,0(a0) beq.s rherr lea hextab(pc),a1 rh0 move.b (a0)+,d3 moveq.l #15,d2 rh1 cmp.b 0(a1,d2),d3 beq.s rh2 dbf d2,rh1 bra rhend rh2 lsl.l #4,d0 or.b d2,d0 bra.s rh0 rhend tst.b d3 beq.s rhok cmpi.b #10,d3 beq.s rhok cmpi.b #' ',d3 beq.s rhok rherr clr.l d7 rhok movem.l (a7)+,d1-d6/a1-a5 rts ;skip blanks ;a0 pointer to text ; returns a0 = new pointer position kllblnks cmpi.b #' ',0(a0) bne.s gn4 lea 1(a0),a0 bra.s kllblnks ; exit program. If background flag is set, wait for ; amiga-amiga-x stopall lea 4(a7),a7 bra exitall exit tst.b background bne quithold exitall move.l stplist(PC),a3 tst.l 0(a3) beq.s ex0 move.l a3,d0 bsr waok bra.s exitall ex0 tst.b background beq.s ex1 bsr removeh ex1 move.l _SysBase(PC),a1 move.l #_LVOSwitch,a0 move.l oldswitch,d0 CALL SetFunction,_SysBase(PC) move.l #3,d0 lea IOCounter(PC),a1 CALL RemIntServer,_SysBase(PC) move.l replyport(PC),-(a7) LIBCALL DeletePort lea 4(a7),a7 move.l fileptr(PC),d1 beq.s ex11 CALL Close,dosbase(PC) ex11 bsr freehidmem IFND DEBUG CALL Forbid,_SysBase(PC) move.l wbmsg(PC),d0 beq.s todos move.l d0,a1 CALL ReplyMsg,_SysBase(PC) clr.l d0 rts todos move.l myseg(PC),d1 CALL UnLoadSeg,dosbase(PC) ENDC clr.l d1 CALL Exit,dosbase(PC) ;print a bcpl-string ;d0 = bcpl-pointer to bcpl-string putbcpl movem.l d3/a0-a1,-(a7) tst.l d0 beq.s pb1 lsl.l #2,d0 move.l d0,a1 clr.l d3 move.b (a1)+,d3 move.l ptr(PC),d0 lea out,a0 pb2 move.b (a1)+,0(a0,d0) addq.b #1,d0 dbf d3,pb2 move.l d0,ptr pb1 movem.l (a7)+,d3/a0-a1 rts ;compare strings ;a0/a1 = pointers to string ;returns d0 = true(0) false(1) strcmp movem.l a0-a1,-(a7) clr.l d0 src2 move.b (a0)+,d0 beq.s src1 cmp.b #10,d0 beq.s src1 cmp.b (a1)+,d0 beq.s src2 bra.s src3 src1 move.b 0(a1),d0 src3 movem.l (a7)+,a0-a1 rts ;compare bcpl string with string ;a0 = pointer to string ;a2 = bcpl-pointer to bcpl-string ;returns d0 = true(0) false(1) strbcmp movem.l d1/a0/a2,-(a7) clr.l d0 clr.l d1 adda.l a2,a2 adda.l a2,a2 move.b (a2)+,d1 beq.s stb1 subq #1,d1 stb2 cmp.b (a2)+,(a0)+ bne.s stb1 dbf d1,stb2 moveq #1,d0 stb1 movem.l (a7)+,d1/a0/a2 rts ;concat strings ;a0 = pointer to string ;a1 = pointer to string to be appended ;returns d0 = strlen strcat movem.l d1/a0-a1,-(a7) bsr strlen move.l d0,d1 exg a0,a1 bsr strlen adda.w d1,a1 stc1 move.b (a0)+,(a1)+ dbf d0,stc1 move.l a1,d0 movem.l (a7)+,d1/a0-a1 sub.l a0,d0 rts ;convert long to decimal ;d0 = value ;d3 bit 0 = left/right justified ;d3 bit 1 = write/leave ;returns string in 'buffer' longdec movem.l d1-d2/a1-a2,-(a7) lea binarea+8(PC),a1 move.l #' ',-8(a1) move.l #' ',-4(a1) clr.b 0(a1) lea -1(a1),a1 cmp #2,d3 bne.s ld5 clr.b 0(a1) ld5 moveq #1,d2 ld2 addq #1,d2 moveq #$a,d1 bsr div addi.l #$30,d1 move.b d1,-(a1) tst.l d0 bne.s ld2 btst #0,d3 bne.s ld1 lea binarea(PC),a2 ld3 move.b 0(a1),(a2)+ move.b #' ',(a1)+ dbf d2,ld3 ld1 cmp #2,d3 beq.s ld4 move.l #binarea,d0 bsr putstr ld4 movem.l (a7)+,d1-d2/a1-a2 rts ;write UBYTE ;d3 = value bytedec move.l #dezimal,d0 pm1 bsr dec bra putstr ;write signed byte ;d3 = value plusmins move.l #minus+1,d0 move.w #$2020,minus tst.b d3 bpl.s pm1 neg.b d3 jsr dec move.b #'-',-(a3) bra.s putstr dec move.l #$20202020,dezimal clr.l d4 and.l #$ff,d3 lea dezimal+3(PC),a3 bloop tst.b d3 beq.s bend divu #10,d3 swap d3 ori.b #48,d3 move.b d3,-(a3) clr.w d3 swap d3 bra.s bloop bend cmpa.l #dezimal+3,a3 bne nixfirst move.b #'0',-(a3) nixfirst rts ;write a string, move cursor into next line ;d0 = pointer to text putnam bsr putstr tst.b d0 beq.s ncr bsr newline ncr rts ;write one char ;d0 = char putchar movem.l d1/a0,-(a7) move.l ptr(PC),d1 lea out,a0 move.b d0,0(a0,d1) add.l #1,ptr movem.l (a7)+,d1/a0 rts ;write a string, strings are only written when they end with LF ;d0 = pointer to string ;returns d0 = cursor position putstr movem.l d1-d7/a0-a6,-(a7) move.b #1,printed move.l d0,a2 lea out,a3 move.l ptr(PC),d0 cmp.l #0,a2 beq prend clr d5 pst1 addq #1,d5 cmp #81,d3 beq prend move.b (a2)+,d1 cmpi.b #13,d1 beq pst1 move.b d1,0(a3,d0) beq prend addq #1,d0 cmpi.b #$0a,d1 bne.s pst1 tst.b fromfile bne.s pst24 move.l d0,d3 move.l a3,d2 move.l fileptr,d1 CALL Write,dosbase(PC) pst24 clr.l d0 clr d5 tst.b morefl beq.s pst1 tst.b mnflag beq.s pst1 add.b #1,row move.b row(PC),d1 cmp.b rows,d1 bne.s pst1 move.l #50,d2 move.l fileptr(PC),d1 CALL WaitForChar,dosbase(PC) beq.s pst23 bsr readline pst23 move.l #6,d3 move.l fileptr(PC),d1 move.l #more,d2 CALL Write,dosbase(PC) bsr readline bsr raw clr.b row move.l fileptr(PC),d1 move.l #1,d3 move.l #thisline,d2 CALL Write,dosbase(PC) clr.l d0 bra pst1 prend move.l d0,ptr movem.l (a7)+,d1-d7/a0-a6 rts ;Write 8 byte hex value ;d0 = value hex8 movem.l d1-d7/a0-a6,-(a7) moveq.l #7,d5 lea hex8area(PC),a1 bra hx1 ;Write 6 byte hex value ;d0 = value hexa movem.l d1-d7/a0-a6,-(a7) moveq.l #5,d5 lea hexarea(PC),a1 hx1 lea hextab(PC),a0 clr.l d2 hexloop move.b d0,d2 and.b #15,d2 move.b 0(a0,d2),0(a1,d5) lsr.l #4,d0 dbf d5,hexloop move.l a1,d0 movem.l (a7)+,d1-d7/a0-a6 bra putstr ;Convert/write byte into binary string ;d0 = value bin movem.l d1-d7/a0-a6,-(a7) move.b #' ',binarea+9 moveq.l #7,d4 lea binarea(PC),a0 binloop moveq.l #'0'/2,d1 roxr.b #1,d0 roxl.b #1,d1 move.b d1,0(a0,d4) dbf d4,binloop move.l a0,d0 movem.l (a7)+,d1-d7/a0-a6 bra putstr ;read one line of input string readline tst.b fromfile bne.s rlin1 move.l fileptr(PC),d1 move.l #dummy,d2 moveq.l #80,d3 CALL Read,dosbase(PC) rts rlin1 lea dummy,a3 rlin4 move.l infile(PC),d1 move.l a3,d2 moveq.l #1,d3 CALL Read,dosbase(PC) tst.l d0 beq.s rlin5 cmp.b #10,(a3)+ beq.s rlin2 bra.s rlin4 rlin5 move.b #1,eof rlin3 move.b #10,0(a3) rlin2 lea dummy,a0 bsr strlen2 addq #1,d0 rts ;switch console to con: mode & empty input buffer con tst.b fromfile bne.s conend bsr cmdcon move.l #50,d2 move.l fileptr(PC),d1 CALL WaitForChar,dosbase(PC) beq.s conend bsr readline conend rts cmdcon clr.l dp_Arg1 move.l conmsg(PC),a0 move.l #994,dp_Type bra.s cons1 ;switch console window to raw mode raw tst.b fromfile bne.s conend move.l conmsg(PC),a0 move.l #994,dp_Type move.l #-1,dp_Arg1 ;send a packet ;a0 = msgport ;dp_Type and dp_Arg1 have to be inizialized cons1 movem.l d0-d7/a0-a6,-(a7) move.l #dp_Link,LN_NAME move.l #mypacket,dp_Link move.l replyport(PC),dp_Port lea mypacket,a1 CALL PutMsg,_SysBase(PC) move.l replyport,a0 CALL WaitPort,_SysBase(PC) move.l replyport(PC),a0 CALL GetMsg,_SysBase(PC) movem.l (a7)+,d0-d7/a0-a6 rts ;32-bit division ;d0 / d1 ;returns d0 div movem.l d2-d3,-(a7) swap d1 move.w d1,d2 bne.s div1 swap d0 swap d1 swap d2 move.w d0,d2 beq.s div2 divu d1,d2 move.w d2,d0 div2 swap d0 move.w d0,d2 divu d1,d2 move.w d2,d0 swap d2 move.w d2,d1 bra div8 div1 moveq #$10,d3 cmpi.w #$80,d1 bcc.s div3 rol.l #8,d1 subq.w #8,d3 div3 cmpi.w #$800,d1 bcc.s div4 rol.l #4,d1 subq.w #4,d3 div4 cmpi.w #$2000,d1 bcc.s div5 rol.l #2,d1 subq.w #2,d3 div5 tst.w d1 bmi.s div6 rol.l #1,d1 subq.w #1,d3 div6 move.w d0,d2 lsr.l d3,d0 swap d2 clr.w d2 lsr.l d3,d2 swap d3 divu d1,d0 move.w d0,d3 move.w d2,d0 move.w d3,d2 swap d1 mulu d1,d2 sub.l d2,d0 bcc.s div7 subq.w #1,d3 add.l d1,d0 div7 moveq #0,d1 move.w d3,d1 swap d3 rol.l d3,d0 swap d0 exg d1,d0 div8 movem.l (a7)+,d2-d3 rts ;install a input-handler installh pea 0 pea xopsleep LIBCALL CreatePort lea 8(a7),a7 move.l d0,InputMsg move.l d0,-(a7) LIBCALL CreateStdIO lea 4(a7),a7 move.l d0,InRequest move.l d0,a1 lea devicenam(PC),a0 clr.l d0 clr.l d1 CALL OpenDevice,_SysBase(PC) move.l d0,devstatus movea.l InRequest(PC),a1 move.l #InInterrupt,40(a1) move.w #9,28(a1) CALL DoIO,_SysBase(PC) move.l d0,iostatus move.l #-1,d0 CALL AllocSignal,_SysBase(PC) clr.l d1 bset d0,d1 move.l d1,mysignal rts ;remove handler removeh movea.l InRequest(PC),a1 move.l #InInterrupt,40(a1) move.w #10,28(a1) CALL DoIO,_SysBase(PC) movea.l InRequest(PC),a1 CALL CloseDevice,_SysBase(PC) move.l InRequest,-(a7) LIBCALL DeleteStdIO lea 4(a7),a7 move.l InputMsg,-(a7) LIBCALL DeletePort lea 4(a7),a7 rts ;this is the handler, it checks if amiga-amiga-x ;has been pressed and signals it to our task Keyhandler tst.b running bne.s endhandler cmp.b #1,4(a0) bne.s endhandler move.w 8(a0),d0 andi.w #$c0,d0 cmpi.w #$c0,d0 bne.s endhandler cmp.w #$32,6(a0) bne.s endhandler wakeup move.l a0,-(a7) movea.l mytask(PC),a1 move.l mysignal(PC),d0 CALL Signal,_SysBase(PC) move.l (a7)+,a0 clr.b 4(a0) endhandler move.l a0,d0 rts snoop bsr nodenam moveq.l #2,d7 lea TRuNode(PC),a4 bsr findnam tst.b d7 beq tm6 move.l d0,captask pea 0 pea memportname LIBCALL CreatePort lea 8(a7),a7 move.l d0,snoopport beq tm6 lea snoophead(PC),a0 bsr puthead move.l _SysBase(PC),a1 move.l -196(a1),oldalloc move.l -208(a1),oldfree move.l #capmalloc,d0 move.l #-198,a0 CALL SetFunction,_SysBase(PC) move.l _SysBase(PC),a1 move.l #capmfree,d0 move.l #-210,a0 CALL SetFunction,_SysBase(PC) clr.b bool clr.b cbreak bsr con waitmem move.l snoopport(PC),a0 move.l #$1000,d0 clr.l d1 move.b 15(a0),d1 bset d1,d0 CALL Wait,_SysBase(PC) btst #12,d0 beq.s tm7 move.b #1,cbreak tm7 move.l mytask(PC),a0 move.l snoopport(PC),a0 CALL GetMsg,_SysBase(PC) tst.l d0 bne tm8 tst.b cbreak bne snoopend bra waitmem tm8 move.l d0,a3 move.l 20(a3),d3 btst #31,d3 beq freed move.l #allok,d0 bsr putstr lea memname(PC),a2 lea membit(PC),a4 move.l #4,d5 tm2 move.l 0(a4),d4 btst d4,d3 beq.s tm1 move.l 0(a2),d0 bsr putstr tm1 lea 4(a2),a2 lea 4(a4),a4 dbf d5,tm2 move.l #26,d1 bsr tab move.l 24(a3),d0 move.l d0,d3 bsr hexa move.l 28(a3),d0 bne.s tm3 move.l #failed,d0 bsr putstr move.l #47,d1 bsr tab bra tm4 tm3 bsr hexa move.l 28(a3),d0 add.l d3,d0 bsr hexa bra tm4 freed move.l #free,d0 bsr putstr move.b #'-',d0 move.l #18,d1 tm9 bsr putchar dbf d1,tm9 move.b #' ',d0 bsr putchar move.l d3,d0 bsr hexa move.l 24(a3),d0 bsr hexa move.l 24(a3),d0 add.l d3,d0 bsr hexa tm4 move.l 32(a3),d0 bsr hexa bsr newline move.w 18(a3),d0 ext.l d0 move.l a3,a1 CALL FreeMem,_SysBase(PC) bra tm7 snoopend move.l _SysBase(PC),a1 move.l oldalloc(PC),d0 move.l #-198,a0 CALL SetFunction,_SysBase(PC) move.l _SysBase(PC),a1 move.l oldfree,d0 move.l #-210,a0 CALL SetFunction,_SysBase(PC) move.l snoopport,-(a7) LIBCALL DeletePort lea 4(a7),a7 tm6 rts memname dc.l memlarg,memclr,memfast,memchip,mempubl membit dc.l 17,16,2,1,0 capmalloc movem.l d0-d7/a0-a6,-(a7) move.l _SysBase(PC),a6 move.l 276(a6),d4 cmp.l captask(PC),d4 bne.s capm1 tst.b bool bne capm1 move.b #1,bool move.l #36,d6 bsr allocmsg beq capm2 bset #31,d1 move.l d1,20(a5) move.l d0,24(a5) move.l 60(a7),32(a5) move.l a5,remembr movem.l (a7)+,d0-d7/a0-a6 bsr memalloc movem.l d0-d7/a0-a6,-(a7) move.l remembr(PC),a1 move.l d0,28(a1) move.l snoopport,a0 move.b #5,8(a1) CALL PutMsg,_SysBase(PC) clr.b bool movem.l (a7)+,d0-d7/a0-a6 rts capm2 clr.b bool capm1 movem.l (a7)+,d0-d7/a0-a6 memalloc dc.w $4ef9 oldalloc dc.l 0 capmfree movem.l d0-d7/a0-a6,-(a7) move.l _SysBase(PC),a6 move.l 276(a6),d4 cmp.l captask(PC),d4 bne.s capf1 tst.b bool bne.s capf1 move.b #1,bool move.l #36,d6 bsr allocmsg beq.s capf2 move.l d0,20(a5) move.l a1,24(a5) move.l 60(a7),32(a5) move.l snoopport,a0 move.b #5,8(a5) move.l a5,a1 CALL PutMsg,_SysBase(PC) capf2 clr.b bool capf1 movem.l (a7)+,d0-d7/a0-a6 dc.w $4ef9 oldfree dc.l 0 allocmsg movem.l d0-d1/a0-a1,-(a7) move.l d6,d0 move.l #65536,d1 bsr memalloc tst.l d0 beq.s alm1 move.l d0,a5 move.w d6,18(a5) alm1 movem.l (a7)+,d0-d1/a0-a1 move.l a5,d6 rts capopendev movem.l d0-d7/a0-a6,-(a7) move.l _SysBase(PC),a6 move.l 276(a6),d4 cmp.l captask(PC),d4 bne.s opdev1 tst.b bool bne.s opdev1 move.l #36,d6 bsr allocmsg move.l #0,d0 opdev1: myswitch movem.l d0-d1/a0,-(a7) move.l _SysBase(PC),a0 move.l 276(a0),d0 move.l tasksnum(PC),d1 lea cputime,a0 subq.l #1,d1 bmi.s swadd sw0 cmp.l 0(a0),d0 beq.s swi1 lea 8(a0),a0 dbf d1,sw0 bra.s swadd swi1 add.l #1,4(a0) swgo movem.l (a7)+,d0-d1/a0 dc.w $4ef9 oldswitch dc.l 0 swadd cmp.l #125,tasksnum bge.s swgo add.l #1,tasksnum move.l d0,0(a0) move.l #1,4(a0) bra.s swgo countio addq.l #1,iocount rts dosbase dc.l 0 intuibase dc.l 0 gfxbase dc.l 0 window dc.l 0 parmtxt dc.l 0 fileptr dc.l 0 infile dc.l 0 conmsg dc.l 0 ptr dc.l 0 oldidl dc.l 0 olddisp dc.l 0 myseg dc.l 0 mysignal dc.l 0 iostatus dc.l -1 devstatus dc.l -1 cancelbit dc.l 0 cancelbnum dc.l 0 _SysBase dc.l 0 InputMsg dc.l 0 InRequest dc.l 0 startmess dc.l 0 savedat dc.l 0 mytask dc.l 0 wbmsg dc.l 0 pointer dc.l 0 replyport dc.l 0 finfoptr dc.l 0 dispatches dc.l 0 maxdisp dc.l 0 wbaddr dc.l 0 remembr dc.l 0 remembr2 dc.l 0 captask dc.l 0 snoopport dc.l 0 tasksnum dc.l 0 hidestart dc.l 0 iocount dc.l 0 dummyinput dc.l 0 secs dc.l 0 mics dc.l 0 time10 dc.l 0 stplist dc.l lh_tail lh_tail dc.l 0 dc.l stplist dc.b 1 dc.b 0 InInterrupt dc.l 0 ;ln_Succ dc.l 0 ;ln_Pred dc.b 2 ;ln_Type dc.b 60 ;ln_Pri dc.l xopsleep ;ln_Name dc.l 0 ;is_Data dc.l Keyhandler ;is_Code() IOCounter dc.l 0 ;ln_Succ dc.l 0 ;ln_Pred dc.b 2 ;ln_Type dc.b -1 ;ln_Pri dc.l IOcntname ;ln_Name dc.l 0 ;is_Data dc.l countio ;is_Code() window_l dc.w 0 window_t dc.w 0 window_w dc.w 550 window_h dc.w 200 binarea dc.b ' ',0 EVEN minus dc.b ' ' dezimal dc.b ' ' blnk dc.b ' ',0 entries dc.b 0 timeout dc.b 5 procnum dc.b 0 running dc.b 0 newpri dc.b 0 tasktyp dc.b 0 background dc.b 0 bool dc.b 0 printed dc.b 0 cbreak dc.b 0 rows dc.b 0 row dc.b 0 usageflag dc.b 0 morefl dc.b 1 morefl2 dc.b 1 mnflag dc.b 1 tports dc.b 1 headon dc.b 1 hideon dc.b 1 sorton dc.b 1 eof dc.b 0 fromfile dc.b 0 params dc.b 'tfdlrempis' parmnum equ *-params t2header dc.b ' ID STATE SIGALLOC SIGWAIT SIGRECVD PC TASKNAME',0 theader dc.b ' ID TYPE STATE PRI CPUSE NUM TASKNAME',0 lheader dc.b ' NODE CNT VER REV FLAGS ',0 libnam dc.b 'LIBRARY NAME',0 devnam dc.b 'DEVICE NAME',0 resnam dc.b 'RESOURCE NAME',0 mheader dc.b 'LOWER UPPER FREE ATTR PRI HUNK NAME',0 nxtline dc.b $9b,'K' cr dc.b 10,0 iheader dc.b ' NODE DATA CODE PRI TYPE INTERRUPT NAME',0 inheader dc.b ' NODE DATA CODE PRI NAME',0 rheader dc.b ' ADDR PRI FLAGS VER TYPE RESIDENT NAME',0 pheader dc.b ' NODE PORTNAME FLAGS SIGBT NUM SIGTASK',0 hunkheader dc.b ' BCPL DATA LENGTH',0 ddheader dc.b 'DEVICE HDS SECTORS TRACKS BUFFERS STATE HANDLER',0 cdheader dc.b 'PROCESSNAME CURRENT DIRECTORY',0 ofheader dc.b ' LOCK ACCESS SIZE PATH/FILENAME',0 scrheader dc.b 'NUM ADDR TITLE',0 fohead dc.b ' NODE CNT Y X TYPE LO HI NAME',0 kickhead dc.b 'START END LENGTH',0 snoophead dc.b 'ACTION REQUIREMENTS LENGTH FROM TO CALLER',0 stackhead dc.b 'SPLower SIZE USED TASKNAME',0 access dc.b ' Read ',0 dc.b ' Write ',0 romfnt dc.b 'Rom ',0 diskfnt dc.b 'Disk ',0 wbname dc.b 'Workbench',0 status dc.b 'Added ',0 dc.b 'Running ',0 dc.b 'Ready ',0 dc.b 'Waiting ',0 dc.b 'Exeption ',0 dc.b 'Removed ',0 dc.b 'Frozen ',0 dc.b 'Frozen ',0 type dc.b 'Unknown ',0 dc.b 'Task ',0 dc.b 'Interrupt ',0 dc.b 'Device ',0 dc.b 'Msgport ',0 dc.b 'Message ',0 dc.b 'Freemsg ',0 dc.b 'Replymsg ',0 dc.b 'Resource ',0 dc.b 'Library ',0 dc.b 'Memory ',0 dc.b 'Softint ',0 dc.b 'Font ',0 dc.b 'Process ',0 dc.b 'Semaphore ',0 mp_flags dc.b 'Signal ',0 dc.b 'Softint ',0 dc.b 'Ignore ',0 windowname dc.b 'Xoper V1.3 ) 1989 Werner Gunther',0 newname dc.b 'Xoper',0 memportname dc.b 'MemSnoop',0 xopcon dc.b 'XopPackets',0 xopsleep dc.b 'Xop-A-A-x',0 IOcntname dc.b 'Xop-I/O-counter',0 cmdnum set 0 commds ADDCMD 'time' ADDCMD 'taskpri' ADDCMD 'info' ADDCMD 'pri' ADDCMD 'flush' ADDCMD 'freeze' ADDCMD 'warm' ADDCMD 'signal' ADDCMD 'break' ADDCMD 'alert' ADDCMD 'lastalert' ADDCMD 'hold' ADDCMD 'exit' ADDCMD 'clear' ADDCMD 'cancel' ADDCMD 'more' ADDCMD 'taskports' ADDCMD 'hunks' ADDCMD 'devices' ADDCMD 'openlib' ADDCMD 'closelib' ADDCMD 'currentdir' ADDCMD 'cd' ADDCMD 'mypri' ADDCMD 'files' ADDCMD 'locks' ADDCMD 'unlock' ADDCMD 'screens' ADDCMD 'windows' ADDCMD 'closescreen' ADDCMD 'closewindow' ADDCMD 'fonts' ADDCMD 'windowfonts' ADDCMD 'lockdrive' ADDCMD 'freedrive' ADDCMD 'capture' ADDCMD 'clrcold' ADDCMD 'clrcool' ADDCMD 'clrwarm' ADDCMD 'snoop' ADDCMD 'usage' ADDCMD 'inputhandler' ADDCMD 'header' ADDCMD 'sort' ADDCMD 'hide' ADDCMD 'hidden' ADDCMD 'window' ADDCMD 'kill' hex8area dc.b ' ' hexarea dc.b ' ',0 hextab dc.b '0123456789abcdef' infoh2 dc.b 'Dispatches:',0 infoh1 dc.b 'CPU:',0 infoh3 dc.b 'CPU activity: ',0 infoh6 dc.b 'Total:',0 infoh4 dc.b '% ',0 infoh7 dc.b 'I/O Ints/Sec: ',0 cpu0 dc.b '68000',0 cpu1 dc.b '68010',0 cpu2 dc.b '68020',0 cpu3 dc.b '/68881',0 syst dc.b 'DF0:',0 devload dc.b 'loaded ',0 devnload dc.b 'unloaded ',0 prompt dc.b $9b,'J','->',$9b,$20,$70 cls dc.b $9b,'0 ',$70,$9b,'H' getwin dc.b $9b,$30,$20,$71 thisline dc.b $0d notfile dc.b '--- ------- ------- ------- ',0 ganzlongnix dc.b '-' longnix dc.b '----' nix dc.b '--- ',0 noinfo dc.b 'No Info on ',0 namerr dc.b 'Unable to find ',0 adrerr dc.b 'Address Error!',0 noderr dc.b 'Can`t find this Node. Continue ? (Y/N)',0 listerr dc.b 'Unable to find ListHeader. Sort aborted.',0 wiwerr dc.b 'Script file only',0 noguru dc.b 'No Alert, shall I produce one ?',0 gurutxt dc.b 'Guru Meditation #',0 clrtxt dc.b 'Memory Hunks cleared.',0 canerr0 dc.b 'Process is not a CLI-task',10 dc.b 'Has it been started from Workbench ? (Y/N)',10,0 canerr1 dc.b 'Process was created by CreateProc()',10 dc.b 'Shall I UnLoad() ? (Y/N)',10,0 unloaderr dc.b 'Arrrgh.. can`t find segments, aborting',0 noprocs dc.b 'Not a Process.',0 notload dc.b 'No program loaded.',0 cliprocs dc.b 'Cli-Process',0 procloaded dc.b 'Loaded as a command: ',0 segloaded dc.b 'Created by CreateProc()',0 coldtxt dc.b 'Cold Capture: ',0 cooltxt dc.b 'Cool Capture: ',0 warmtxt dc.b 'Warm Capture: ',0 kicktxt dc.b 'KickMem : ',0 unset dc.b 'unset',0 intnames dc.b 'Serial Out ',0 dc.b 'Disk Block ',0 dc.b 'SoftInt ',0 dc.b 'Ports ',0 dc.b 'Coper ',0 dc.b 'VBeam ',0 dc.b 'Blitter ',0 dc.b 'Audio Ch.0 ',0 dc.b 'Audio Ch.1 ',0 dc.b 'Audio Ch.2 ',0 dc.b 'Audio Ch.3 ',0 dc.b 'Serial In ',0 dc.b 'Disk Sync ',0 dc.b 'External ',0 dc.b 'SoftInt ',0 dc.b 'NMI ',0 inttyp dc.b 0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1 devicenam dc.b 'input.device',0 memlarg dc.b 'LARGEST ',0 memclr dc.b 'CLEAR ',0 memfast dc.b 'FAST ',0 memchip dc.b 'CHIP ',0 mempubl dc.b 'PUBLIC ',0 failed dc.b 'Failed !',0 allok dc.b 'ALLOC: ',0 free dc.b 'FREE: ',0 startupname dc.b 'S:Xoper.Startup',0 synerr dc.b 'Syntax Error, type "?" for help',10,0 more dc.b '<MORE>' waittxt dc.b '<ANY KEY>',$9b,$4a wberr dc.b 'Can`t examine Workbench locks',0 dnotf dc.b 'Directory not found',0 notdir dc.b 'Not a directory',0 nomount dc.b ' not mounted.',0 dishelp dc.b 10,'Names are case sensitive and followed by a ":"',0 unlerr dc.b 'Lock not found',0 unl1 dc.b 'Lock is on ',0 unltxt dc.b 'Old lock was: ',0 unltxt2 dc.b 'Unlock ? (Y/N)',10,0 scnofound dc.b 'Screen not found.',0 winnofound dc.b 'Window not found.',0 stperr dc.b 'Task must be "READY" or "WAITING"',10,0 waerr dc.b 'Task must be "FROZEN"',10,0 onscr dc.b 'On Screen: ',0 usetxt dc.b $9b,'1mUSAGE:',$9b,'0m Xoper [T] [A] [L] [D] [R] [E] [M] [P] [I] [S]',$9b,'K',10 dc.b 'OR Xoper -b',$9b,'K',10 dc.b $9b,'1mDISPLAY:',$9b,'0m',$9b,'K',10 dc.b '[T]asks [F]=taskflags [L]ibraries [D]evices [R]esources',$9b,'K',10 dc.b 'r[E]sident [M]emory [P]orts [I]nterrupts [S]tack [Q]uit',$9b,'K',10 dc.b $9b,'1mCOMMANDS:',$9b,'0m',$9b,'K',10 dc.b 'Time <secs>',$9b,'K',10 dc.b 'Taskpri <priority> [processnum] <taskname>',$9b,'K',10 dc.b 'Mypri <priority>',$9b,'K',10 dc.b 'Signal <mask(hex)> [processnum] <taskname>',$9b,'K',10 dc.b 'Break [processnum] <taskname>',$9b,'K',10 dc.b 'Freeze|Warm [processnum] <taskname>',$9b,'K',10 dc.b 'Kill [processnum] <taskname>',$9b,'K',10 dc.b 'Snoop [processnum] <taskname>',$9b,'K',10 dc.b 'Hide <taskname>',$9b,'K',10 dc.b 'Pri <priority> <nodename>',$9b,'K',10 dc.b 'Info <name>',$9b,'K',10 dc.b 'Clear <longword(hex)>',$9b,'K',10 dc.b 'Hunks [processnum] <procname>',$9b,'K',10 dc.b 'CD <directory> [processnum] <procname>',$9b,'K',10 dc.b 'Unlock <lock>',$9b,'K',10 dc.b 'Openlib | Closelib <libraryname>',$9b,'K',10 dc.b 'Closewindow| Closescreen <title>',$9b,'K',10 dc.b 'Lockdrive | Freedrive <drivename:>',$9b,'K',10 dc.b 'Window <leftedge topedge width height> (scriptfile only) ',$9b,'K',10 dc.b 'Flush,Devices,Currentdir,Files,Locks,Lastalert,More,Sort',$9b,'K',10 dc.b 'Taskports,Windows,Screens,Fonts,Windowfonts,Capture,Hidden',$9b,'K',10 dc.b 'ClrCool,ClrCold,ClrWarm,Usage,InputHandler,Header',$9b,'K',10 dc.b 'Hold,Exit',$9b,'K',10 null dc.b 0 IFD DEBUG dosname dc.b 'dos.library',0 intuiname dc.b 'intuition.library',0 gfxname dc.b 'graphics.library',0 EVEN ENDC BSS blabla buffer ds.b 2000 fname ds.b 284 out ds.b 80 dummy ds.b 80 in ds.b 80 cputime ds.b 1000 mypacket BSS standardpacket LN_SUCC ds.l 1 LN_PRED ds.l 1 LN_TYPE ds.b 1 LN_PRI ds.b 1 LN_NAME ds.l 1 MP_FLAGS ds.b 1 MP_SIGBIT ds.b 1 MP_SIGTASK ds.l 1 MN_SIZE ds.w 1 LH_HEAD ds.l 1 LH_TAIL ds.l 1 LH_TAILPRED ds.l 1 LH_TYPE ds.b 1 LH_pad ds.b 1 dp_Link ds.l 1 dp_Port ds.l 1 dp_Type ds.l 1 dp_Res1 ds.l 1 dp_Res2 ds.l 1 dp_Arg1 ds.l 1 dp_Arg2 ds.l 1 dp_Arg3 ds.l 1 dp_Arg4 ds.l 1 dp_Arg5 ds.l 1 dp_Arg6 ds.l 1 dp_Arg7 ds.l 1 END SHAR_EOF cat << \SHAR_EOF > Xoper.doc Xoper V1.3 Copyright (c) Werner Gunther 1989 Xoper is a freeware program to display and to control system activity. Permition is granted to freely distribute this program. -------------------------------------------------------------------------- Changes in V1.2: New commands: Snoop, Capture, ClrCool, ClrWarm, ClrCold. Added : CPU usage by task. Cancel command has been rewritten, some minor bugs removed. -------------------------------------------------------------------------- Changes in V1.3: New commands: [S]=Stack usage, Sort, Hide, Hidden, Header, Window, InputHandler. Added : Support of startup-scripts, I/O Interrupts/second, 'Kill' an alias for 'Cancel'. Some BIG bugs have been removed: The port-display used to GURU if more than 32 Ports did exist. The Cli Xoper has been started did act like having a priority of 128. Unlock didn't unlock sometimes, the interrupt/priority field did contain rubbish, Currentdir didn't examine all Processes. There were some more, minor bugs, all (hopefully) removed. -------------------------------------------------------------------------- Starting Xoper from CLI: Xoper [T] [F] [S] [L] [D] [R] [E] [M] [P] [I] These parameters are described below. For all those who like long Startup-Sequences, overcrowded memory and hot-keys enter Xoper -b This will install Xoper in background waiting for LeftAmiga-RightAmiga-X to pop up. In both cases you don't have to RUN or RUNBACK Xoper, it will always create its own process. At startup Xoper loads and executes a file named S:Xoper.Startup if such a file is available. This startup-script is used to set default values, the window size or the initial default list to be displayed. The Xoper-window will only be opened after the startup-script has been processed. Look at the end of the document for a sample startup file. Xoper Commands: --------------- Commands can be entered after the prompt '->', these are divided into two groups: Display commands: These are always single character entries and may be specified in any order, upper or lower case, with or w/o embedded blanks, after the prompt or from CLI as parameters: T = Tasks (Default if Xoper is called without parameters) Task node (HEX), Display type, status, priority (decimal), CPU usage (percent), processnumber for Dos-Processes (decimal), taskname. F = Task Flags Task node (HEX), Allocated Signals (HEX), Signals the Task is waiting for (HEX), Signals received (HEX), Address of the next instruction to be executed (HEX). L = Libraries Base address (HEX), open count (decimal), version (decimal), revision (decimal), flags (binary), libraryname. D = Devices Base address (HEX), open count (decimal), version (decimal), revision (decimal), flags (binary), devicename. E = Resident (sorry) Base address (HEX), priority (decimal), flags (binary), version (decimal), type, name. R = Resources Base address (HEX), open count (decimal), version (decimal), revision (decimal), flags (binary), resource name. M = Memory Lower and upper bounds (HEX), bytes free (decimal), attributes, priority (decimal), hunk name. P = Ports Node address (HEX), portname, flags, signal bit (decimal), queue length [number of messages] (decimal), taskname. I = Interrupts Node address (HEX), pointer to interrupt data (HEX), pointer to interrupt code (HEX), priority (decimal),type [interrupt queue the interrupt belongs to], interrupt name. S = Stack Lower limit of the stack, stack size, currently used stacksize, taskname. If you want to minimize your stack using this utility, please note that Dos-functions use 1500 Bytes at the bottom of the Stack frame for their own purposes and note that the stacksize is only checked one time per second by this command. H = Help ( or ?) Show a list of commands. ; = NOP Skip this line (used for remarks in a script file) Q = Quit Same as QUIT (see below). Example: Entering TPM would display Tasks, Ports and Memory. The display would be updated after a few seconds (5 by default, may be changed anytime, see below.) Other commands that do not display lists: These commands may be entered upper or lower case. Parameters enclosed in '<>' must be, enclosed in '[]' may be specified. Names are usually entered as ascii-strings, it can however happen that two or more nodes of the same name exist. On tasks you may specify the DOS-Processnumber to sort them out. If everything fails, you can enter the Node-Address with a leading '$'. This Address will be checked first before the command is being executed. If the check fails, you'll get an error message or a warning or a prompt, depending on what went wrong. Names are always the last parameter to enter. This may seem strange, but it is the simplest way to get rid of embedded blanks. Time <seconds> Set time between updates. Minimum is 1 second, maximum is 255, default is 5 seconds. Example: Time 1 Taskpri <priority> [processnumber] <taskname> Change the priority of a task. Values may range from -127 to 127, better use values between -5 and 5. Example: Taskpri 5 New Cli Mypri <priority> Shortcut for "Taskpri Xoper <priority>" Example: Mypri 6 Pri <priority> <nodename> Change the priority of any other node. This command does not work for Tasks. If the specified node has been found, the entire list the node belongs to will be resorted. Example: Pri 1 Chip Memory (try to allocate memory in CHIP first) Break [processnumber] <taskname> Set break signals. Useful for tasks running in background or from Workbench. Example: Break 3 New CLI Hunks [processnumber] <processname> Show location, BCPL-Pointers and length of memory blocks the process uses. Example: Hunks RAM Snoop [processnumber] <taskname> Track memory allocation/deallocation of a task. Press break (CTRL-C) to stop. List includes: action (alloc/free), memory requirements (CHIP/ FAST/ PUBLIC etc), memory size, memory location (start, end) and the address from where AllocMem() was called. Files List lock, access, size and name of open files. Locks List any lock. BUG: Trying to lock the Volume "RAM Disk" crashes the machine sometimes. If a Volume "RAM Disk" is found it will be replaced by the devicename "RAM:" (this has been fixed on WB 1.3). Make sure you don't have a disk labeled "RAM Disk" or you'll never see its locks:-) Currentdir List current directory settings of all processes. Devices List name,heads,sectors,tracks,startup-buffers and handler-process of every DOS-device. Inputhandler Display node, priority and name (if any) of the input-handlers currently in use. Capture Show vectors controlling the reset, i.e. CoolCapture, ColdCapture and WarmCapture pointers, KickMem allocations. Useful when searching for Viruses, but remember that the RAD: device in 1.3 uses the KickMem pointer to recover from a reset. ClrCool ClrCold ClrWarm Clear one of those pointers. Lockdrive <drivename:> Prevent DOS, Workbench and Disk-Validator from cluttering on the drive. This command isn't very useful, but I needed it myself. Please note that the drivename is case sensitive and has to end with a ':'. Freedrive <drivename:> Re-enable a drive. Windows List address and title of all windows. Screens List address and title of screens. Fonts List address,height,width,type,fist character and last character of all loaded fonts. Windowfonts List Windows and associated fonts. Freeze [processnumber] <taskname> Halt a Task. The task should be READY or WAITING. Frozen tasks are queued in a new list called FROZEN. When you leave Xoper, halted Task will be released. Example: Freeze Killer Graphics Task Warm [processnum] <taskname> Restart a halted Task. Task must be FROZEN. Example: Warm Killer Graphics Task Hide <taskname> The task-list tend to be longer than the window size. You may inhibit the output of some tasks you are not interested in using his command. Example: Hide trackdisk.device Hidden Turn those hidden Tasks back on. It actually is a toggle. Header Toggle the (rather long) header on the task display on/off. Sort The tasks listing is sorted (on V1.3 and above) to avoid 'jumping' of the display. Sort toggles this feature on/off. (Stupid command, but was easy to implement). Info <librarynode | devicenode> Show additional information stored in the lib_IdString field. Example: Info arp.library Openlib <libraryname> Open a library. This is useful if you don't want a specified library being 'flushed' out. Example: Openlibrary arp.library Clear [longword] Fill unused memory chunks with pattern, default is 0. Handy for debuggers. Example: Clear $66726565 Flush Clean up memory, flush unused libraries, devices and fonts. Lastalert Show last Guru Meditation code or rubbish. Usage Toggle CPUSE field on the task display between usage relative to all possible dispatches and usage relative to actually dispatched tasks. Ahem...not very clear I think. Well, let me try again... If you add all CPUSE fields together you get 100 % (more or less 1%). After entering "Usage" adding the fields together will give you the same value as shown in the 'CPU Activity field'. (I HATE having to write docs) Taskports Disable / enable a listing of taskports if ports are displayed. More Stop displaying "<MORE>" and "<RETURN>" if output exceeds window. Window <leftedge> [toptedge [width [height]]] Works only on script files. Defines the window to be opened. Example: Window 0 0 550 190 Quit or just Q Exit Xoper. If Xoper was started with '-b' or if 'Hold' was specified it will stay in background waiting for LeftAmiga-RightAmiga-X. Hold Exit Xoper but install a key-handler and stay in background. Window settings and display commands are saved. Exit Clean up and quit. !!!! WARNING: The next few commands are dangerous and 'dirty' !!!!! !!!!!!!!!!!! don't use them if not strictly necessary !!!!!!!!!!!!! Kill [processnumber] <taskname> Kill a task or a process. If the task has been called from CLI, the Task itself and the CLI will be killed. Hunks, Windows, Screens and the teminal-window will be freed. Simple tasks are just RemTask()'ed. If it is not a CLI Task you'll be asked if it is a Workbench task, if the answer is 'Yes' unloading will be done by the Workbench. If not, you will be prompted if Xoper should unload the code. Enter 'No' if you don't know how the task has been started. Closewindow <title> Closes a Window. Please, use it only if the corresponding Task has been 'Cancel'ed. Use the Window-Structure address if the window has no name. Closescreen <title> same as above, but for screens. Unlock <lock (BPTR)> Unlock a file. Closelib <libraryname> This is exactly the same as CloseLibrary(). CD [processnumber] <processname> Change the current directory of a process. You are prompted if the old directory lock should be unlocked. Signal <mask> [processnumber] <taskname> Set any task-signal. Mask is a hexadecimal value with or w/o leading '$'. See task's SIGWAIT field for sensible values. Tasks normaly do not wait for signals only, but for messages, that's why this command may not have the desired effect, but it is quite useful for tasks hanging around and waiting for events that may never happen. Warning: Using Signal without any knowledge about what you are going to signal may cause a system-crash! Example: Signal 10000000 PopCLI III ---------------------------------------------------------------------------- ;Sample Startup Script (to be placed in s:Xoper.Startup) ; ; Window definition on a overscanned + PAL Workbench screen Window 122 0 550 230 ; ;don't display some Tasks ; Hide CON Hide trackdisk.device ; ;but turn them on on Startup ; Hidden ; ;Change the default list to Ports ; P ;don't display any prompt if the window is full More ---------------------------------------------------------------------------- I want to thank these people for helping me to debug and enhance the current Version of Xoper: Jeff White, Patrik Skottsborg, Michael Beer, Christian Balzer, Lars Soltau, Heiko Rath and Bob Page. Thanks. ---------------------------------------------------------------------------- Please send flames, bug reports and especially a list of features you would like to have included in the next version to Werner Gunther Wingertspfad 12 D 6900 Heidelberg (Germany) or to my EMAIL address for a fast response: G35@DHDURZ1.BITNET SHAR_EOF # End of shell archive exit 0 -- Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page Have five nice days.