root%swap@Sun.COM (Operator) (10/28/89)
Submitted-by: g35@dhdurz1@bitnet (Werner Guenther) Posting-number: Volume 89, Issue 190 Archive-name: kernel/xoper20.1 Changes in V2.0: The user interface has been rewritten from scratch, and a small iconify routine has been added. To customize the whole thing a little bit, there are a few new commands: MinimumChars, HistoryLines, ShowHistory, KillHistory, OutputLines, IconifyOff, BackDropIcon, UseScreen, UseWindow. Other new commands include: TimerIO, RemResident, Repeat, TrapGuru, Setfont, DiskChange, Alias, SaveOutput. Addresses are now shown as 32-Bit values for 68020 compatibility. 'display commands' separated by blanks will display the lists one by one rather than all at once. The 'interrupt list' has two new fields. 'Time' w/o parameters shows current setting. The 'More' command is obsolete and has been removed. [NOTE: The source file was too big to fit in one posting, so I broke it into three parts, labeled xoper.a1 though xoper.a3. Once you unshar all three parts, join the three .aX files into Xoper.a ..bob] # This is a shell archive. # Remove anything above and including the cut line. # Then run the rest of the file through 'sh'. # Unpacked files will be owned by you and have default permissions. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: SHell ARchive # Run the following text through 'sh' to create: # xoper.a1 # This is archive 1 of a 3-part kit. # This archive created: Fri Oct 27 23:48:52 1989 echo "extracting xoper.a1" sed 's/^X//' << \SHAR_EOF > xoper.a1 X****************************************** X* * X* Xoper 2.0 Copyright (C) Werner Gunther * X* * X****************************************** X* Written for the A68K Assembler * X* (Fish 110) by Charlie Gibbs and * X* Brian R. Anderson * X* * X* Do not use Smallcode/Smalldata when * X* linking * X****************************************** X;DEBUG SET 1 X XREF _LVOSwitch X XREF _LVOAddTask X XDEF _SysBase Xsysbase equ 4 X XCALL MACRO X xref _LVO\1 X move.l \2,a6 X jsr _LVO\1(a6) X ENDM XLIBCALL MACRO X xref _\1 X jsr _\1 X ENDM X XADDCMD MACRO Xcmdnum set cmdnum+1 X dc.b \1,0 X ENDM X X;Program startup. If called from DOS we X;use segment splitting to detach X;from our DOS-task. Xstart moveq #3,d0 X lea dummyinput,a1 Xgetparm move.b (a0)+,(a1)+ X dbf d0,getparm X move.b #10,in X lea conname(PC),a1 X move.l sysbase,a0 X lea 350(a0),a0 X CALL FindName,sysbase X move.l d0,condev X lea dosname(PC),a1 X move.l sysbase,a0 X lea 378(a0),a0 X move.l a0,-(a7) X CALL FindName,sysbase X move.l d0,dosbase X move.l 0(a7),a0 X lea gfxname(PC),a1 X CALL FindName,sysbase X move.l d0,gfxbase X move.l (a7)+,a0 X lea intuiname(PC),a1 X CALL FindName,sysbase X move.l d0,intuibase X move.l d0,a0 X move.l $38(a0),a0 X move.w 12(a0),d0 X sub.w #550,d0 X move.w d0,window_l X X move.l sysbase,a4 X move.l 276(a4),a4 X tst.l $ac(a4) X bne.s notwb X lea $5c(a4),a0 X CALL WaitPort,sysbase X lea $5c(a4),a0 X CALL GetMsg,sysbase X move.l d0,wbmsg X move.w #$740a,in Xnotwb: X IFND DEBUG X lea xopcon,a1 X CALL FindPort,sysbase X tst.l d0 X bne oops X ENDC X tst.l wbmsg X beq.s fromdos X jmp mainprg X Xfromdos: X Xstarttask: X X IFND DEBUG X cmp.w #'-b',dummyinput X bne.s stt1 X CALL Output,dosbase X move.l d0,-(a7) X move.l #windowname,d2 X move.l d0,d1 X moveq.l #newname-windowname-1,d3 X CALL Write,dosbase X move.l #cr,d2 X move.l (a7)+,d1 X moveq.l #1,d3 X CALL Write,dosbase Xstt1 lea start(PC),a1 X move.l -4(a1),d3 X move.l d3,myseg X X move.l #mainprg,d3 X subq #4,d3 X lsr.l #2,d3 X X clr.l -4(a1) X CALL Forbid,sysbase X move.l #newname,d1 X clr.l d2 X move.l #3500,d4 X CALL CreateProc,dosbase X CALL Permit,sysbase X moveq #0,d0 X rts Xoops suba.l a0,a0 X CALL DisplayBeep,intuibase X CALL Forbid,sysbase X move.l wbmsg,d0 X beq.s leave X move.l d0,a1 X CALL ReplyMsg,sysbase X moveq #0,d0 Xleave rts X Xdosname dc.b 'dos.library',0 Xintuiname dc.b 'intuition.library',0 Xgfxname dc.b 'graphics.library',0 Xconname dc.b 'console.device',0 X EVEN X Xmain CODE xoper X ENDC Xmainprg move.l sysbase,a0 X move.l a0,_SysBase X move.l a7,realstack X move.l 276(a0),a0 ;ExecBase->ThisTask X move.l a0,mytask X move.l 50(a0),oldproctrap ;original AmigaDos Trap-Handler X move.l #newname,10(a0) X pea 0 X pea xopcon X LIBCALL CreatePort X addq #8,a7 X move.l d0,replyport X pea 0 X pea 0 X LIBCALL CreatePort X addq #8,a7 X move.l d0,timerport X lea timerio,a1 X move.l d0,14(a1) X move.l d0,a2 X move.b 15(a2),d0 X ext.w d0 X move.w d0,timersig X lea timernam(PC),a0 X moveq #0,d1 X moveq #1,d0 X CALL OpenDevice,_SysBase(PC) ;open 'timer.device' X X;install a counter to determine the amount of CPU-time each X;Task uses. X move.l _SysBase(PC),a1 X move.l #_LVOSwitch,a0 X move.l 2(a1,a0),oldswitch X move.l #myswitch,d0 X CALL SetFunction,_SysBase(PC) X;install a counter for PORT-Interrupts X lea IOCounter(PC),a1 X moveq #3,d0 X CALL AddIntServer,_SysBase(PC) X X;Attempt to open a startup script X move.l mytask(PC),a4 ;disable the 'please insert' X move.l 184(a4),-(a7) X move.l #-1,184(a4) ;requester X move.l #startupname+2,d1 ;'Xoper.Startup' X move.l #1005,d2 X CALL Open,dosbase(PC) X tst.l d0 X bne.s 7$ X move.l #startupname,d1 ;'S:Xoper.Startup' X move.l #1005,d2 X CALL Open,dosbase(PC) X X7$ move.l (a7)+,184(a4) ;reenable the requester X move.l d0,infile X beq.s nostartup X X6$ move.b #1,fromfile X X8$ lea dummy,a5 X moveq #-1,d5 X5$ addq.l #1,d5 X move.l infile(PC),d1 X move.l a5,d2 X add.l d5,d2 X moveq.l #1,d3 X CALL Read,dosbase(PC) X tst.l d0 X bgt.s 10$ X X move.l infile(PC),d1 X CALL Close,dosbase(PC) X clr.l infile X tst d5 X beq.s endstartup X bra.s 9$ X X10$ cmp.b #10,0(a5,d5) X beq.s 9$ X cmp.b #13,0(a5,d5) X bne.s 5$ X X9$ move.l d5,d0 X addq #1,d0 X bsr cli ;execute the script as if typed in X tst.l infile X bne.s 8$ X Xendstartup clr.b fromfile X Xnostartup tst.l wbmsg X bne.s noin X cmp.b #10,dummyinput X beq.s noin X cmp.w #'-b',dummyinput ;requested as a background task ? X beq.s noin X move.l dummyinput,in X move.b #10,in+4 X bra.s nostartup2 Xnoin cmp.b #10,in X beq.s default X tst.b in X bne.s nostartup2 X Xdefault move.w #$740a,in ;couldn't find defaults, defaults to X ;tasks X Xnostartup2 cmp.w #'-b',dummyinput X beq instback X X;This code just opens a Window. Position X;and size are taken from window_l,window_t, X;window_w,window_h. Xrestart tst.b ownscreen X beq.s 1$ X bsr createscreen X bra.s 2$ X1$ bsr setupwindow X X2$ move.l mytask(PC),a0 X clr.l 26(a0) ;clear 'spurious' signals X X clr.l ptr X tst.b gotguru X X beq.s 3$ X bsr showguru X clr.b gotguru X3$ bra processmsgs X X;show a list. The string entered from keyboard is stored X;in 'in'.Every character is interpreted as one command X;i.e. 'rip' means 'resources'+'interrupts'+'ports'. X;search the command to be executed. If none is found, X;show a help message X Xshowwhat tst.b fromfile X bne endshow X move.w cmdptr(PC),d7 X Xinput lea in,a0 X move.b 0(a0,d7.w),d0 X beq endshow X addq.b #1,d7 X cmpi.b #' ',d0 X bne.s 1$ X X bsr testifend X beq endshow X move.w d2,cmdptr X bra notfinished X X1$ cmpi.b #10,d0 X beq endshow X or.b #32,d0 X cmpi.b #'q',d0 X beq exit X lea params(PC),a0 X moveq #0,d1 Xi1 cmp.b 0(a0,d1),d0 X beq.s foundp X addq.b #1,d1 X cmpi.b #parmnum,d1 X bne.s i1 X X move.l #usetxt,d0 X move.b #1,mnflag X bsr putnam X clr.b mnflag X bra endshow X Xfoundp lsl.b #2,d1 X lea subs(PC),a0 X move.b #1,mnflag X jsr 0(a0,d1) X clr.b mnflag X bsr testifend X beq input X bsr newline X bra input X Xtestifend lea in,a0 X lea 0(a0,d7),a0 X move.w d7,d2 X2$ move.b (a0)+,d0 X beq.s 1$ X cmpi.b #' ',d0 X bne.s 3$ X addq #1,d2 X bra.s 2$ X3$ cmpi.b #10,d0 X1$ rts X X Xendshow tst.b fromfile X bne.s nomore X clr.w cmdptr Xnotfinished bsr starttimer Xnomore tst.b fromfile X bne.s 1$ X clr.l lastprinted X bsr blastout X1$ rts X X;get the string from inputbuffer; search and execute X;the command, if any. X Xcli lea dummy,a0 X subq #1,d0 Xcl2 subq #1,d0 X bmi.s cl1 X cmp.b #' ',0(a0,d0) X beq.s cl2 Xcl1 addq #1,d0 X move.b #10,0(a0,d0) X bsr kllblnks X cmpi.b #10,0(a0) X beq showwhat X cmpi.b #';',0(a0) X beq nomore X X bsr findcmd X tst.l d2 X bpl.s okcmd X bsr findalias X tst.l d2 X bmi.s nm1 X Xokcmd clr.b procnum X adda.w d1,a0 X bsr kllblnks X lsl #2,d2 X lea cmdaddr(PC),a1 X jsr 0(a1,d2) X bra nomore X Xnm1 lea in,a1 X lea buffer,a2 Xnm2 move.b (a1)+,(a2)+ X cmp.b #10,-1(a1) X bne.s nm2 X lea in,a1 Xnm0 move.b (a0)+,(a1)+ X cmp.b #10,-1(a1) X bne.s nm0 X lea dummy,a2 X lea buffer,a1 Xnm3 move.b (a1)+,(a2)+ X cmp.b #10,-1(a1) X bne.s nm3 X clr.w cmdptr X bra showwhat X Xfindcmd bsr strbuf X move.l a0,a5 X lea commds(PC),a2 X moveq #0,d2 X1$ lea buffer,a0 X move.l a2,a1 X bsr strcmp X beq 3$ X2$ tst.b (a2)+ X bne.s 2$ X addq #1,d2 X cmp.w #cmdnum,d2 X bne.s 1$ X moveq #-1,d2 X3$ move.l a5,a0 X rts X Xfindalias move.l a0,a5 X move.l aliaslist(PC),d4 X1$ beq.s 3$ X move.l d4,a4 X lea buffer,a0 X lea 5(a4),a1 X move.b 4(a4),d2 X ext.w d2 X ext.l d2 X bsr strcmp X beq 4$ X move.l 0(a4),d4 X bra.s 1$ X3$ moveq #-1,d2 X4$ move.l a5,a0 X rts X Xsubs bra showtask X bra showaddr X bra showdevs X bra showlibs X bra showres X bra showresi X bra showmem X bra showprt X bra showint X bra stack X bra clicomm Xcmdaddr bra settime X bra taskpri X bra info X bra pri X bra flush X bra freeze X bra warm X bra signal X bra break X bra alert X bra lastalert X bra hold X bra stopall X bra clear X bra cancel X bra taskports X bra hunks X bra devices X bra openlib X bra closelib X bra currentdir X bra cd X bra mypri X bra openfiles X bra locks X bra unlock X bra screens X bra windows X bra closescreen X bra closewindow X bra fonts X bra windowfonts X bra lockdrive X bra freedrive X bra capture X bra clrcold X bra clrcool X bra clrwarm X bra snoop X bra usage X bra inphand X bra nohead X bra sort X bra hide X bra hidden X bra setwindow X bra cancel X bra iconifyoff X bra historylines X bra historylength X bra showhistory X bra repeatcmd X bra remresident X bra saveoutput X bra killhistory X bra iconbackdrp X bra setfont X bra trapguru X bra outputlines X bra usescreen X bra usewindow X bra grabtimerio X bra dchange X bra alias X bra remnode X X;------ Task-Structures----- X Xshowaddr clr.b tasktyp X bra.s startask Xshowtask move.b #1,tasktyp Xstartask tst.b headon X beq noheader1 X move.l #infoh1,d0 X bsr putstr X move.l _SysBase(PC),a6 X move.l #cpu2,d0 X btst #1,297(a6) ;SysBase->AttnFlags X bne.s cpupr X move.l #cpu1,d0 X btst #0,297(a6) X bne.s cpupr X move.l #cpu0,d0 Xcpupr bsr putstr X move.l _SysBase(PC),a6 X btst #2,297(a6) X beq.s no881 X move.l #cpu3,d0 X bsr putstr Xno881 moveq #20,d1 X bsr tab X move.l #infoh3,d0 X bsr putstr X Xnoheader1 move.l _SysBase(PC),a6 X move.w #$4000,$dff09a X move.l 280(a6),d0 X move.l 284(a6),d1 X move.l oldidl,d3 X move.l d0,oldidl X sub.l d3,d0 X move.l olddisp,d3 X move.l d1,olddisp X sub.l d1,d3 X move.l d0,d1 X sub.l d3,d1 X move.l d1,maxdisp X move.l d3,-(a7) X movem.l d0-d3,-(a7) X moveq #1,d5 X bsr getaskdat X move.l a5,savedat X movem.l (a7)+,d0-d3 X sub.l d3,d0 X neg.l d3 X tst.b headon X beq.s noheader2 X bsr prcent X bsr newline X move.l #infoh2,d0 X bsr putstr Xnoheader2 move.l (a7)+,d0 X neg.l d0 X move.l d0,dispatches X tst.b headon X beq noheader3 X mulu #100,d0 X move.l d0,-(a7) X X lea secs(PC),a0 X lea mics(PC),a1 X CALL CurrentTime,intuibase(PC) X move.l secs(PC),d3 X lsl.l #1,d3 X move.l d3,d1 X lsl.l #2,d3 X add.l d1,d3 X move.l mics(PC),d0 X move.l #100000,d1 X bsr div X add.l d0,d3 X move.l time10(PC),d1 X move.l d3,time10 X sub.l d1,d3 X move.l (a7)+,d0 X move.l d3,-(a7) X move.l d3,d1 X bsr div X moveq #1,d5 X bsr putfrac X X moveq #20,d1 X bsr tab X move.l #infoh7,d0 X bsr putstr X move.l iocount(PC),d0 X clr.l iocount X mulu #100,d0 X move.l (a7)+,d3 X move.l d3,d1 X bsr div X moveq #1,d5 X bsr putfrac X X bsr newline X bsr newline Xnoheader3 lea theader(PC),a0 X tst.b tasktyp X bne.s phedder X lea t2header(PC),a0 Xphedder bsr puthead X move.l savedat(PC),a5 X Xpt1 tst.b entries X beq pt2 X lea -16(a5),a5 X bsr hideit X tst d0 X beq ptend X move.l 0(a5),a4 X move.l a4,d0 X move.l d0,node X bsr hexa X tst.b tasktyp X beq.s pt12 X moveq #0,d0 X move.b 8(a4),d0 X bsr gettype X Xpt12 moveq #0,d0 X move.b 9(a5),d0 X subq.b #1,d0 X mulu #10,d0 X move.l #status,d1 X add.l d1,d0 X bsr putstr X tst.b tasktyp X bne.s pt13 X X move.l 18(a4),d0 X bsr hexa X move.l #longnix,d0 X cmp.b #4,9(a5) X beq.s pt14 X bsr putstr X bra.s pt15 Xpt14 move.l 22(a4),d0 X bsr hexa Xpt15 move.l 26(a4),d0 X bsr hexa X move.l 54(a4),a1 X move.l 0(a1),d0 X cmp.b #2,9(a5) X bne.s pt16 X move.l #*,d0 Xpt16 bsr hexa X bra pt4 X Xpt13 move.b 10(a5),d3 X bsr plusmins X X move.l dispatches(PC),d0 X tst.b usageflag X beq.s pt37 X move.l maxdisp(PC),d0 Xpt37 move.l 12(a5),d3 X bsr prcent X X clr.b d3 X cmpi.b #13,8(a5) X bne.s noproc X tst.l 172(a4) X beq.s noproc X move.b 11(a5),d3 X bsr bytedec X bra.s pt4 Xnoproc move.l #nix,d0 X bsr putstr Xpt4 move.l 4(a5),d0 X bsr putnam Xptend subq.b #1,entries X bra pt1 Xpt2 rts X Xputlist move.l 0(a4),a4 X tst.l 0(a4) X beq.s endlist X bsr putdata X bra.s putlist Xendlist rts X Xputdata move.l a4,0(a5) X move.l 10(a4),4(a5) ;task->ln_Name X move.b 8(a4),8(a5) ;task->ln_Type X move.b 15(a4),9(a5) ;task->tc_State X move.b 9(a4),10(a5) ;task->ln_Pri X move.b 143(a4),11(a5) ;Process->pr_Tasknum X clr.l 12(a5) X lea cputime,a0 X move.l tasksnum(PC),d1 X subq #1,d1 X bmi.s pua1 Xpua3 cmp.l (a0)+,a4 X dbeq d1,pua3 X tst d1 X bmi.s pua1 Xpua2 move.l 508(a0),12(a5) Xpua1 lea 16(a5),a5 X addq.b #1,entries X rts X Xgettype and.l #$f,d0 X mulu #11,d0 X add.l #type,d0 X bra putstr X Xgetaskdat move.l d5,-(a7) X lea buffer,a5 X clr.b entries X lea stplist(PC),a4 X bsr putlist X move.l _SysBase(PC),a4 X lea 420(a4),a4 ;SysBase->TaskWait X bsr putlist X move.l _SysBase(PC),a4 X lea 406(a4),a4 ;SysBase->TaskReady X bsr putlist X move.l _SysBase(PC),a4 X move.l 276(a4),a4 ;SysBase->ThisTask X bsr putdata X move.l (a7)+,d5 X beq.s 1$ X clr.l tasksnum X1$ move.w #-$4000,$dff09a X moveq #16,d2 X lea -32(a5),a2 X bsr.s sortlist X rts X Xsortlist tst.b sorton X beq.s sort5 X lea buffer,a3 Xsort1 lea 0(a3,d2),a4 Xsort2 move.l 0(a3),d1 X cmp.l 0(a4),d1 X bge.s sort3 X move.l d2,d1 X subq #1,d1 Xsort4 move.b 0(a4,d1),d0 X move.b 0(a3,d1),0(a4,d1) X move.b d0,0(a3,d1) X dbf d1,sort4 Xsort3 lea 0(a4,d2),a4 X cmp.l a2,a4 X ble.s sort2 X lea 0(a3,d2),a3 X cmp.l a2,a3 X bne.s sort1 Xsort5 rts X Xprcent lsl.l #1,d3 X move.l d3,d1 X lsl.l #2,d3 X add.l d1,d3 X lsl.l #2,d3 X move.l d3,d1 X lsl.l #3,d3 X move.l d3,d2 X lsl.l #1,d3 X add.l d2,d3 X add.l d1,d3 X move.l d0,d1 X move.l d3,d0 X bsr div X moveq #0,d5 X bsr putfrac X move.l #infoh4,d0 X bra putstr X Xputfrac divu #10,d0 X move d0,d3 X swap d0 X move d0,d1 X tst d5 X bne.s 1$ X cmp.w #100,d3 X ble.s 1$ X move.l #whatsthis,d0 X bra putstr X1$ bsr bytedec X lea out,a0 X move.b #'.',-1(a0,d0) X or.b #'0',d1 X move d1,d0 X bra putchar X Xhideit tst.b hideon X bne.s pt73 Xpt75 moveq #1,d0 X rts Xpt73 lea hidestart(PC),a4 X move.l 4(a5),a0 Xpt74 tst.l 0(a4) X beq.s pt75 X move.l 0(a4),a4 X lea 4(a4),a1 X bsr strcmp X tst d0 X beq hideend X bra.s pt74 Xhideend rts X*-------- mem-hunks ------------ X Xshowmem lea mheader(PC),a0 X bsr puthead X move.l _SysBase(PC),a5 X lea 322(a5),a5 ;SysBase->MemList X moveq #0,d5 Xmem1 move.l 0(a5),a5 ;MemList->ln_Next X tst.l 0(a5) X beq.s mem2 X move.l 20(a5),d0 ;MemHeader->mh_Lower X bsr hexa X move.l 24(a5),d0 ;MemHeader->mh_Upper X bsr hexa X move.l 28(a5),d0 ;MemHeader->mh_Free X add.l d0,d5 X moveq #1,d3 X bsr longdec X move.b 15(a5),d3 ;MemHeader->mh_Attributes X bsr bytedec X move.b 9(a5),d3 ;MemHeader->ln_pri X bsr plusmins X move.l 10(a5),d0 ;MemHeader->ln_Name X move.l a5,node X bsr putnam X bra.s mem1 Xmem2 move.l #infoh6,d0 X bsr putstr X moveq #19,d1 X bsr tab X moveq #0,d3 X move.l d5,d0 X bsr longdec Xnewline move.l #cr,d0 X bra putstr X X*-------- Task-Stack ------------ X Xstack lea stackhead(pc),a0 X bsr puthead X moveq #0,d5 X bsr getaskdat Xsta1 tst.b entries X beq sta8 X lea -16(a5),a5 X bsr hideit X tst d0 X beq sta9 X move.l 0(a5),a1 X cmp.b #13,8(a1) ;task->ln_Type X bne.s sta6 X move.l 172(a1),d0 X beq.s sta6 X lsl.l #2,d0 X move.l d0,a0 X tst.l 60(a0) X beq.s sta6 X moveq #1,d3 X move.l 52(a0),d4 X lsl.l #2,d4 X move.l 176(a1),d0 X sub.l d4,d0 X bsr hexa X move.l d4,d0 X bsr longdec X move.l 176(a1),d0 X sub.l 54(a1),d0 X bra.s sta7 X Xsta6 move.l 58(a1),d0 X bsr hexa X moveq #1,d3 X move.l 62(a1),d0 X sub.l 58(a1),d0 X bsr longdec X move.l 62(a1),d0 X sub.l 54(a1),d0 Xsta7 bsr longdec X move.l 4(a5),d0 X bsr putnam Xsta9 subq.b #1,entries X bra sta1 Xsta8 rts X Xclicomm lea clicomhead(pc),a0 X bsr puthead X moveq #0,d5 X bsr getaskdat Xclic1 tst.b entries X beq clic8 X lea -16(a5),a5 X bsr hideit X tst d0 X beq clic0 X move.l 0(a5),a4 X cmpi.b #13,8(a4) X bne clic0 X tst.l 172(a4) X beq clic0 X move.l 140(a4),d3 X beq clic0 X move.l a4,d0 X move.l d0,node X bsr hexa X moveq #0,d0 X move.b 9(a5),d0 X subq #1,d0 X mulu #10,d0 X move.l #status,d1 X add.l d1,d0 X bsr putstr X move.l 172(a4),a3 X adda.l a3,a3 X adda.l a3,a3 X move.l #script,d0 X tst.l 40(a3) X beq.s clic5 X move.l #interact,d0 Xclic5 bsr putstr X move.l #backg,d0 X tst.l 44(a3) X bne.s clic6 X move.l #foreg,d0 Xclic6 bsr putstr X bsr bytedec X move.l 4(a5),d0 X bsr putstr X moveq #49,d1 X bsr tab X move.b #' ',d0 X bsr putchar X move.l 128(a4),d0 X beq.s noprogloadc Xclic3 move.l 172(a4),d1 X bne.s clic4 Xnoprogloadc move.l #longnix,d0 X bsr putnam X bra.s clic0 Xclic4 lsl.l #2,d1 X move.l d1,a4 X move.l 60(a4),d1 X beq.s noprogloadc X move.l 16(a4),d0 X bsr putbcpl X bsr newline X Xclic0 subq.b #1,entries X bne clic1 Xclic8 rts X X*--------- interrupts ------------ Xshowint lea iheader(PC),a0 X bsr puthead X lea intnames(PC),a5 X lea inttyp(PC),a4 X moveq #0,d1 X moveq #15,d5 X move.l _SysBase(PC),a3 X lea 84(a3),a3 ;SysBase->IntVects[16] X Xsi0 tst.b 0(a4,d1) X bne.s si4 X move.l 8(a3),a2 ;IntVector->iv_Node X bra.s si5 Xsi4 move.l 0(a3),a2 ;Interrupt->is_Node Xsi5 cmp.l #0,a2 X beq nxtint X tst.b 0(a4,d1) X beq.s si1 Xsi2 move.l 0(a2),a2 ;is_Node->ln_Next X tst.l 0(a2) X beq.s nxtint Xsi1 move.l a2,d0 X move.l d0,node X bsr hexa X move.l 14(a2),d0 ;Interrupt->is_Data X bsr hexan X move.l 18(a2),d0 ;Interrupt->is_Code X bsr hexan X move.b 9(a2),d3 ;Interrupt->ln_Pri X move.l a3,-(a7) X bsr plusmins X move.l #intserv,d0 X tst.b 0(a4,d1) X bne.s 1$ X move.l #inthand,d0 X1$ bsr putstr X move.l #intdis,d0 X move.w $dff01c,d3 X btst.w d1,d3 X beq.s 2$ X move.l #inten,d0 X2$ bsr putstr X move.l (a7)+,a3 X move.l a5,d0 X bsr putstr X move.l 10(a2),d0 ;Interrupt->ln_Name X bsr putnam X tst.b 0(a4,d1) X bne.s si2 X tst.l 0(a2) X beq.s nxtint X move.l 0(a2),a2 X bra si1 Xnxtint addq #1,d1 X lea 12(a5),a5 X lea 12(a3),a3 X dbf d5,si0 X rts X X*--------- resident ------------ X Xshowresi lea rheader(PC),a0 X bsr puthead X move.l _SysBase(PC),a5 X move.l 300(a5),a5 ;SysBase->ResModules X Xr1 tst.l 0(a5) X beq r2 X move.l 0(a5),d0 ;Resident->ln_Next X tst.l d0 X bpl.s r3 X bclr #31,d0 X movea.l d0,a5 X bra.s r1 Xr3 movea.l d0,a4 X move.l d0,node X bsr hexa X move.b 13(a4),d3 ;rt_Pri X bsr plusmins X move.b 10(a4),d0 ;rt_Flags X bsr bin X move.b 11(a4),d3 ;rt_Version X bsr bytedec X move.b 12(a4),d0 ;rt_Type X bsr gettype X move.l 14(a4),d0 ;rt_Name X bsr putnam Xr4 addq #4,a5 X bra r1 Xr2 rts X X*--------- ports ------------- X Xshowprt lea pheader(PC),a0 X bsr puthead X move.l _SysBase(PC),a4 X lea 392(a4),a4 ;SysBase->PortList X lea buffer,a5 X moveq #0,d5 X CALL Forbid,_SysBase(PC) X move.w #$4000,$dff09a Xsp2 move.l 0(a4),a4 ;mp_Node.ln_Next X tst.l 0(a4) X beq.s sp20 X bsr getpdata X bra.s sp2 Xsp20 tst.b tports X bne.s sp15 X move.l _SysBase(PC),a4 X move.l 276(a4),a4 ;sysbase->ThisTask X lea 92(a4),a4 ;process->pr_MsgPort X bsr getpdata X move.l _SysBase(PC),a2 X lea 406(a2),a2 Xsp11 move.l 0(a2),a2 X tst.l 0(a2) X beq.s sp14 X lea 92(a2),a4 X cmp.b #13,8(a2) X bne.s sp11 X bsr getpdata X bra sp11 Xsp14 move.l _SysBase(PC),a2 X lea 420(a2),a2 Xsp12 move.l 0(a2),a2 X tst.l 0(a2) X beq.s sp15 X lea 92(a2),a4 X cmp.b #13,8(a2) X bne.s sp12 X bsr getpdata X bra sp12 Xsp15 move.w #-$4000,$dff09a X CALL Permit,_SysBase(PC) X lea buffer,a5 Xsp3 tst.b d5 X beq sp6 X move.l 0(a5),d0 X move.l d0,node X bsr hexa X move.l 4(a5),d0 X bsr putstr X moveq #25,d1 X bsr tab X move.b 8(a5),d0 X and.l #3,d0 X mulu #9,d0 X add.l #mp_flags,d0 X bsr putstr X move.b 9(a5),d3 X bsr bytedec X move.b 14(a5),d3 X cmp.b #255,d3 X bne.s 1$ X move.l #toomuch,d0 X bsr putstr X bra.s 2$ X1$ bsr bytedec X2$ move.l #longnix,d0 X move.l 10(a5),d1 X beq.s sp8 X move.l d1,a3 X move.l 10(a3),d0 Xsp8 bsr putnam X lea 16(a5),a5 X subq.b #1,d5 X bra sp3 Xsp6 rts X Xgetpdata move.l a4,0(a5) X move.l 10(a4),4(a5) ;ln_Name X move.b 14(a4),8(a5) ;mp_Flags X move.b 15(a4),9(a5) ;mp_SigBit X move.l 16(a4),10(a5) ;mp_SigTask X moveq #0,d0 X movea.l 20(a4),a3 ;mp_MsgList Xsp10 movea.l 0(a3),a3 X cmpa.l #0,a3 X beq.s sp9 X addq.b #1,d0 X cmp.b #255,d0 X bne.s sp10 Xsp9 move.b d0,14(a5) X lea 16(a5),a5 X addq.b #1,d5 X rts X*-------- resources ------------ X Xshowres lea lheader(PC),a0 X bsr puthead1 X lea resnam(PC),a0 X bsr puthead2 X move.l _SysBase(PC),d5 X add.l #336,d5 ;SysBase->ResourceList X bsr show X rts X X*--------- devices ------------- X Xshowdevs lea lheader(PC),a0 X bsr puthead1 X lea devnam(PC),a0 X bsr puthead2 X move.l _SysBase(PC),d5 X add.l #350,d5 ;SysBase->DeviceList X bsr show X rts X X*-------- libraries ------------- X Xshowlibs lea lheader(PC),a0 X bsr puthead1 X lea libnam(PC),a0 X bsr puthead2 X move.l _SysBase(PC),d5 X add.l #378,d5 ;SysBase->LibList X Xshow lea buffer,a5 X clr.b entries X CALL Forbid,_SysBase(PC) X move.l d5,a4 Xsl1 move.l 0(a4),a4 ;lib_Node.ln_Next X tst.l 0(a4) X beq.s sl2 X addq.b #1,entries X move.l a4,0(a5) X move.l 10(a4),4(a5) ;ln_Name X move.b 33(a4),8(a5) ;lib_OpenCnt X move.b 21(a4),9(a5) ;lib_Version X move.b 23(a4),10(a5) ;lib_Revision X move.b 14(a4),11(a5) ;lib_Flags X lea 12(a5),a5 X bra.s sl1 Xsl2 CALL Permit,_SysBase(PC) X X lea buffer,a5 Xdl3 tst.b entries X beq.s sl4 X move.l 0(a5),d0 X move.l d0,node X bsr hexa X move.b 8(a5),d3 X bsr bytedec X move.b 9(a5),d3 X bsr bytedec X move.b 10(a5),d3 X bsr bytedec X move.b 11(a5),d0 X bsr bin X move.l 4(a5),d0 X bsr putnam X lea 12(a5),a5 X subq.b #1,entries X bra.s dl3 Xsl4 rts X X;Remove a resident module from the list. Clears the rt_Matchword X;to avoid being found and reinserted during the next reset Xremresident bsr nodenam2 X cmp.b #'$',0(a5) X bne.s 1$ X move.l a5,a0 X bsr readhex X tst.b d7 X bne.s 2$ X1$ move.l a5,a1 X CALL FindResident,_SysBase(PC) X tst.l d0 X beq fn5 X X2$ move.l _SysBase(PC),a3 X move.l 300(a3),a3 ;SysBase->ResModules X X8$ move.l (a3)+,d1 X beq fn5 X bpl.s 3$ X bclr #31,d1 X movea.l d1,a3 X bra.s 8$ X3$ cmp.l d1,d0 X bne.s 8$ X X4$ move.l a3,a4 X5$ tst.l (a4)+ X bgt.s 5$ X X6$ move.l d0,a1 X clr.w 0(a1) ;rt_MatchTag X move.l a4,d0 X sub.l a3,d0 X lsr #2,d0 X subq #1,d0 X lea -4(a3),a1 X7$ move.l (a3)+,(a1)+ X dbf d0,7$ X rts X X;find the first entry in the device-list X;returns a1 = pointer to first entry X Xdevinfo move.l dosbase(PC),a1 X move.l 34(a1),a1 X move.l 24(a1),a1 X adda.l a1,a1 X adda.l a1,a1 X move.l 4(a1),a1 X rts X X;unlock a file Xunlock tst.b fromfile X bne ul6 X bsr readhex X tst.b d7 X beq syntax X move.l d0,remembr X move.l d0,-(a7) X moveq #-1,d6 X bsr of44 X tst.l remembr X beq.s ul1 X move.l #unlerr,d0 X bsr putnam X bra ul4 Xul1 bsr ResumeOutput X move.l #unl1,d0 X bsr putstr X move.l 0(a7),d0 X bsr getpath X move.l #unltxt2,d0 X bsr putstr X bsr readline X ori.b #$20,inputbuffer X cmp.b #'y',inputbuffer X bne.s ul5 X move.l 0(a7),d1 X CALL UnLock,dosbase Xul5 bsr freefinfo Xul4 addq #4,a7 Xul6 rts X;---------- Show all Locks------------ Xlocks moveq #0,d6 X bra.s of33 X X;---------- Open Files----------- Xopenfiles moveq #1,d6 Xof33 move.l mytask(PC),a4 X move.l 184(a4),inputbuffer X move.l #-1,184(a4) X lea ofheader(PC),a0 X bsr puthead Xof44 bsr allocfinfo X bsr devinfo X move.l a1,a3 Xof1 adda.l a3,a3 X adda.l a3,a3 X cmp.l #2,4(a3) X bne of2 X move.l 40(a3),d0 X lsl.l #2,d0 X move.l d0,a4 X moveq #0,d3 X move.b (a4)+,d3 X subq #1,d3 X lea buffer,a5 Xof22 move.b (a4)+,(a5)+ X dbf d3,of22 X move.b #':',(a5)+ X clr.b 0(a5) X cmp.l #'RAM ',buffer X bne.s of5 X cmp.l #'Disk',buffer+4 X bne.s of5 X move.l #$4d3a0000,buffer+2 Xof5 move.l #buffer,d1 X move.l #-2,d2 X CALL Lock,dosbase(PC) X tst.l d0 X bne.s of6 X move.l #buffer,d0 X bsr putstr X move.l #nomount,d0 X bsr putnam X bra of2 X Xof6 move.l d0,-(a7) X lsl.l #2,d0 X move.l d0,a5 Xof4 move.l 0(a5),d0 X cmp.l #50,d0 X ble of3 X move.l d0,d5 X lsl.l #2,d5 X move.l d5,a5 X move.l d0,d5 X tst d6 X bpl.s of45 X X cmp.l remembr(PC),d0 X bne.s of4 X clr.l remembr X move.l (a7)+,d1 X CALL UnLock,dosbase(PC) X bra quitof X Xof45 move.l 8(a5),d4 X bsr getfinfo X move.l finfoptr,a4 X X tst.l d6 X beq.s of8 X bmi.s of8 X tst.l 4(a4) X bpl of4 Xof8 move.l d5,d0 X move.l d0,node X bsr hexa X move.l #access,d0 X cmp #-2,d4 X beq.s of7 X addq #8,d0 Xof7 bsr putstr X tst.l 4(a4) X bmi.s of9 X move.l #longnix,d0 X bsr putstr X bra of10 Xof9 move.l 124(a4),d0 X bsr longdec Xof10 move.l d5,d0 X bsr getpath X bra of4 X X bsr newline Xof3 move.l (a7)+,d1 X CALL UnLock,dosbase(PC) Xof2 move.l 0(a3),a3 X cmpa.l #0,a3 X bne of1 X bsr freefinfo Xquitof move.l mytask(PC),a4 X move.l inputbuffer,184(a4) X rts X X;---------- Dos Devices ---------- X Xdevices lea ddheader(PC),a0 X bsr puthead X bsr devinfo Xdev1 adda.l a1,a1 X adda.l a1,a1 X clr.b d6 X tst.l 4(a1) X bne dev2 X move.l 40(a1),d0 X bsr putbcpl X moveq #10,d1 X bsr tab X cmp.l #20,28(a1) X ble dev9 X moveq #1,d6 X move.l 28(a1),a3 X adda.l a3,a3 X adda.l a3,a3 X cmp.l #20,8(a3) X ble dev9 X move.l 8(a3),a2 X adda.l a2,a2 X adda.l a2,a2 X move.l 12(a2),d3 X movem.l a1-a3,-(a7) X bsr bytedec X movem.l (a7)+,a1-a3 X moveq #1,d3 X move.l 20(a2),d0 X bsr longdec X move.l 40(a2),d0 X beq.s devs20 X addq #1,d0 X sub.l 36(a2),d0 Xdevs20 bsr longdec X move.l 44(a2),d0 X bsr longdec X bra.s dev8 Xdev9 move.l #notfile,d0 X bsr putstr Xdev8 tst.l 8(a1) X beq.s dev6 X move.l #devload,d0 X bra.s dev5 Xdev6 move.l #devnload,d0 Xdev5 bsr putstr X tst.b d6 X beq.s dev7 X move.l 4(a3),d0 X bne.s dev4 Xdev7 move.l 16(a1),d0 X bne.s dev4 X tst.l 8(a1) X beq.s dev11 X move.l 8(a1),a3 X move.l -82(a3),d0 X bsr putstr X bra dev11 Xdev4 bsr putbcpl Xdev11 bsr newline Xdev2 move.l 0(a1),a1 X cmpa.l #0,a1 X bne dev1 X rts X X; Check if a named dos-device is mounted X; name in 'buffer'. X; Result: d0 = 0(false) anything else(true). X Xfinddev bsr devinfo Xfdev1 adda.l a1,a1 X adda.l a1,a1 X clr.b d6 X tst.l 4(a1) X bne.s fdev2 X move.l 40(a1),a2 X lea buffer,a0 X bsr strbcmp X tst d0 X bne.s fdev3 Xfdev2 move.l 0(a1),a1 X cmpa.l #0,a1 X bne.s fdev1 Xfdev3 rts X X; Re-assign a drive to dos X Xfreedrive clr.l dp_Arg1 X bra ldr3 X X; Inhibit a disk drive X Xlockdrive move.l #1,dp_Arg1 Xldr3 bsr getstr X bsr finddev X bne.s ldr1 Xldr2 move.l #buffer,d0 X bsr putstr X move.l #nomount,d0 X bsr putstr X move.l #dishelp,d0 X bra putnam Xldr1 move.l #buffer,d1 X CALL DeviceProc,dosbase(PC) X tst.l d0 X beq.s ldr2 X move.l d0,a0 X move.l #31,dp_Type X bra cons1 X X;display the current directory of all processes, X;except Workbench.(Worbench pr_CurrentDir is not a lock) X Xcurrentdir lea wbname(PC),a1 X CALL FindTask,_SysBase(PC) X move.l d0,wbaddr X lea cdheader(PC),a0 X bsr puthead X bsr allocfinfo X moveq #0,d5 X bsr getaskdat X lea buffer,a5 Xcd2 tst.b entries X beq.s cd6 X cmp.b #13,8(a5) X bne.s cd5 X move.l wbaddr(PC),d0 X cmp.l 0(a5),d0 X beq.s cd5 X move.l 4(a5),d0 X bsr putstr X moveq #15,d1 X bsr tab X move.l 0(a5),a4 X move.l 152(a4),d0 Xcd1 bsr getpath Xcd5 subq.b #1,entries X lea 16(a5),a5 X bra.s cd2 Xcd6 bsr freefinfo X rts X X;Change the current directory setting of a process X Xcd tst.b fromfile X bne cd10 X move.l a0,-(a7) X lea wbname(PC),a1 X CALL FindTask,_SysBase(PC) X move.l d0,wbaddr X move.l (a7)+,a0 X bsr getstr X move.l a0,-(a7) X move.l #buffer,d1 X move.l #-2,d2 X CALL Lock,dosbase(PC) X move.l (a7)+,a0 X tst.l d0 X bne cd16 X move.l #dnotf,d0 X bra putnam Xcd16 move.l d0,remembr X move.l a0,-(a7) X bsr allocfinfo X move.l remembr(PC),d0 X bsr getfinfo X move.l finfoptr,a5 X move.l (a7)+,a0 X tst.l 4(a5) X bpl.s cd11 X move.l #notdir,d0 X bsr putnam X bra cd18 Xcd11 bsr nodenam X moveq.l #2,d7 X lea TRuNode(PC),a4 X bsr findnam X tst.b d7 X beq.s cd15 X move.l d0,a5 X cmp.b #13,8(a5) X beq.s cd15 X bsr syntax X bra cd18 Xcd15 cmp.l wbaddr,d0 X bne.s cd13 X move.l #wberr,d0 X bsr putnam X bra cd12 Xcd13 move.l 152(a5),d1 X move.l remembr,152(a5) X move.l d1,remembr Xcd12 tst.l remembr X beq.s cd14 X bsr ResumeOutput X move.l #unltxt,d0 X bsr putstr X move.l remembr(PC),d0 X bsr getpath X move.l #unltxt2,d0 X bsr putstr X bsr readline X ori.b #$20,inputbuffer X cmp.b #'y',inputbuffer X bne.s cd14 Xcd18 move.l remembr(PC),d1 X beq.s cd14 X CALL UnLock,dosbase(PC) Xcd14 bsr freefinfo Xcd10 rts X X;Display the list of inputhandlers. It adds a dummy X;input handler, grabs the list header, and removes it X Xinphand tst.b background X bne.s inph1 X bsr installh Xinph1 move.l #500,d4 X lea InInterrupt(PC),a0 Xinph2 tst.l 4(a0) X beq.s inph3 X move.l 4(a0),a0 X dbf d4,inph2 Xinph3 tst.b background X bne.s inph4 X movem.l d4/a0,-(a7) X bsr removeh X movem.l (a7)+,d4/a0 Xinph4 cmp.w #-1,d4 X bne.s inph5 X move.l #failed,d0 X bra putnam Xinph5 move.l a0,-(a7) X lea inheader(PC),a0 X bsr puthead X move.l (a7)+,a5 Xinph6 move.l 0(a5),a5 X tst.l 0(a5) X beq.s inph7 X move.l a5,d0 X move.l d0,node X bsr hexa X move.l 14(a5),d0 X bsr hexa X move.l 18(a5),d0 X bsr hexa X move.b 9(a5),d3 X bsr plusmins X move.l 10(a5),d0 Xinph8 bsr putnam X bra.s inph6 Xinph7 rts X X;get all screen pointers. X;result: d5=number of screens X; buffer+100 holds pointers. X Xgetscr lea scrheader(PC),a0 X bsr puthead Xgetscr2 move.l intuibase(PC),a2 X move.l 60(a2),a2 X lea buffer+100,a1 X move.w #$4000,$dff09a X moveq #0,d5 Xsr1 move.l a2,(a1)+ X move.l 0(a2),a2 X addq.l #1,d5 X cmpa.l #0,a2 X bne.s sr1 X subq #1,d5 X move.w #-$4000,$dff09a X rts X X;display screen addresses and titles X Xscreens bsr getscr X moveq #1,d6 X lea buffer+100,a1 Xsr2 move d6,d3 X bsr bytedec X move.l 0(a1),d0 X move.l d0,node X bsr hexa X move.l (a1)+,a2 X move.l 22(a2),d0 X bsr putnam X addq #1,d6 X dbf d5,sr2 X rts X X;display window addresses and titles X Xwindows clr.b bool Xwindows1 bsr getscr X tst.b bool X beq.s wn20 X move.l d5,-(a7) X lea fohead(PC),a0 X bsr puthead X move.l (a7)+,d5 Xwn20 lea buffer+100,a4 Xwn2 move.l #onscr,d0 X bsr putstr X move.l (a4)+,a2 X move.l 22(a2),d0 X bsr putnam X move.l 4(a2),a1 X moveq #0,d6 Xwn1 cmpa.l #0,a1 X beq.s wn3 X addq #1,d6 X move.l d6,d3 X bsr bytedec X move.l a1,d0 X move.l d0,node X bsr hexa X move.l 32(a1),d0 X bsr putnam X X tst.b bool X beq.s wn21 X move.l a1,-(a7) X move.l 50(a1),a1 X move.l 52(a1),a1 X bsr fontdata X move.l (a7)+,a1 X Xwn21 move.l 0(a1),a1 X bra.s wn1 Xwn3 dbf d5,wn2 X rts X X;close a specified screen X Xclosescreen bsr getscr2 X moveq #1,d6 X cmp.b #'$',0(a0) X bne.s cs1 X bsr readhex X tst d7 X beq syntax X move.l d0,d4 Xcsin moveq #0,d6 Xcs1 lea buffer+100,a2 Xcs5 tst d6 X bne.s cs2 X cmp.l (a2)+,d4 X beq.s cs3 X bra.s cs4 Xcs2 move.l (a2)+,a1 X move.l 22(a1),a1 X bsr strcmp X tst d0 X beq.s cs3 Xcs4 dbf d5,cs5 X move.l #scnofound,d0 X bra putnam Xcs3 move.l -4(a2),a0 X CALL CloseScreen,intuibase(PC) X rts X X;close a specified window Xclosewindow bsr getwnptr Xclw move.l a4,d0 X beq.s cwend Xcw3 tst.l 36(a4) X beq.s cw8 X move.l 36(a4),a0 X move.w 28(a0),d0 X and.w #$4000,d0 X beq.s cw9 X move.l a4,a0 X CALL FreeSysRequest,intuibase(PC) X rts Xcw9 move.l a4,a1 X CALL EndRequest,intuibase(PC) X bra.s cw3 Xcw8 move.l a4,a0 X moveq #0,d0 X CALL ModifyIDCMP,intuibase(PC) X move.l a4,a0 X CALL CloseWindow,intuibase(PC) Xcwend rts X X Xgetwnptr bsr getscr2 X moveq #1,d6 X cmp.b #'$',0(a0) X bne.s cw1 X bsr readhex X tst d7 X bne.s cwin X bsr syntax X bra.s cwerr Xcwin move.l d0,d4 X moveq #0,d6 Xcw1 lea buffer+100,a2 Xcw5 move.l (a2)+,a4 X move.l 4(a4),a4 Xcw6 cmpa.l #0,a4 X beq.s cw4 X tst d6 X bne.s cw2 X cmp.l a4,d4 X beq.s cw10 X bra.s cw7 Xcw2 move.l 32(a4),a1 X bsr strcmp X tst d0 X beq.s cw10 Xcw7 move.l 0(a4),a4 X bra.s cw6 Xcw4 dbf d5,cw5 X move.l #winnofound,d0 X bsr putnam Xcwerr suba.l a4,a4 Xcw10 rts X Xwindowoff movem.l d1-d7/a0-a6,-(a7) X bsr getscr2 X bsr cwin X move.l a4,d1 X beq.s woff1 X bsr clw X move.l -(a2),a0 X move.l a0,d4 X tst.l 4(a0) X bne.s woff1 X bsr getscr2 X bsr csin Xwoff1 movem.l (a7)+,d1-d7/a0-a6 X rts X Xclosetskwin movem.l d1-d7/a0-a6,-(a7) Xctw0 bsr getscr2 X lea buffer+100,a2 Xctw1 move.l (a2)+,a4 X move.l 4(a4),a4 Xctw6 cmpa.l #0,a4 X beq.s ctw4 X move.l 86(a4),a0 X move.l 16(a0),d1 X cmp.l d0,d1 X bne.s ctw7 X move.l d0,d1 X move.l a4,d0 X bsr windowoff X move.l d1,d0 X bra ctw0 Xctw7 move.l 0(a4),a4 X bra.s ctw6 Xctw4 dbf d5,ctw1 X movem.l (a7)+,d1-d7/a0-a6 X rts X X;Change the font from a specified Window X Xsetfont bsr nodenam X tst.b 0(a5) X beq syntax X move.l a5,a4 X1$ cmp.b #33,(a4)+ X bge.s 1$ X tst.b -1(a4) X beq syntax X clr.b -1(a4) X X lea dummy,a0 X move.l a5,0(a0) X move.b procnum(PC),d0 X ext.w d0 X move.w d0,4(a0) X clr.w 6(a0) X CALL OpenFont,gfxbase(PC) X tst.l d0 X bne.s 2$ X lea diskfont(PC),a1 X CALL OpenLibrary,_SysBase(PC) X move.l d0,d5 X beq.s 4$ X move.l d0,a6 X lea dummy,a0 X XREF _LVOOpenDiskFont X jsr _LVOOpenDiskFont(a6) X move.l d0,d4 X move.l d5,a1 X CALL CloseLibrary,_SysBase(PC) X move.l d4,d0 X bne.s 2$ X4$ move.l #fonterr,d0 X bsr putstr X move.l dummy,d0 X bra putnam X2$ move.l d0,-(a7) X move.l a4,a0 X bsr kllblnks X bsr getwnptr X move.l (a7)+,a0 X move.l a4,d1 X bne.s 5$ X move.l a0,a1 X CALL CloseFont,gfxbase(PC) X bra.s 3$ X5$ move.l 50(a4),a1 X CALL SetFont,gfxbase(PC) X move.l a4,a0 X CALL RefreshWindowFrame,intuibase(PC) X3$ rts X X X;display windows and associated fonts X Xwindowfonts move.b #1,bool X bra windows1 X X;display loaded font names and definitions X Xfonts lea fohead(PC),a0 X bsr puthead X move.l gfxbase(PC),a1 X move.l $8c(a1),a1 Xfo1 tst.l 0(a1) X beq.s fo3 X bsr fontdata X move.l 0(a1),a1 X bra fo1 Xfo3 rts X Xfontdata move.l a1,d0 X move.l d0,node X bsr hexa X move.w 30(a1),d3 X bsr bytedec X move.w 20(a1),d3 X bsr bytedec X move.w 24(a1),d3 X bsr bytedec X move.l #romfnt,d0 X btst #1,23(a1) X beq.s fod1 X move.l #diskfnt,d0 Xfod1 bsr putstr X move.b 32(a1),d3 X bsr bytedec X move.b 33(a1),d3 X bsr bytedec X move.l 10(a1),d0 X bra putnam X X;set update rate X Xsettime bsr getnum X tst.b d7 X bne.s st1 X move.b timeout(PC),d3 X bne.s 1$ X move.l #timenotset,d0 X bra.s sy1 X1$ move.l #whattime,d0 X bsr putstr X bsr bytedec X bra newline Xst1 move.b d2,timeout X rts Xsyntax move.l #synerr,d0 Xsy1 bra putnam X X;copy a string from input to 'buffer' X;a0 = pointer to string X Xgetstr lea buffer,a5 Xgst2 cmp.b #' ',0(a0) X beq.s gst1 X cmp.b #10,0(a0) X beq.s gst1 X move.b (a0)+,(a5)+ X bra.s gst2 Xgst1 clr.b 0(a5) X bra kllblnks X X;read in a nodename or a processname X Xnodenam bsr isdec X move.b d2,procnum Xnodenam2 bsr kllblnks X move.l a0,a5 Xgno1 cmp.b #10,(a0)+ X bne.s gno1 X move.b #0,-1(a0) X rts X X;modify a task's priority X Xtaskpri bsr getnum X tst.b d7 X beq syntax X move.b d2,newpri X bsr nodenam X moveq.l #2,d7 X lea TRuNode(PC),a4 X bsr findnam X tst.b d7 X beq.s tp1 X move.l d0,a1 X move.b newpri,d0 X CALL SetTaskPri,_SysBase(PC) Xtp1 rts X X;set the priority of our task X Xmypri bsr getnum X tst.b d7 X beq syntax X move.l _SysBase(PC),a1 X move.l 276(a1),a1 X move.l d2,d0 X CALL SetTaskPri,_SysBase(PC) X rts X X;cancel a task or a process. The theory is quite simple: X;(Process->ReturnAddr)-4 points to the return address on X;the stack. Task->SPReg points to the next instruction X;to be executed. We just need a X; *(Task->SPReg) = *(Process->ReturnAddr-4). X;If the process has been started from Dos (CLI) and X;the process is doing disk I/O, the CLI will respond with X;a GURU #87000004 (AsyncPKT=unexpected packed received). X;Thats why the calling CLI is also canceled. X X Xcancel tst.b fromfile X beq.s cancel1 X rts Xcancel1 clr.l remembr ;used for CLI stdio X clr.l remembr2 X clr.b bool X bsr nodenam Xtestagain moveq.l #1,d7 X lea TReNode(PC),a4 X bsr findnam X tst.b d7 X bne.s canok Xcnerr move.l #stperr,d0 X bra putnam X Xcanok move.l d0,a1 ;d0=task X move.l d0,pointer X cmp.b #1,8(a1) ;TASK ? X bne.s isproc X CALL RemTask,_SysBase(PC) X move.l pointer(PC),d0 X bra closetskwin X Xisproc movem.l d0-d7/a0-a6,-(a7) X move.l #-1,d0 ;needed for recursive killing tasks X CALL AllocSignal,_SysBase(PC) X moveq #0,d1 X bset d0,d1 X move.l d1,cancelbit X move.l d0,cancelbnum X movem.l (a7)+,d0-d7/a0-a6 X X moveq #0,d5 X tst.l $ac(a1) ;pr_CLI X beq.s wascreproc X move.l $80(a1),a2 ;Seglist X adda.l a2,a2 X adda.l a2,a2 X move.l 12(a2),d1 ;empty ? X bne.s wascreproc X move.l $ac(a1),a2 ;CommandLineInterface X adda.l a2,a2 X adda.l a2,a2 X move.l 60(a2),d5 ;cli_Module X tst.l 40(a2) ;IsInteractive X beq dosreturn X move.l 28(a2),remembr ;yes,get Cli-Window locks X move.l 56(a2),remembr2 X bra dosreturn Xwascreproc tst.b bool ;it is not a CLI, ask what to do X bne unload X move.b #3,bool X bsr ResumeOutput X move.l #canerr0,d0 ;ask for Workbench X bsr putstr X bsr readline X cmp.b #'y',inputbuffer X beq.s andagain X move.b #2,bool X bsr ResumeOutput X move.l #canerr1,d0 ;ask for unload X bsr putstr X bsr readline X cmp.b #'y',inputbuffer X bne.s andagain X move.b #1,bool Xandagain move.l pointer(PC),d0 X moveq.l #1,d7 X lea TReNode(PC),a4 X bsr tstnode X tst d5 X beq cnerr X bra canok X Xunload move.l 128(a1),d4 ;get Segmentlist X beq.s unl3 X lsl.l #2,d4 X move.l d4,a3 X move.l 12(a3),d4 Xunl3 tst.l d4 X bne.s unl4 X move.l #unloaderr,d0 ;no Segments !? X bra putnam X Xunl4 cmp.b #3,bool ;Workbench Task X bne.s unl2 X move.l a1,-(a7) X moveq #40,d0 ;build a copy of the X move.l #$10000,d1 ;Workbench startup-message X CALL AllocMem,_SysBase(PC) X move.l d0,startmess X move.l (a7)+,a1 X move.l d0,a0 X move.b #5,8(a0) X move.w #20,18(a0) X move.l d4,24(a0) X move.l a1,d0 X add.l #92,d0 X move.l d0,20(a0) X movem.l a0-a1,-(a7) X lea wbname(PC),a1 X CALL FindPort,_SysBase(PC) X movem.l (a7)+,a0-a1 X move.l d0,14(a0) X Xunl2 cmp.b #1,bool X bne.s dosreturn X move.l a1,-(a7) ;unload process manualy X move.l d4,d1 X CALL UnLoadSeg,dosbase(PC) X move.l (a7)+,a1 X Xdosreturn move.l 140(a1),savedat ;Processnumber Xdosret1 move.w #$4000,$dff09a X move.l 54(a1),a3 X move.l #endtask,0(a3) X move.l #2,106(a1) X move.l mytask(PC),108(a1) X cmp.b #4,15(a1) ;if waiting X bne.s doswait X move.l a1,d4 X CALL Remove,_SysBase(PC) X move.l d4,a1 X lea 406(a6),a0 ; activate the task X CALL AddHead,_SysBase(PC) X move.l d4,a1 Xdoswait move.w #-$4000,$dff09a X tst.b bool X bne.s endnodos X tst.l d5 X beq endcanc X move.l $ac(a1),a2 X adda.l a2,a2 X adda.l a2,a2 Xdwa1 movem.l d0-d7/a0-a6,-(a7) X move.l cancelbit(PC),d0 X CALL Wait,_SysBase(PC) X movem.l (a7)+,d0-d7/a0-a6 X moveq #0,d5 X bra dosret1 X Xendcanc move.l a1,-(a7) X move.l remembr(PC),d1 ;close CLI-Window X beq.s ecan1 ;if any X CALL Close,dosbase(PC) Xecan1 move.l remembr2(PC),d1 X beq.s ecan2 X CALL Close,dosbase(PC) Xecan2 move.l (a7)+,a1 X X move.l savedat(PC),d0 ;remove Task from X move.l dosbase(PC),a2 ;TaskArray X move.l 34(a2),a2 X move.l 0(a2),a2 X adda.l a2,a2 X adda.l a2,a2 X lsl.l #2,d0 X clr.l 0(a2,d0) X Xendnodos move.l a1,d0 X bsr closetskwin X move.l cancelbnum(PC),d0 ;remove our Signal X CALL FreeSignal,_SysBase(PC) X rts X X;This Code is (hopefully) excuted by the Process we want X;to kill X Xendtask CALL Forbid,_SysBase(PC) X CALL Disable,_SysBase(PC) X move.l _SysBase(PC),a1 X move.l 276(a1),a1 X move.l 176(a1),a1 ;Process_ReturnAddr X lea -4(a1),a7 ;reset Process Stackptr X tst.b bool X bne.s et0 X movea.l mytask(PC),a1 X move.l cancelbit(PC),d0 ;signal Xoper it X CALL Signal,_SysBase(PC) ;died Xet0 cmp.b #3,bool ;Workbench Process ? X bne.s et1 X move.l startmess(PC),a1 X CALL ReplyMsg,_SysBase(PC) ;reply startup message Xet1 rts X X;Stop a task (just queue it on a special list) X Xfreeze bsr nodenam X moveq.l #1,d7 X lea TReNode(PC),a4 X bsr findnam X tst.b d7 X bne.s frok X move.l #stperr,d0 X bra putstr Xfrok move.w #$4000,$dff09a X move.l d0,a1 X CALL Remove,_SysBase(PC) X move.w #-$4000,$dff09a X move.l d0,a1 X move.l d0,a5 X lea stplist(PC),a0 X CALL AddHead,_SysBase(PC) X add.b #4,15(a5) X rts X;put the task back on its list Xwarm bsr nodenam X cmp.b #'$',0(a5) X bne.s 1$ X move.l d7,d2 X move.l a5,a0 X bsr readhex X tst.b d7 X beq.s 1$ X move.l stplist(PC),a3 X3$ tst.l 0(a3) X beq.s 2$ X cmp.l a3,d0 X beq.s waok X move.l 0(a3),a3 X bra.s 3$ X1$ lea stplist(PC),a0 X movea.l a5,a1 X moveq #0,d7 X bsr fn4 X tst.b d7 X bne.s waok X2$ move.l #waerr,d0 X bra putstr Xwaok move.w #$4000,$dff09a X move.l d0,a1 X CALL Remove,_SysBase(PC) X move.l d0,a1 X move.l d0,a5 X move.l TReNode,a0 X cmp.b #8,15(a1) X bne.s wa1 X move.l TWaNode,a0 Xwa1 adda.l _SysBase(PC),a0 X CALL AddTail,_SysBase(PC) X move.l d0,a1 X subq.b #4,15(a5) X move.w #-$4000,$dff09a X move.l 18(a5),d0 X and.l 26(a5),d0 X beq.s wa2 X movea.l a5,a1 X CALL Signal,_SysBase(PC) Xwa2 rts X;show the hunks of a process Xhunks bsr nodenam X moveq.l #2,d7 X lea TRuNode(PC),a4 X bsr findnam X tst.b d7 X bne.s hu1 X rts Xhu1 move.l d0,a4 X cmp.b #13,8(a4) X beq.s hu2 X move.l #noprocs,d0 X bra putnam Xhu2 move.l 128(a4),d0 X beq.s noprogload X lsl.l #2,d0 X move.l d0,a3 X move.l 12(a3),d1 X beq.s hu3 X move.l #segloaded,d0 X bsr putnam X bra hu5 Xhu3 move.l 172(a4),d1 X bne.s hu4 Xnoprogload move.l #notload,d0 X bra putnam Xhu4 move.l #cliprocs,d0 X bsr putnam X lsl.l #2,d1 X move.l d1,a4 X move.l 60(a4),d1 X beq.s noprogload X move.l #procloaded,d0 X bsr putstr X move.l 16(a4),d0 X bsr putbcpl X bsr newline Xhu5 lea hunkheader(PC),a0 X bsr puthead X moveq #0,d5 Xhu6 move.l d5,d3 X bsr bytedec X addq #1,d5 X move.l d1,d0 X bsr hexa X lsl.l #2,d1 X move.l d1,a4 X move.l d1,d0 X addq.l #4,d0 X bsr hexa X move.l -4(a4),d0 X bsr hexa X bsr newline X move.l 0(a4),d1 X bne.s hu6 X rts X;change the priority of a node Xpri bsr getnum X tst.b d7 X beq syntax X move.b d2,newpri X bsr nodenam2 X moveq.l #5,d7 X lea DevNode(PC),a4 X bsr findnam X tst.b d7 X beq.s pi1 X move.l d0,a1 X move.b newpri,9(a1) X cmp.l #SemNode,a4 X ble.s pi2 X move.l #listerr,d0 X bra putnam Xpi2 CALL Forbid,_SysBase(PC) X CALL Remove,_SysBase(PC) X move.l d0,a1 X move.l a4,a0 X move.l 0(a0),d6 X lea 0(a6,d6),a0 X CALL Enqueue,_SysBase(PC) X CALL Permit,_SysBase(PC) Xpi1 rts X;set all break signals of a task Xbreak move.l #$f000,d0 X bra setthem X Xsignal bsr readhex X tst.b d7 X beq syntax Xsetthem move.l d0,savedat X bsr nodenam X moveq.l #2,d7 X lea TReNode(PC),a4 X bsr findnam X tst.b d7 X beq.s pi1 X move.l d0,a1 X move.l savedat,d0 X and.l 18(a1),d0 X CALL Signal,_SysBase(PC) X rts X X;set up a list of tasknames which should't be displayed X Xhide cmp.b #10,0(a0) X bne.s hid5 X bra syntax Xhid5 lea hidestart(PC),a2 X move.l a2,d3 Xhid0 tst.l 0(a2) X beq.s hid1 X move.l 0(a2),a2 X lea 4(a2),a1 X bsr strcmp X tst d0 X beq.s hid2 X move.l a2,d3 X bra.s hid0 Xhid1 move.l a0,a4 X bsr strlen2 X addq #5,d0 X move.l #65536,d1 X CALL AllocMem,_SysBase(PC) X tst.l d0 X beq.s hid4 X move.l d0,a1 X move.l d0,0(a2) X addq #4,a1 Xhid3 cmp.b #10,0(a4) X beq.s hid4 X move.b (a4)+,(a1)+ X bra.s hid3 Xhid4 rts Xhid2 move.l d3,a3 X move.l 0(a2),0(a3) Xfreehidden lea 4(a2),a0 X bsr strlen X addq #5,d0 X move.l a2,a1 X CALL FreeMem,_SysBase(PC) X rts X Xfreehidmem move.l hidestart(PC),a4 Xfhm0 move.l a4,d0 X beq.s fhm1 X move.l a4,a2 X move.l 0(a2),a4 X bsr freehidden X bra fhm0 Xfhm1 rts X X;set up an ALIAS list Xalias cmp.b #10,0(a0) X beq showalias X bsr strbuf X move.l a0,a5 X lea buffer,a0 X bsr strlen X tst.l d0 X beq syntax X X moveq #1,d1 X cmp d1,d0 X bne.s 5$ X lea params(PC),a0 X moveq #parmnum-1,d1 X move.b buffer,d2 X6$ cmp.b (a0)+,d2 X dbeq d1,6$ X tst.w d1 X bmi.s 5$ X move.l #aliaserr,d0 X bsr putstr X move.l #params,d0 X bsr putstr X move.l #aliaserr2,d0 X bra putnam X X5$ move.l d0,d5 X move.l a5,a0 X adda.l d0,a0 X bsr kllblnks X move.l a5,-(a7) X bsr findcmd X move.l (a7)+,a5 X tst.l d2 X bmi syntax X move.l a5,a0 X bsr strbuf X X addq #6,d5 X move.l d5,d0 X move.l #65536,d1 X CALL AllocMem,_SysBase(PC) X tst.l d0 X beq.s 1$ X X move.l aliaslist(PC),d1 X bne.s 2$ X move.l d0,aliaslist X bra.s 3$ X2$ move.l d1,a0 X move.l 0(a0),d1 X bne.s 2$ X move.l d0,0(a0) X X3$ move.l d0,a0 X move.b d2,4(a0) X X lea 5(a0),a0 X lea buffer,a1 X4$ move.b (a1)+,(a0)+ X bne.s 4$ X1$ rts X Xshowalias lea alhead(PC),a0 X bsr puthead X move.l aliaslist(PC),d0 X beq.s 1$ X2$ move.l d0,a5 X addq #5,d0 X bsr putstr X move.w #15,d1 X bsr tab X move.l #equal,d0 X bsr putstr X move.b 4(a5),d0 X ext.w d0 X bsr getcmdptr X bsr putnam X move.l 0(a5),d0 X bne.s 2$ X1$ rts X Xfreealias move.l aliaslist(PC),a4 X1$ move.l a4,d0 X beq.s 2$ X move.l a4,a2 X move.l 0(a2),a4 X lea 5(a2),a0 X bsr strlen X addq #6,d0 X move.l a2,a1 X CALL FreeMem,_SysBase(PC) X bra 1$ X2$ rts X Xgetcmdptr move.l a0,-(a7) X lea commds(PC),a0 X2$ tst d0 X beq.s 1$ X3$ tst.b (a0)+ X bne.s 3$ X subq #1,d0 X bra.s 2$ X1$ move.l a0,d0 X move.l (a7)+,a0 X rts X X X;'flushlibs' Xflush move.l #$ffffff,d0 X moveq #0,d1 X CALL AllocMem,_SysBase(PC) Xflsh1 rts X X;display library->lib_IDString Xinfo bsr nodenam2 X moveq.l #2,d7 X lea DevNode(PC),a4 X bsr findnam X tst.b d7 X beq.s flsh1 X move.l d0,a0 X move.l 24(a0),d0 X beq.s if1 X move.l d0,d1 X andi.l #1,d1 X bne.s if1 X bra putnam Xif1 move.l #noinfo,d0 X bsr putstr X move.l a5,d0 X bra putnam X Xcapture move.l _SysBase(PC),a1 X lea 42(a1),a0 X moveq #2,d6 X lea coldtxt,a4 Xcap0 move.l a4,d0 X bsr putstr X move.l 0(a0),d0 X bne.s cap1 X move.l #unset,d0 X bsr putstr X bra cap2 Xcap1 bsr hexa Xcap2 bsr newline X lea 15(a4),a4 X addq #4,a0 X dbf d6,cap0 X X move.l #kicktxt,d0 X bsr putstr X move.l 546(a1),a0 X cmpa.l #0,a0 X bne.s kickm3 X move.l #unset,d0 X bra putnam Xkickm3 move.l a0,-(a7) X bsr newline X lea kickhead(PC),a0 X bsr puthead X move.l (a7)+,a0 Xkickm0 move.l a0,d0 X beq kickm4 X bpl.s kickm1 X bclr #31,d0 X move.l d0,a0 X bra.s kickm0 Xkickm1 move.w 14(a0),d6 X subq #1,d6 X lea 16(a0),a2 Xkickm2 move.l 0(a2),d0 X bsr hexa X move.l 0(a2),d0 X move.l 4(a2),d4 X add.l d4,d0 X bsr hexa X move.l d4,d0 X clr.b d3 X bsr longdec X bsr newline X addq #8,a2 X dbf d6,kickm2 X move.l 0(a0),a0 X bra kickm0 Xkickm4 rts X Xclrcold move.l _SysBase,a0 X clr.l 42(a0) X bra.s chksum Xclrcool move.l _SysBase,a0 X clr.l 46(a0) X bra.s chksum Xclrwarm move.l _SysBase,a0 X clr.l 50(a0) X Xchksum lea 34(a0),a1 X move #22,d0 Xaddchk add (a1)+,d1 X dbf d0,addchk X not d1 X move.w d1,82(a0) X rts X X;Save the command line to be repeated. If this line doesn't produce X;any output, don't repeat it at all Xrepeatcmd tst.w repeat X bne.s 2$ X move.w repeatlen(PC),d0 X subq #7,d0 X move.w d0,repeatlen X lea repeatbuffer,a1 X lea dummy,a2 X move.w d0,d1 X ext.l d1 X1$ move.b 0(a0),(a1)+ X move.b (a0)+,(a2)+ X dbf d1,1$ X X clr.l lastprinted X clr.b printed X move.w #1,repeat X bsr cli X tst.b printed X beq.s 2$ X bsr starttimer X rts X2$ clr.w repeat X rts X X;save the parameters from a 'window x y width height' call Xsetwindow tst.b fromfile X bne.s wiw1 Xwiw3 move.l #wiwerr,d0 X bra putnam Xwiw1 lea window_l(PC),a3 X moveq #3,d5 Xwiw0 bsr getnum X tst d7 X beq.s wiw2 X move.w d2,0(a3) X addq #2,a3 X dbf d5,wiw0 Xwiw2 rts X X;display ExecBase->LastAlert Xlastalert movem.l $100,d1-d2 X tst.l d1 X bne.s al1 X move.l _SysBase(PC),a0 X movem.l 514(a0),d1-d2 Xal1 move.l #gurutxt,d0 X bsr putstr X move.l d1,d0 X bsr hexa X lea out,a0 X move.l ptr(PC),d0 X move.b #'.',-1(a0,d0) X move.l d2,d0 X bsr hexa X bra newline X X;toggle CPUSE task list Xusage bchg #0,usageflag X rts X X;toggle task-header display on/off Xnohead bchg #0,headon X rts X X;toggle hide entries on/off Xhidden bchg #0,hideon X rts X X;toggle sort on/off Xsort bchg #0,sorton X rts X X;toggle task-ports display on/off Xtaskports bchg #0,tports Xclo1 rts X X;Open a library Xopenlib bsr nodenam2 X move.l a5,a1 X moveq #0,d0 X CALL OpenLibrary,_SysBase(PC) X tst.l d0 X beq fn5 Xopli1 rts X X X;close it Xcloselib bsr nodenam2 X moveq #0,d7 X lea LibNode(PC),a4 X bsr findnam X tst.b d7 X beq.s clo1 X move.l d0,a1 X CALL CloseLibrary,_SysBase(PC) X rts X Xremnode bsr nodenam2 X moveq #7,d7 X lea TReNode(PC),a4 X bsr findnam X tst.b d7 X beq.s 1$ X CALL Disable,_SysBase(PC) X move.l d0,a1 X CALL Remove,_SysBase(PC) X CALL Enable,_SysBase(PC) X1$ rts X X;end Xoper but stay in background Xhold addq #4,a7 X bra.s instback Xquithold lea in,a0 X lea dummy,a1 Xqh1 move.b (a1)+,d0 X move.b d0,(a0)+ X cmp.b #10,d0 X bne.s qh1 X Xinstback tst.b background X bne.s cleanit X move.b #1,background X bsr installh Xcleanit move.l fileptr(PC),d1 X beq.s ib1 X CALL Close,dosbase(PC) X clr.l fileptr Xib1 clr.b running X bsr killpage X bsr freeblank X tst.l wnptr X beq.s 5$ X tst.b ownscreen X bne.s 6$ X move.l wnptr(PC),a0 X move.l 4(a0),window_l X move.l 8(a0),window_w X6$ move.l wnptr(PC),a0 X CALL CloseWindow,intuibase(PC) X clr.l intuimsg X clr.l wnptr X5$ tst.b ownscreen X beq.s 4$ X move.l screenptr(PC),a0 X CALL CloseScreen,intuibase(PC) X clr.l screenptr X X4$ tst.b iconifyon X beq.s 1$ X jsr iconify X bra.s 2$ X X1$ move.l mysignal(PC),d0 X or.l trapsignal(PC),d0 X CALL Wait,_SysBase(PC) X2$ move.b #1,running X and.l trapsignal(PC),d0 X beq.s 3$ X move.b #1,gotguru SHAR_EOF echo "End of archive 1 (of 3)" # if you want to concatenate archives, remove anything after this line exit