ain@j.cc.purdue.edu (Pat-bob White) (10/16/88)
Submitted by: Guenther Werner <G35@DHDURZ1.BITNET> Summary: A system monitor utility Poster Boy: Rob Tillotson (akl@j.cc.purdue.edu) Archive Name: sources/amiga/volume5/xoper.d.Z binaries/amiga/volume8/xoper.d.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.doc # This archive created: Thu Oct 13 13:41:29 1988 # By: Rob Tillotson (Bored Students Anonymous) cat << \SHAR_EOF > Xoper.doc Xoper V1.1 Copyright (c) Werner Gunther 1988 Xoper is a freeware program to display and to control system activity. If you find this program useful, feel free to send a donation to the address below. Starting Xoper from CLI: Xoper [T] [S] [L] [D] [R] [E] [M] [P] [I] These parameters are decribed 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. 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 enbedded 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) ,processnumber for Dos-Processes (decimal), taskname. S = Task Signals 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. R = Resident Base address (HEX), priority (decimal), flags (binary), version (decimal), type, name. E = Resources (sorry) Base address (HEX), open count (decimal), version (decimal), revision (decimal), flags (binary), resource name. M = Memory Lower and upper bounds (HEX), bytes free (HEX), attributes, priority (decimal), hunk name. P = Ports Node address (HEX), portname, flags, signal bits (binary),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 [interupt queue the interrupt belongs to], interrupt name. H = Help ( or ?) Show a list of commands. 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 usualy 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 enbedded 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 Xoper V1.0 Mypri <priority> Shortcut for "Taskpri Xoper <priority>" Example: Mypri 6 Pri <priority> <nodename> Change the priority of any other node. This commad 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 Signal <mask> [processnumber] <taskname> Set any other 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 Hunks [processnumber] <processname> Show location, BCPL-Pointers and length of memory blocks the process uses. Example: Hunks RAM 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. Lockdrive <DF0 | DF1 | DF2 | DF3> Prevent DOS, Workbench and Disk-Validator from cluttering on the disk. This command isn't very useful, I just needed it myself. Freedrive <DF0 | DF1 | DF2 | DF3> 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 FREEZED. When you leave Xoper, halted Task will be released. Example: Freeze Killer Graphics Task Warm [processnum] <taskname> Restart a halted Task. Task must be FREEZED. Example: Warm Killer Graphics Task 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. Taskports Disable / enable a listing of taskports if ports are displayed. More Stop displaying "<MORE>" and "<RETURN>" if output exceeds window. 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 !!!!!!!!!!!!! Cancel [processnumber] <taskname> Cancel a task or a process. If the task has been called from CLI, the Task itself and the CLI will be killed. Hunks and the teminal-window will be freed. Simple tasks are just RemTask()'ed. If the process has been started from Workbench or fired up by another Process using CreateProc(), a promt will be displayed, asking you if you want to Unload() this process. On Workbench applications or processes using segment-splitting the answer shoud be YES, otherwise NO. This command is very useful if the task is in "Software Error-Task held" state. 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. ---------------------------------------------------------------------------- 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
ain@j.cc.purdue.edu (Pat-bob White) (10/17/88)
Submitted by: Guenther Werner <G35@DHDURZ1.BITNET> Summary: A system monitor utility Poster Boy: Rob Tillotson (akl@j.cc.purdue.edu) Archive Name: sources/amiga/volume5/xoper.s.1.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.1 # This archive created: Thu Oct 13 13:44:56 1988 # By: Rob Tillotson (Bored Students Anonymous) cat << \SHAR_EOF > Xoper.a.1 ****************************************** * Xoper 1.1 Copyright (C) Werner Gunther * * Written for the A68K Assembler * * (Fish 110) by Charlie Gibbs and * * Brian R. Anderson * * * ****************************************** ;DEBUG SET 1 XDEF _SysBase sysbase equ 4 CALL MACRO xref _LVO\1 move.l \2,a6 jsr _LVO\1(a6) ENDM LIBCALL MACRO xref _\1 jsr _\1 ENDM ADDCMD MACRO cmdnum set cmdnum+1 dc.b \1,0 ENDM ;Program startup. If called from DOS we ;use segment splitting to detach ;from our DOS-task. ;A0 points to parameter area, ;D0 holds its length. start move.l a0,parmtxt move.b d0,d5 lea dosname(PC),a1 move.l sysbase,a0 lea 378(a0),a0 move.l a0,-(a7) CALL FindName,sysbase move.l d0,dosbase move.l 0(a7),a0 lea gfxname(PC),a1 CALL FindName,sysbase move.l d0,gfxbase move.l (a7)+,a0 lea intuiname(PC),a1 CALL FindName,sysbase move.l d0,intuibase move.l d0,a0 move.l $38(a0),a0 move.w 12(a0),d0 sub.w #550,d0 move.w d0,window_l move.l sysbase,a4 move.l 276(a4),a4 tst.l $ac(a4) bne.s notwb lea $5c(a4),a0 CALL WaitPort,sysbase lea $5c(a4),a0 CALL GetMsg,sysbase move.l d0,wbmsg move.w #$740a,in notwb: IFND DEBUG lea newname,a1 CALL FindTask,sysbase tst.l d0 bne oops ENDC tst.l wbmsg beq.s fromdos jmp mainprg fromdos lea in,a3 clr.l d7 move.b d5,d7 move.l parmtxt,a4 trans move.b (a4)+,(a3)+ dbf d7,trans cmpi.b #1,d5 bne.s starttask move.w #$740a,in starttask: IFND DEBUG lea start(PC),a1 suba.l #4,a1 move.l 0(a1),d3 move.l d3,myseg clr.l 0(a1) CALL Forbid,sysbase move.l #newname,d1 clr.l d2 move.l #3500,d4 CALL CreateProc,dosbase clr.l d1 CALL Exit,dosbase oops suba.l a0,a0 CALL DisplayBeep,intuibase CALL Forbid,sysbase move.l wbmsg,d0 beq.s leave move.l d0,a1 CALL ReplyMsg,sysbase clr.l d0 leave rts dosname dc.b 'dos.library',0 intuiname dc.b 'intuition.library',0 gfxname dc.b 'graphics.library',0 EVEN main CODE xoper ENDC mainprg move.l sysbase,a0 move.l a0,_SysBase move.l 276(a0),a0 move.l a0,mytask move.l #newname,10(a0) pea 0 pea 0 LIBCALL CreatePort lea 8(a7),a7 move.l d0,replyport cmp.w #'-b',in bne.s restart move.w #$740a,in bra instback ;This code just opens a CON: Window. Position ;and size are taken from window_l,window_t, ;window_w,window_h. restart move.l mytask(PC),a0 clr.l 26(a0) lea fname,a0 move.l #'con:',0(a0) clr.b 4(a0) lea buffer,a1 lea window_l(PC),a2 move.l #3,d4 rest1 move.l #2,d3 clr.l d0 move.w (a2)+,d0 bsr longdec bsr strcat move.w #$2f00,buffer bsr strcat dbf d4,rest1 lea windowname(PC),a1 bsr strcat move.l a0,d1 move.l #1005,d2 CALL Open,dosbase(PC) move.l d0,fileptr lsl.l #2,d0 move.l d0,a4 move.l 8(a4),conmsg ;get a pointer to our window move.l #buffer,d0 lsr.l #2,d0 move.l d0,dp_Arg1 move.l conmsg,a0 move.l #25,dp_Type bsr cons1 lea buffer,a0 move.l 28(a0),window clr.l ptr ;show a list. The string entered from keyboard is stored ;in 'in'.Every character is interpreted as one command ;i.e. 'rip' means 'resources'+'interrupts'+'ports'. showwhat bsr raw bsr clearscr tst.b morefl beq.s swh1 ;if <MORE> is enabled we need to know how many lines can ;fit into our window move.l #getwin,d2 move.l fileptr,d1 moveq.l #4,d3 CALL Write,dosbase(PC) move.l fileptr,d1 move.l #9,d3 move.l #buffer,d2 CALL Read,dosbase(PC) lea buffer,a0 lea 5(a0),a0 bsr isdec subq.b #1,d2 move.b d2,rows clr.b row ;search the command to be executed. If none is found, ;show a help message swh1 clr.l d7 input lea in,a0 move.b 0(a0,d7),d0 addq.b #1,d7 cmpi.b #' ',d0 beq.s input cmpi.b #10,d0 beq nomore or.b #32,d0 cmpi.b #'q',d0 beq exit lea params(PC),a0 clr.l d1 i1 cmp.b 0(a0,d1),d0 beq.s foundp addq.b #1,d1 cmpi.b #parmnum,d1 bne.s i1 move.l #usetxt,d0 move.b #1,mnflag bsr putnam clr.b mnflag bra nomore foundp lsl.b #2,d1 lea subs(PC),a0 move.b #1,mnflag jsr 0(a0,d1) clr.b mnflag bra.s input ;wait for 'timeout' seconds for a kepress nomore move.l #prompt,d2 move.l fileptr,d1 moveq.l #7,d3 CALL Write,dosbase(PC) bsr con move.b timeout,d6 halt move.l #1000000,d4 bsr getkey move.l mytask(PC),a0 move.l 26(a0),d1 and.l #$1000,d1 bne exit tst.l d0 bne.s cli subq.b #1,d6 bne.s halt clr.l d4 bsr getkey tst.l d0 bne.s cli bra showwhat getkey move.l fileptr,d1 moveq.l #1,d3 move.l #null,d2 CALL Write,dosbase(PC) move.l d4,d2 move.l fileptr,d1 CALL WaitForChar,dosbase(PC) rts ;read the string from keyboard search and execute ;the command, if any. cli bsr readline lea dummy,a0 subq.b #1,d0 cl2 subq.b #1,d0 bmi.s cl1 cmp.b #' ',0(a0,d0) beq.s cl2 cl1 addq.b #1,d0 move.b #10,0(a0,d0) bsr kllblnks cmpi.b #10,0(a0) beq showwhat lea in,a1 lea commds(PC),a2 clr.b d2 tstcmd move #-1,d1 tc2 addq #1,d1 move.b 0(a0,d1),d3 or.b #32,d3 tst.b 0(a2,d1) beq.s foundcmd cmp.b 0(a2,d1),d3 beq.s tc2 nocmd tst.b (a2)+ bne.s nocmd addq.b #1,d2 cmpi.b #cmdnum,d2 bne tstcmd bra.s nm1 foundcmd cmpi.b #'*',d3 beq.s okcmd cmpi.b #' ',d3 bne.s nocmd okcmd clr.b procnum adda.w d1,a0 bsr kllblnks and.l #$ff,d2 lsl #2,d2 lea cmdaddr(PC),a1 clr.b printed jsr 0(a1,d2) tst.b morefl beq nomore tst.b printed beq nomore move.l #10,d3 move.l fileptr,d1 move.l #waittxt,d2 CALL Write,dosbase(PC) bsr readline move.l #4,d3 move.l fileptr,d1 move.l #thisline,d2 CALL Write,dosbase(PC) bra nomore nm1 lea buffer,a2 nm2 move.b (a1)+,(a2)+ cmp.b #10,-1(a1) bne.s nm2 lea in,a1 nm0 move.b (a0)+,(a1)+ dbf d0,nm0 lea dummy,a2 lea buffer,a1 nm3 move.b (a1)+,(a2)+ cmp.b #10,-1(a1) bne.s nm3 bra showwhat subs bra showtask bra showaddr bra showdevs bra showlibs bra showres bra showresi bra showmem bra showprt bra showint cmdaddr bra settime bra taskpri bra info bra pri bra flush bra freeze bra warm bra signal bra break bra alert bra lastalert bra hold bra stopall bra clear bra cancel bra moretst bra taskports bra hunks bra devices bra openlib bra closelib bra currentdir bra cd bra mypri bra openfiles bra locks bra unlock bra screens bra windows bra closescreen bra closewindow bra fonts bra windowfonts bra lockdrive bra freedrive ;------ Task-Structures----- showaddr clr.b tasktyp bra.s startask showtask move.b #1,tasktyp startask move.l #infoh1,d0 bsr putstr move.l 4,a6 move.l #cpu2,d0 btst #1,297(a6) bne.s cpupr move.l #cpu1,d0 btst #0,297(a6) bne.s cpupr move.l #cpu0,d0 cpupr jsr putstr move.l 4,a6 btst #2,297(a6) beq.s no881 move.l #cpu3,d0 bsr putstr no881 move.l #20,d1 bsr tab move.l #infoh3,d0 bsr putstr move.l _SysBase(PC),a6 move.l 280(a6),d0 move.l 284(a6),d1 move.l oldidl,d3 move.l d0,oldidl sub.l d3,d0 move.l olddisp,d3 move.l d1,olddisp sub.l d1,d3 move.l d3,-(a7) sub.l d3,d0 neg.l d3 lsl.l #2,d3 move.l d3,d1 lsl.l #3,d3 move.l d3,d2 lsl.l #1,d3 add.l d2,d3 add.l d1,d3 move.l d0,d1 move.l d3,d0 bsr div move.l d0,d3 bsr bytedec move.l #infoh4,d0 bsr putnam move.l #infoh2,d0 bsr putstr move.l (a7)+,d0 neg.l d0 clr.l d3 bsr longdec move.l #27,d1 bsr tab move.l #infoh6,d0 bsr putstr move.l 4,a4 move.l 284(a4),d0 bsr longdec move.l #nxtline,d0 bsr putstr move.l #nxtline,d0 bsr putstr lea theader(PC),a0 tst.b tasktyp bne.s phedder lea t2header(PC),a0 phedder bsr puthead bsr getaskdat lea buffer,a5 pt1 tst.b entries beq pt2 move.l 0(a5),a4 move.l a4,d0 bsr hexa tst.b tasktyp beq.s pt12 clr.l d0 move.b 8(a4),d0 bsr gettype pt12 clr.l d0 move.b 9(a5),d0 subq.b #1,d0 mulu #10,d0 move.l #status,d1 add.l d1,d0 bsr putstr tst.b tasktyp bne.s pt13 move.l 18(a4),d0 bsr hex8 move.l #ganzlongnix,d0 cmp.b #4,9(a5) beq.s pt14 bsr putstr bra.s pt15 pt14 move.l 22(a4),d0 bsr hex8 pt15 move.l 26(a4),d0 bsr hex8 move.l 54(a4),a1 move.l 0(a1),d0 cmp.b #2,9(a5) bne.s pt16 move.l #*,d0 pt16 bsr hexa bra pt4 pt13 move.b 10(a5),d3 bsr plusmins clr.b d3 cmpi.b #13,8(a5) bne.s noproc move.b 11(a5),d3 bsr bytedec bra.s pt4 noproc move.l #nix,d0 bsr putstr pt4 move.l 4(a5),d0 bsr putnam lea 12(a5),a5 subq.b #1,entries bra pt1 pt2 rts putlist move.l 0(a4),a4 tst.l 0(a4) beq.s endlist bsr putdata bra.s putlist endlist rts putdata move.l a4,0(a5) move.l 10(a4),4(a5) move.b 8(a4),8(a5) move.b 15(a4),9(a5) move.b 9(a4),10(a5) move.b 143(a4),11(a5) lea 12(a5),a5 addq.b #1,entries rts gettype and.l #$f,d0 mulu #11,d0 add.l #type,d0 bra putstr getaskdat move.w #$4000,$dff09a lea buffer,a5 clr.b entries move.l _SysBase(PC),a4 move.l 276(a4),a4 bsr putdata move.l _SysBase(PC),a4 lea 406(a4),a4 bsr putlist move.l _SysBase(PC),a4 lea 420(a4),a4 bsr putlist lea stplist(PC),a4 bsr putlist move.w #-$4000,$dff09a rts *-------- mem-hunks ------------ showmem lea mheader(PC),a0 bsr puthead move.l _SysBase(PC),a5 lea 322(a5),a5 clr.l d5 mem1 move.l 0(a5),a5 tst.l 0(a5) beq.s mem2 move.l 20(a5),d0 bsr hexa move.l 24(a5),d0 bsr hexa move.l 28(a5),d0 add.l d0,d5 moveq #1,d3 bsr longdec move.b 15(a5),d3 bsr bytedec move.b 9(a5),d3 bsr plusmins move.l 10(a5),d0 bsr putnam bra.s mem1 mem2 move.l #infoh6,d0 bsr putstr move.l #15,d1 bsr tab move.l d5,d0 bsr longdec move.l #nxtline,d0 bra putstr *--------- interrupts ------------ showint lea iheader(PC),a0 bsr puthead lea intnames(PC),a5 lea inttyp(PC),a4 move.l #15,d5 move.l _SysBase(PC),a3 lea 84(a3),a3 si0 tst.b 0(a4) bne.s si4 move.l 8(a3),a2 bra.s si5 si4 move.l 0(a3),a2 si5 cmp.l #0,a2 beq.s nxtint tst.b 0(a4) beq.s si1 si2 move.l 0(a2),a2 tst.l 0(a2) beq.s nxtint si1 move.l a2,d0 bsr hexa move.l 14(a2),d0 bsr hexa move.l 18(a2),d0 bsr hexa move.b 9(a2),d0 move.l a3,-(a7) bsr plusmins move.l (a7)+,a3 move.l a5,d0 bsr putstr move.l 10(a2),d0 tst.l d0 bne.s prtintnam move.l #ganzlongnix,d0 prtintnam bsr putnam tst.b 0(a4) bne.s si2 tst.l 0(a2) beq.s nxtint move.l 0(a4),a4 bra si1 nxtint lea 1(a4),a4 lea 12(a5),a5 lea 12(a3),a3 dbf d5,si0 rts *--------- resident ------------ showresi lea rheader(PC),a0 bsr puthead move.l _SysBase(PC),a5 move.l 300(a5),a5 r1 tst.l 0(a5) beq r2 move.l 0(a5),a4 move.l a4,d0 bsr hexa move.b 13(a4),d3 bsr plusmins move.b 10(a4),d0 bsr bin move.b 11(a4),d3 bsr bytedec move.b 12(a4),d0 bsr gettype move.l 14(a4),d0 bsr putnam lea 4(a5),a5 bra r1 r2 rts *--------- ports ------------- showprt lea pheader(PC),a0 bsr puthead move.l _SysBase(PC),a4 add.l #392,a4 lea buffer,a5 clr.l d5 CALL Forbid,_SysBase(PC) sp2 move.l 0(a4),a4 tst.l 0(a4) beq.s sp20 bsr getpdata bra.s sp2 sp20 tst.b tports beq.s sp15 sp1 move.w #$4000,$dff09a move.l _SysBase(PC),a4 move.l 276(a4),a4 lea 92(a4),a4 bsr getpdata move.l _SysBase(PC),a2 lea 406(a2),a2 sp11 move.l 0(a2),a2 tst.l 0(a2) beq.s sp14 lea 92(a2),a4 cmp.b #13,8(a2) bne.s sp11 bsr getpdata bra sp11 sp14 move.l _SysBase(PC),a2 lea 420(a2),a2 sp12 move.l 0(a2),a2 tst.l 0(a2) beq.s sp13 lea 92(a2),a4 cmp.b #13,8(a2) bne.s sp12 bsr getpdata bra sp12 sp13 move.w #-$4000,$dff09a sp15 CALL Permit,_SysBase(PC) lea buffer,a5 sp3 tst.b d5 beq sp6 move.l 0(a5),d0 bsr hexa move.l 4(a5),d0 bsr putstr move.l #23,d1 bsr tab move.b 8(a5),d0 and.l #3,d0 mulu #9,d0 add.l #mp_flags,d0 bsr putstr move.b 9(a5),d0 bsr bin move.b 14(a5),d3 bsr bytedec move.l #ganzlongnix,d0 move.l 10(a5),a3 cmp.l #0,a3 beq.s sp8 move.l 10(a3),d1 move.l d1,d2 andi.l #$ff000000,d2 bne.s sp8 move.l d1,d0 sp8 bsr putnam lea 16(a5),a5 subq.b #1,d5 bra sp3 sp6 rts getpdata move.l a4,0(a5) move.l 10(a4),4(a5) move.b 14(a4),8(a5) move.b 15(a4),9(a5) move.l 16(a4),10(a5) clr.b d0 movea.l 20(a4),a3 sp10 movea.l 0(a3),a3 cmpa.l #0,a3 beq.s sp9 addq.b #1,d0 bra.s sp10 sp9 move.b d0,14(a5) lea 16(a5),a5 addq.b #1,d5 rts *-------- resources ------------ showres lea lheader(PC),a0 bsr puthead1 lea resnam(PC),a0 bsr puthead2 move.l _SysBase(PC),d5 add.l #336,d5 bsr show rts *--------- devices ------------- showdevs lea lheader(PC),a0 bsr puthead1 lea devnam(PC),a0 bsr puthead2 move.l _SysBase(PC),d5 add.l #350,d5 bsr show rts *-------- libraries ------------- showlibs lea lheader(PC),a0 bsr puthead1 lea libnam(PC),a0 bsr puthead2 move.l _SysBase(PC),d5 add.l #378,d5 show lea buffer,a5 clr.b entries CALL Forbid,_SysBase(PC) move.l d5,a4 sl1 move.l 0(a4),a4 tst.l 0(a4) beq.s sl2 addq.b #1,entries move.l a4,0(a5) move.l 10(a4),4(a5) move.b 33(a4),8(a5) move.b 21(a4),9(a5) move.b 23(a4),10(a5) move.b 14(a4),11(a5) lea 12(a5),a5 bra.s sl1 sl2 CALL Permit,_SysBase(PC) lea buffer,a5 dl3 tst.b entries beq.s sl4 move.l 0(a5),d0 bsr hexa move.b 8(a5),d3 bsr bytedec move.b 9(a5),d3 bsr bytedec move.b 10(a5),d3 bsr bytedec move.b 11(a5),d0 bsr bin move.l 4(a5),d0 bsr putnam lea 12(a5),a5 subq.b #1,entries bra.s dl3 sl4 rts ;find the first entry in the device-list ;returns a1 = pointer to first entry devinfo move.l dosbase(PC),a1 move.l 34(a1),a1 move.l 24(a1),a1 adda.l a1,a1 adda.l a1,a1 move.l 4(a1),a1 rts ;unlock a file unlock bsr readhex tst.b d7 beq syntax move.l d0,remembr move.l d0,-(a7) move #-1,d6 bsr of44 tst.l remembr beq.s ul1 move.l #unlerr,d0 bsr putnam bra ul4 ul1 move.l #unl1,d0 bsr putstr move.l 0(a7),d0 bsr getpath move.l #unltxt2,d0 bsr putstr bsr readline ori.b #$20,dummy cmp.b #'y',dummy bne.s ul5 move.l 0(a7),d1 CALL UnLock,dosbase ul5 bsr freefinfo ul4 lea 4(a7),a7 rts ;---------- Show all Locks------------ locks clr.l d6 bra.s of33 ;---------- Open Files----------- openfiles moveq #1,d6 of33 lea ofheader(PC),a0 bsr puthead of44 bsr allocfinfo bsr devinfo move.l a1,a3 of1 adda.l a3,a3 adda.l a3,a3 cmp.l #2,4(a3) bne of2 move.l 40(a3),d0 lsl.l #2,d0 move.l d0,a4 clr.l d3 move.b (a4)+,d3 subq #1,d3 lea buffer,a5 of22 move.b (a4)+,(a5)+ dbf d3,of22 move.b #':',(a5)+ clr.b 0(a5) cmp.l #'RAM ',buffer bne.s of5 cmp.l #'Disk',buffer+4 bne.s of5 move.l #$4d3a0000,buffer+2 of5 move.l #buffer,d1 move.l #-2,d2 CALL Lock,dosbase(PC) tst.l d0 bne.s of6 move.l #buffer,d0 bsr putstr move.l #nomount,d0 bsr putnam bra of2 of6 move.l d0,-(a7) lsl.l #2,d0 move.l d0,a5 of4 move.l 0(a5),d0 cmp.l #50,d0 ble of3 move.l d0,d5 lsl.l #2,d5 move.l d5,a5 move.l d0,d5 tst d6 bpl.s of45 cmp.l remembr(PC),d0 bne.s of3 clr.l remembr move.l (a7)+,d1 CALL UnLock,dosbase(PC) rts of45 move.l 8(a5),d4 bsr getfinfo move.l finfoptr,a4 tst.l d6 beq.s of8 bmi.s of8 tst.l 4(a4) bpl of4 of8 move.l d5,d0 bsr hexa move.l #access,d0 cmp #-2,d4 beq.s of7 add.l #8,d0 of7 bsr putstr tst.l 4(a4) bmi.s of9 move.l #longnix,d0 bsr putstr bra of10 of9 move.l 124(a4),d0 bsr longdec of10 move.l d5,d0 bsr getpath bra of4 move.l #nxtline,d0 bsr putstr of3 move.l (a7)+,d1 CALL UnLock,dosbase(PC) of2 move.l 0(a3),a3 cmpa.l #0,a3 bne of1 bsr freefinfo rts ;---------- Dos Devices ---------- devices lea ddheader(PC),a0 bsr puthead bsr devinfo dev1 adda.l a1,a1 adda.l a1,a1 clr.b d6 tst.l 4(a1) bne dev2 move.l 40(a1),d0 bsr putbcpl move.l #10,d1 bsr tab cmp.l #20,28(a1) ble dev9 moveq #1,d6 move.l 28(a1),a3 adda.l a3,a3 adda.l a3,a3 cmp.l #20,8(a3) ble dev9 move.l 8(a3),a2 adda.l a2,a2 adda.l a2,a2 move.l 12(a2),d3 movem.l a1-a3,-(a7) bsr bytedec movem.l (a7)+,a1-a3 moveq #1,d3 move.l 20(a2),d0 bsr longdec move.l 40(a2),d0 beq.s devs20 addq #1,d0 sub.l 36(a2),d0 devs20 bsr longdec move.l 44(a2),d0 bsr longdec bra.s dev8 dev9 move.l #notfile,d0 bsr putstr dev8 tst.l 8(a1) beq.s dev6 move.l #devload,d0 bra.s dev5 dev6 move.l #devnload,d0 dev5 bsr putstr tst.b d6 beq.s dev7 move.l 4(a3),d0 bne.s dev4 dev7 move.l 16(a1),d0 bne.s dev4 tst.l 8(a1) beq.s dev11 move.l 8(a1),a3 move.l -82(a3),d0 bsr putstr bra dev11 dev4 bsr putbcpl dev11 move.l #nxtline,d0 bsr putstr dev2 move.l 0(a1),a1 cmpa.l #0,a1 bne dev1 rts ; Check if a named dos-device is mounted ; name in 'buffer'. ; Result: d0 = 0(false) anything else(true). finddev bsr devinfo fdev1 adda.l a1,a1 adda.l a1,a1 clr.b d6 tst.l 4(a1) bne.s fdev2 move.l 40(a1),a2 lea buffer,a0 bsr strbcmp tst d0 bne.s fdev3 fdev2 move.l 0(a1),a1 cmpa.l #0,a1 bne.s fdev1 fdev3 rts ; Re-assign a drive to dos freedrive clr.l dp_Arg1 bra ldr3 ; Inhibit a disk drive lockdrive move.l #1,dp_Arg1 ldr3 bsr getstr andi.w #$dfdf,buffer cmp.w #'DF',buffer bne syntax bsr finddev bne.s ldr1 ldr2 move.l #buffer,d0 bsr putstr move.l #nomount,d0 bra putnam ldr1 move.l #buffer,d1 CALL DeviceProc,dosbase(PC) tst.l d0 beq.s ldr2 move.l d0,a0 move.l #31,dp_Type bra cons1 ;display the current directory of all processes, ;except Workbench.(Worbench pr_CurrentDir is not a lock) currentdir lea wbname(PC),a1 CALL FindTask,_SysBase(PC) move.l d0,wbaddr lea cdheader(PC),a0 bsr puthead bsr allocfinfo bsr getaskdat lea buffer,a5 cd2 tst.b entries beq.s cd6 cmp.b #13,8(a5) bne.s cd5 move.l wbaddr(PC),d0 cmp.l 0(a5),d0 beq.s cd5 move.l 4(a5),d0 bsr putstr move.l #15,d1 bsr tab move.l 0(a5),a4 move.l 152(a4),d0 bne.s cd1 move.l #syst,d0 bsr putnam bra.s cd5 cd1 bsr getpath cd5 subq.b #1,entries lea 12(a5),a5 bra.s cd2 cd6 bsr freefinfo rts ;Change the current directory setting of a process cd move.l a0,-(a7) lea wbname(PC),a1 CALL FindTask,_SysBase(PC) move.l d0,wbaddr move.l (a7)+,a0 bsr getstr move.l a0,-(a7) move.l #buffer,d1 move.l #-2,d2 CALL Lock,dosbase(PC) move.l (a7)+,a0 tst.l d0 bne cd16 move.l #dnotf,d0 bra putnam cd16 move.l d0,remembr move.l a0,-(a7) bsr allocfinfo move.l remembr(PC),d0 bsr getfinfo move.l finfoptr,a5 move.l (a7)+,a0 tst.l 4(a5) bpl.s cd11 move.l #notdir,d0 bsr putnam bra cd18 cd11 bsr nodenam moveq.l #2,d7 lea TRuNode(PC),a4 bsr findnam tst.b d7 beq.s cd15 move.l d0,a5 cmp.b #13,8(a5) beq.s cd15 bsr syntax bra cd18 cd15 cmp.l wbaddr,d0 bne.s cd13 move.l #wberr,d0 bsr putnam bra cd12 cd13 move.l 152(a5),d1 move.l remembr,152(a5) move.l d1,remembr cd12 tst.l remembr beq.s cd14 move.l #unltxt,d0 bsr putstr move.l remembr(PC),d0 bsr getpath move.l #unltxt2,d0 bsr putstr bsr readline ori.b #$20,dummy cmp.b #'y',dummy bne.s cd14 cd18 move.l remembr(PC),d1 beq.s cd14 CALL UnLock,dosbase(PC) cd14 bsr freefinfo cd10 rts ;get all screen pointers. ;result: d5=number of screens ; buffer+100 holds pointers. getscr lea scrheader(PC),a0 bsr puthead getscr2 move.l intuibase(PC),a2 move.l 60(a2),a2 lea buffer+100,a1 move.w #$4000,$dff09a clr.l d5 sr1 move.l a2,(a1)+ move.l 0(a2),a2 addq.l #1,d5 cmpa.l #0,a2 bne.s sr1 subq #1,d5 move.w #-$4000,$dff09a rts ;display screen addresses and titles screens bsr getscr moveq #1,d6 lea buffer+100,a1 sr2 move d6,d3 bsr bytedec move.l 0(a1),d0 bsr hexa move.l (a1)+,a2 move.l 22(a2),d0 bsr putnam addq #1,d6 dbf d5,sr2 rts ;display window addresses and titles windows clr.b bool windows1 bsr getscr tst.b bool beq.s wn20 move.l d5,-(a7) lea fohead(PC),a0 bsr puthead move.l (a7)+,d5 wn20 lea buffer+100,a4 wn2 move.l #onscr,d0 bsr putstr move.l (a4)+,a2 move.l 22(a2),d0 bsr putnam move.l 4(a2),a1 clr d6 wn1 cmpa.l #0,a1 beq.s wn3 addq #1,d6 move.l d6,d3 bsr bytedec move.l a1,d0 bsr hexa move.l 32(a1),d0 bsr putnam tst.b bool beq.s wn21 move.l a1,-(a7) move.l 50(a1),a1 move.l 52(a1),a1 bsr fontdata move.l (a7)+,a1 wn21 move.l 0(a1),a1 bra.s wn1 wn3 dbf d5,wn2 rts ;close a specified screen closescreen bsr getscr2 moveq #1,d6 cmp.b #'$',0(a0) bne.s cs1 bsr readhex tst d7 beq syntax move.l d0,d4 clr.l d6 cs1 lea buffer+100,a2 cs5 tst d6 bne.s cs2 cmp.l (a2)+,d4 beq.s cs3 bra.s cs4 cs2 move.l (a2)+,a1 move.l 22(a1),a1 bsr strcmp tst d0 beq.s cs3 cs4 dbf d5,cs5 move.l #scnofound,d0 bra putnam cs3 move.l -4(a2),a0 CALL CloseScreen,intuibase(PC) rts ;close a specified window closewindow bsr getscr2 moveq #1,d6 cmp.b #'$',0(a0) bne.s cw1 bsr readhex tst d7 beq syntax move.l d0,d4 clr.l d6 cw1 lea buffer+100,a2 cw5 move.l (a2)+,a4 move.l 4(a4),a4 cw6 cmpa.l #0,a4 beq.s cw4 tst d6 bne.s cw2 cmp.l a4,d4 beq.s cw3 bra.s cw7 cw2 move.l 32(a4),a1 bsr strcmp tst d0 beq.s cw3 cw7 move.l 0(a4),a4 bra.s cw6 cw4 dbf d5,cw5 move.l #winnofound,d0 bra putnam cw3 move.l a4,a0 clr.l d0 CALL ModifyIDCMP,intuibase(PC) move.l a4,a0 CALL CloseWindow,intuibase(PC) rts ;display windows and associated fonts windowfonts move.b #1,bool bra windows1 ;display loaded font names and definitions fonts lea fohead(PC),a0 bsr puthead move.l gfxbase(PC),a1 move.l $8c(a1),a1 fo1 tst.l 0(a1) beq.s fo3 bsr fontdata move.l 0(a1),a1 bra fo1 fo3 rts fontdata move.l a1,d0 bsr hexa move.w 30(a1),d3 bsr bytedec move.w 20(a1),d3 bsr bytedec move.w 24(a1),d3 bsr bytedec move.l #romfnt,d0 btst #1,23(a1) beq.s fod1 move.l #diskfnt,d0 fod1 bsr putstr move.b 32(a1),d3 bsr bytedec move.b 33(a1),d3 bsr bytedec move.l 10(a1),d0 bra putnam ;set update rate settime bsr getnum tst.b d7 beq syntax tst.w d2 bne.s st1 move.b #1,d2 st1 move.b d2,timeout rts syntax move.l #synerr,d0 bra putnam ;copy a string from input to 'buffer' ;a0 = pointer to string getstr lea buffer,a5 gst2 cmp.b #' ',0(a0) beq.s gst1 cmp.b #10,0(a0) beq.s gst1 move.b (a0)+,(a5)+ bra.s gst2 gst1 clr.b 0(a5) bra kllblnks ;read in a nodename or a processname nodenam bsr isdec move.b d2,procnum nodenam2 bsr kllblnks move.l a0,a5 gno1 cmp.b #10,(a0)+ bne.s gno1 move.b #0,-1(a0) rts ;modify a task's priority taskpri bsr getnum tst.b d7 beq syntax move.b d2,newpri bsr nodenam moveq.l #2,d7 lea TRuNode(PC),a4 bsr findnam tst.b d7 beq.s tp1 move.l d0,a1 move.b newpri,d0 CALL SetTaskPri,_SysBase(PC) tp1 rts ;set the priority of our task mypri bsr getnum tst.b d7 beq syntax move.l _SysBase(PC),a1 move.l 276(a1),a1 move.l d2,d0 CALL SetTaskPri,_SysBase(PC) rts ;cancel a task or a process. The theory is quite simple: ;(Process->ReturnAddr)-4 points to the return address on ;the stack. Task->SPReg points to the next instruction ;to be executed. We just need a ; *(Task->SPReg) = *(Process->ReturnAddr-4). ;BUT: If the process has been started from Dos (CLI) and ;the process is doing disk I/O, the CLI will respond with ;a GURU #87000004 (AsyncPKT=unexpected packed received). ;Thats why the calling CLI is also canceled. ;Workbench tasks are unloaded after the Startup-Message has ;been replied. How in hell do we reply them ? And if the process ;has been started by a user-task we get into real trouble. cancel clr.l remembr clr.l remembr2 clr.b bool bsr nodenam testagain moveq.l #1,d7 lea TReNode(PC),a4 bsr findnam move.l a5,pointer tst.b d7 bne.s canok move.l #stperr,d0 bra putnam canok move.l d0,a1 cmp.b #1,8(a1) bne.s isproc CALL RemTask,_SysBase(PC) rts isproc clr.l d5 tst.l $ac(a1) beq.s wascreproc move.l $80(a1),a2 adda.l a2,a2 adda.l a2,a2 move.l 12(a2),d1 bne.s wascreproc move.l $ac(a1),a2 adda.l a2,a2 adda.l a2,a2 move.l 60(a2),d5 tst.l 40(a2) beq dosreturn move.l 28(a2),remembr move.l 56(a2),remembr2 bra dosreturn wascreproc tst.b bool bne.s unload move.b #2,bool move.l #canerr1,d0 bsr putstr bsr readline ori.b #$20,dummy cmp.b #'y',dummy bne.s andagain move.b #1,bool andagain move.l pointer(PC),a5 bra testagain unload cmp.b #1,bool bne.s dosreturn move.l a1,-(a7) CALL UnLoadSeg,dosbase(PC) move.l (a7)+,a1 dosreturn move.w #$4000,$dff09a move.l 54(a1),a3 move.l #endtask,0(a3) move.l #2,106(a1) move.l mytask(PC),108(a1) cmp.b #4,15(a1) bne.s doswait move.l a1,d4 CALL Remove,_SysBase(PC) move.l d4,a1 lea 406(a6),a0 CALL AddHead,_SysBase(PC) move.l d4,a1 doswait move.w #-$4000,$dff09a tst.l d5 SHAR_EOF # End of shell archive exit 0
ain@j.cc.purdue.edu (Pat-bob White) (10/17/88)
Submitted by: Guenther Werner <G35@DHDURZ1.BITNET> 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 '<MORE>' 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 '<MORE>' waittxt dc.b '<RETURN>',$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 <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 'Cancel [processnum] <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 <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