Path: utzoo!utgpu!attcan!uunet!wyse!vsi1!ames!mailrus!iuvax!pur-ee!j.cc.purdue.edu!ain From: ain@j.cc.purdue.edu (Pat-bob White) Newsgroups: comp.sources.amiga Subject: Xoper (sources 2 of 2) Keywords: utility, process, monitor Message-ID: <7972@j.cc.purdue.edu> Date: 17 Oct 88 12:10:17 GMT Organization: PUCC Land, USA Lines: 1373 Approved: akl@j.cc.purdue.edu (Rob Tillotson) Submitted by: Guenther Werner Summary: A system monitor utility Poster Boy: Rob Tillotson (akl@j.cc.purdue.edu) Archive Name: sources/amiga/volume5/xoper.s.2.Z Tested NOTES: This is a very good system monitor utility, written completely in assembly language. It allows you to inspect the status of just about every possible bit of the system, and also allows you to do such things as signaling tasks, opening and closing libraries, freeing task resources, and other dangerous but useful things. The source was originally one 77k assembly file; it has been split into two parts. Simply concatenate them together to produce the original source. ======================================== # 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.a.2 # This archive created: Thu Oct 13 13:45:10 1988 # By: Rob Tillotson (Bored Students Anonymous) cat << \SHAR_EOF > Xoper.a.2 beq endcanc move.l $ac(a1),a2 adda.l a2,a2 adda.l a2,a2 dwa1 tst.l 60(a2) bne.s dwa1 clr.l d5 bra dosreturn endcanc move.l remembr(PC),d1 beq.s ecan1 CALL Close,dosbase(PC) ecan1 move.l remembr2(PC),d1 beq.s ecan2 CALL Close,dosbase(PC) ecan2 rts endtask CALL Forbid,_SysBase(PC) move.l _SysBase(PC),a1 move.l 276(a1),a1 move.l 176(a1),a1 lea -4(a1),a7 rts ;Stop a task (just queue it on a special list) freeze bsr nodenam moveq.l #1,d7 lea TReNode(PC),a4 bsr findnam tst.b d7 bne.s frok move.l #stperr,d0 bra putstr frok move.w #$4000,$dff09a move.l d0,a1 CALL Remove,_SysBase(PC) move.w #-$4000,$dff09a move.l d0,a1 move.l d0,a5 lea stplist(PC),a0 CALL AddHead,_SysBase(PC) add.b #4,15(a5) rts ;put the task back on its list warm bsr nodenam lea stplist(PC),a0 movea.l a5,a1 clr.l d7 bsr fn4 tst.b d7 bne.s waok move.l #waerr,d0 bra putstr waok move.w #$4000,$dff09a move.l d0,a1 CALL Remove,_SysBase(PC) move.l d0,a1 move.l d0,a5 move.l TReNode,a0 cmp.b #8,15(a1) bne.s wa1 move.l TWaNode,a0 wa1 adda.l _SysBase(PC),a0 CALL AddTail,_SysBase(PC) move.l d0,a1 sub.b #4,15(a5) move.w #-$4000,$dff09a rts ;show the hunks of a process hunks bsr nodenam moveq.l #2,d7 lea TRuNode(PC),a4 bsr findnam tst.b d7 bne.s hu1 rts hu1 move.l d0,a4 cmp.b #13,8(a4) beq.s hu2 move.l #noprocs,d0 bra putnam hu2 move.l 128(a4),d0 beq.s noprogload lsl.l #2,d0 move.l d0,a3 move.l 12(a3),d1 beq.s hu3 move.l #segloaded,d0 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 move.l #nxtline,d0 bsr putstr 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 move.l #nxtline,d0 bsr putstr 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,signals bsr nodenam moveq.l #2,d7 lea TReNode(PC),a4 bsr findnam tst.b d7 beq.s pi1 move.l d0,a1 move.l signals,d0 and.l 18(a1),d0 CALL Signal,_SysBase(PC) 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 pi1 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 ;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 move.l #nxtline,d0 bra putstr ;toggle '' on/off moretst bchg #0,morefl 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 ;toggle task-ports display on/off taskports bchg #0,tports clo1 rts ;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 bsr readhex tst.b d7 beq syntax 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 move.l d0,d1 and.l #$ff000001,d1 beq.s inrange move.l #adrerr,d0 bsr putnam 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 move.l #cls,d2 move.l fileptr,d1 moveq.l #6,d3 CALL Write,dosbase(PC) 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 ;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 buffer,a0 move.l a0,d0 ph1 move.b #'-',(a0)+ dbf d5,ph1 clr.b 0(a0) bra putnam ;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.b #1,d7 cmp.b #'$',0(a0) bne.s rh3 lea 1(a0),a0 rh3 clr.l d0 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 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 replyport,-(a7) LIBCALL DeletePort lea 4(a7),a7 move.l fileptr(PC),d1 CALL Close,dosbase(PC) 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 buffer+8,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 buffer,a2 ld3 move.b 0(a1),(a2)+ move.b #' ',(a1)+ dbf d2,ld3 ld1 cmp #2,d3 beq.s ld4 move.l #buffer,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 move.l #nxtline,d0 bsr putstr 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 if they end with CR ;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 pst1 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 move.l d0,d3 move.l a3,d2 move.l fileptr,d1 CALL Write,dosbase(PC) clr.l d0 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 #6,d3 move.l fileptr,d1 move.l #more,d2 CALL Write,dosbase(PC) bsr con bsr readline bsr raw clr.b row move.l #4,d3 move.l fileptr,d1 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) 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 move.l fileptr,d1 move.l #dummy,d2 moveq.l #80,d3 CALL Read,dosbase(PC) rts ;switch console to con: mode & empty input buffer con bsr cmdcon move.l #50,d2 move.l fileptr,d1 CALL WaitForChar,dosbase(PC) beq.s conend bsr readline conend rts cmdcon clr.l dp_Arg1 move.l conmsg,a0 move.l #994,dp_Type bra.s cons1 ;switch console window to raw mode raw move.l conmsg,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,dp_Port lea mypacket,a1 CALL PutMsg,_SysBase(PC) move.l replyport,a0 CALL WaitPort,_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 0 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 dosbase dc.l 0 intuibase dc.l 0 gfxbase dc.l 0 window dc.l 0 parmtxt dc.l 0 fileptr 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 _SysBase dc.l 0 InputMsg dc.l 0 InRequest dc.l 0 signals dc.l 0 mytask dc.l 0 wbmsg dc.l 0 pointer dc.l 0 replyport dc.l 0 finfoptr dc.l 0 wbaddr dc.l 0 remembr dc.l 0 remembr2 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 0 ;ln_Name dc.l 0 ;is_Data dc.l Keyhandler ;is_Code() window_l dc.w 0 window_t dc.w 0 window_w dc.w 550 window_h dc.w 200 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 rows dc.b 0 row dc.b 0 morefl dc.b 1 mnflag dc.b 1 tports dc.b 1 params dc.b 'tsdlrempi' parmnum equ *-params t2header dc.b ' ID STATE SIGALLOC SIGWAIT SIGRECVD PC TASKNAME',0 theader dc.b ' ID TYPE STATE PRI 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 rheader dc.b ' ADDR PRI FLAGS VER TYPE RESIDENT NAME',0 pheader dc.b ' NODE PORTNAME FLAGS SIGBIT 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 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 'Freezed ',0 dc.b 'Freezed ',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.1 ) 1988 Werner Gunther',0 newname dc.b 'Xoper V1.1',0 prtnam dc.b 'PRT:',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' hex8area dc.b ' ' hexarea dc.b ' ',0 binarea 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 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 $9b,$46,$9b,$4b 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!',10,0 noderr dc.b 'Can`t find this Node. Continue ? (Y/N)',0 listerr dc.b 'Unable to find ListHeader. Sort aborted.',0 noguru dc.b 'No Alert, shall I produce one ?',0 gurutxt dc.b 'Guru Meditation #',0 clrtxt dc.b 'Memory Hunks cleared.',0 canerr1 dc.b 'Process was created by CreateProc()',10 dc.b 'Shall I UnLoad() ? (Y/N)',10,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 canerr2 dc.b 'Use ENDCLI command to close a CLI-Window.',0 canerr3 dc.b 'Process is waiting for DOS I/O and will be canceled when finished. ',0 intnames dc.b 'Serial Out ',0 dc.b 'Disk Block ',0 dc.b 'SoftInt ',0 dc.b 'CIAA ',0 dc.b 'Copper ',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 'CIAB ',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 synerr dc.b 'Syntax Error, type "?" for help',10,0 more dc.b '' waittxt dc.b '',$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 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 "FREEZED"',10,0 onscr dc.b 'On Screen: ',0 usetxt dc.b $9b,'1mUSAGE:',$9b,'0m Xoper [T] [S] [L] [D] [R] [E] [M] [P] [I]',$9b,'K',10 dc.b 'OR Xoper -b',$9b,'K',10 dc.b $9b,'1mDISPLAY:',$9b,'0m',$9b,'K',10 dc.b '[T]asks [S]=taskstate [L]ibraries [D]evices [R]esources',$9b,'K',10 dc.b 'r[E]sident [M]emory [P]orts [I]nterrupts [Q]uit',$9b,'K',10 dc.b $9b,'1mCOMMANDS:',$9b,'0m',$9b,'K',10 dc.b 'Time ',$9b,'K',10 dc.b 'Taskpri [processnum] ',$9b,'K',10 dc.b 'Mypri ',$9b,'K',10 dc.b 'Signal [processnum] ',$9b,'K',10 dc.b 'Break [processnum] ',$9b,'K',10 dc.b 'Freeze|Warm [processnum] ',$9b,'K',10 dc.b 'Cancel [processnum] ',$9b,'K',10 dc.b 'Pri ',$9b,'K',10 dc.b 'Info ',$9b,'K',10 dc.b 'Clear ',$9b,'K',10 dc.b 'Hunks [processnum] ',$9b,'K',10 dc.b 'CD [processnum] ',$9b,'K',10 dc.b 'Unlock ',$9b,'K',10 dc.b 'Openlib | Closelib ',$9b,'K',10 dc.b 'Closewindow| Closescreen ',$9b,'K',10 dc.b 'Lockdrive | Freedrive <DFn:>',$9b,'K',10 dc.b 'Flush,Devices,Currentdir,Files,Locks,Lastalert,More',$9b,'K',10 dc.b 'Taskports,Windows,Screens,Fonts,Windowfonts,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 256 fname ds.b 284 out ds.b 80 dummy ds.b 80 in ds.b 80 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 # End of shell archive exit 0