page@swan.ulowell.edu (Bob Page) (03/16/89)
Submitted-by: G35@DHDURZ1.BITNET (Guenther Werner) Posting-number: Volume 89, Issue 52 Archive-name: kernel/xoper13.1 Changes in V1.3: New commands: [S]=Stack usage, Sort, Hide, Hidden, Header, Window, InputHandler. Added : Support of startup-scripts, I/O Interrupts/second, 'Kill' an alias for 'Cancel'. Some BIG bugs have been removed: The port-display used to GURU if more than 32 Ports did exist. The Cli Xoper has been started did act like having a priority of 128. Unlock didn't unlock sometimes, the interrupt/priority field did contain rubbish, Currentdir didn't examine all Processes. There were some more minor bugs, all (hopefully) removed. [I had to split Xoper.asm into two files: Xoper.asm1 and Xoper.asm2. Use AmigaDOS 'join' or UNIX 'cat' (or something similar) to combine them back into Xoper.asm. ..Bob] # 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.asm1 # This archive created: Wed Mar 15 12:40:03 1989 cat << \SHAR_EOF > Xoper.asm1 ****************************************** * * * Xoper 1.3 Copyright (C) Werner Gunther * * * ****************************************** * Written for the A68K Assembler * * (Fish 110) by Charlie Gibbs and * * Brian R. Anderson * * * * Do not use Smallcode/Smalldata when * * linking * ****************************************** ;DEBUG SET 1 XREF _LVOSwitch 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. start moveq #3,d0 lea dummyinput,a1 getparm move.b (a0)+,(a1)+ dbf d0,getparm move.b #10,in 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 xopcon,a1 CALL FindPort,sysbase tst.l d0 bne oops ENDC tst.l wbmsg beq.s fromdos jmp mainprg fromdos: starttask: IFND DEBUG cmp.w #'-b',dummyinput bne.s stt1 CALL Output,dosbase move.l d0,-(a7) move.l #windowname,d2 move.l d0,d1 moveq.l #34,d3 CALL Write,dosbase move.l #cr,d2 move.l (a7)+,d1 moveq.l #1,d3 CALL Write,dosbase stt1 lea start(PC),a1 move.l -4(a1),d3 move.l d3,myseg clr.l -4(a1) CALL Forbid,sysbase move.l #newname,d1 clr.l d2 move.l #3500,d4 CALL CreateProc,dosbase CALL Permit,sysbase clr.l d0 rts 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 xopcon LIBCALL CreatePort lea 8(a7),a7 move.l d0,replyport ;install a counter to determine the amount of CPU-time each ;Task uses. move.l _SysBase(PC),a1 move.l #_LVOSwitch,a0 move.l 2(a1,a0),oldswitch move.l #myswitch,d0 CALL SetFunction,_SysBase(PC) ;install a counter for PORT-Interrupts lea IOCounter(PC),a1 move.l #3,d0 CALL AddIntServer,_SysBase(PC) ;Attempt to open a startup script move.l mytask(PC),a4 move.l #-1,184(a4) move.l #startupname,d1 move.l #1005,d2 CALL Open,dosbase(PC) clr.l 184(a4) move.l d0,infile beq.s nostartup clr.b morefl move.b #1,fromfile bra cli endstartup move.b morefl2(PC),morefl clr.b fromfile move.l infile(PC),d1 CALL Close,dosbase(PC) nostartup tst.l wbmsg bne.s noin cmp.b #10,dummyinput beq.s noin cmp.w #'-b',dummyinput beq.s noin move.l dummyinput,in move.b #10,in+4 bra.s nostartup2 noin cmp.b #10,in beq.s default tst.b in bne.s nostartup2 default move.w #$740a,in nostartup2 cmp.w #'-b',dummyinput beq 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 binarea(PC),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,binarea 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 move.l d0,infile beq exitall 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 tst.b d0 beq nomore 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 'timeout' seconds for a kepress nomore tst.b fromfile bne.s cli 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 tst.b fromfile beq.s cl3 tst.b eof bne endstartup cl3 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 cmpi.b #';',0(a0) beq nomore 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 nm1 foundcmd cmpi.b #'*',d3 beq.s okcmd cmpi.b #' ',d3 bne.s nocmd okcmd move.l a0,-(a7) bsr raw move.l (a7)+,a0 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 bsr raw move.l #10,d3 move.l fileptr,d1 move.l #waittxt,d2 CALL Write,dosbase(PC) bsr readline bsr con move.l #1,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 bra stack 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 bra capture bra clrcold bra clrcool bra clrwarm bra snoop bra usage bra inphand bra nohead bra sort bra hide bra hidden bra setwindow bra cancel ;------ Task-Structures----- showaddr clr.b tasktyp bra.s startask showtask move.b #1,tasktyp startask tst.b headon beq noheader1 move.l #infoh1,d0 bsr putstr move.l _SysBase(PC),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 bsr putstr move.l _SysBase(PC),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 noheader1 move.l _SysBase(PC),a6 move.w #$4000,$dff09a 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 d0,d1 sub.l d3,d1 move.l d1,maxdisp move.l d3,-(a7) movem.l d0-d3,-(a7) bsr getaskdat move.l a5,savedat movem.l (a7)+,d0-d3 sub.l d3,d0 neg.l d3 tst.b headon beq.s noheader2 bsr prcent bsr newline move.l #infoh2,d0 bsr putstr noheader2 move.l (a7)+,d0 neg.l d0 move.l d0,dispatches tst.b headon beq noheader3 clr.l d3 bsr longdec move.l #20,d1 bsr tab move.l #infoh7,d0 bsr putstr lea secs(PC),a0 lea mics(PC),a1 CALL CurrentTime,intuibase(PC) move.l secs(PC),d3 lsl.l #1,d3 move.l d3,d1 lsl.l #2,d3 add.l d1,d3 move.l mics(PC),d0 move.l #100000,d1 bsr div add.l d0,d3 move.l time10(PC),d1 move.l d3,time10 sub.l d1,d3 move.l iocount(PC),d0 clr.l iocount mulu #100,d0 move.l d3,d1 bsr div divu #10,d0 move.l d0,d1 swap d1 move d0,d3 bsr bytedec lea out,a0 move.b #'.',-1(a0,d0) or.b #'0',d1 move d1,d0 bsr putchar bsr newline bsr newline noheader3 lea theader(PC),a0 tst.b tasktyp bne.s phedder lea t2header(PC),a0 phedder bsr puthead move.l savedat(PC),a5 pt1 tst.b entries beq pt2 lea -16(a5),a5 bsr hideit tst d0 beq ptend 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 move.l dispatches(PC),d0 tst.b usageflag beq.s pt37 move.l maxdisp(PC),d0 pt37 move.l 12(a5),d3 bsr prcent clr.b d3 cmpi.b #13,8(a5) bne.s noproc tst.l 172(a4) beq.s noproc move.l 140(a4),d3 bsr bytedec bra.s pt4 noproc move.l #nix,d0 bsr putstr pt4 move.l 4(a5),d0 bsr putnam ptend 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) clr.l 12(a5) lea cputime,a0 move.l tasksnum(PC),d1 beq.s pua1 pua3 cmp.l 0(a0),a4 beq.s pua2 lea 8(a0),a0 dbf d1,pua3 bra.s pua1 pua2 move.l 4(a0),12(a5) pua1 lea 16(a5),a5 addq.b #1,entries rts gettype and.l #$f,d0 mulu #11,d0 add.l #type,d0 bra putstr getaskdat lea buffer,a5 clr.b entries lea stplist(PC),a4 bsr putlist move.l _SysBase(PC),a4 lea 420(a4),a4 bsr putlist move.l _SysBase(PC),a4 lea 406(a4),a4 bsr putlist move.l _SysBase(PC),a4 move.l 276(a4),a4 bsr putdata clr.l tasksnum move.w #-$4000,$dff09a tst.b sorton beq.s sort5 lea buffer,a3 lea -32(a5),a2 sort1 lea 16(a3),a4 sort2 move.l 0(a3),d1 cmp.l 0(a4),d1 bge.s sort3 moveq #15,d1 sort4 move.b 0(a4,d1),d0 move.b 0(a3,d1),0(a4,d1) move.b d0,0(a3,d1) dbf d1,sort4 sort3 lea 16(a4),a4 cmp.l a2,a4 ble.s sort2 lea 16(a3),a3 cmp.l a2,a3 bne.s sort1 sort5 rts prcent lsl.l #1,d3 move.l d3,d1 lsl.l #2,d3 add.l d1,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 divu #10,d0 move d0,d3 swap d0 move d0,d1 bsr bytedec lea out,a0 move.b #'.',-1(a0,d0) or.b #'0',d1 move d1,d0 bsr putchar move.l #infoh4,d0 bra putstr hideit tst.b hideon bne.s pt73 pt75 moveq #1,d0 rts pt73 lea hidestart(PC),a4 move.l 4(a5),a0 pt74 tst.l 0(a4) beq.s pt75 move.l 0(a4),a4 lea 4(a4),a1 bsr strcmp tst d0 beq hideend bra.s pt74 hideend 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 newline move.l #nxtline,d0 bra putstr *-------- Task-Stack ------------ stack lea stackhead(pc),a0 bsr puthead bsr getaskdat sta1 tst.b entries beq sta8 lea -16(a5),a5 bsr hideit tst d0 beq sta9 move.l 0(a5),a1 cmp.b #13,8(a1) bne.s sta6 move.l 172(a1),d0 beq.s sta6 lsl.l #2,d0 move.l d0,a0 tst.l 60(a0) beq.s sta6 moveq #1,d3 move.l 52(a0),d4 lsl.l #2,d4 move.l 176(a1),d0 sub.l d4,d0 bsr hexa move.l d4,d0 bsr longdec move.l 176(a1),d0 sub.l 54(a1),d0 bra.s sta7 sta6 move.l 58(a1),d0 bsr hexa moveq #1,d3 move.l 62(a1),d0 sub.l 58(a1),d0 bsr longdec move.l 62(a1),d0 sub.l 54(a1),d0 sta7 bsr longdec move.l 4(a5),d0 bsr putnam sta9 subq.b #1,entries bra sta1 sta8 rts *--------- 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),d3 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 lea 392(a4),a4 lea buffer,a5 clr.l d5 CALL Forbid,_SysBase(PC) move.w #$4000,$dff09a sp2 move.l 0(a4),a4 tst.l 0(a4) beq.s sp20 bsr getpdata bra.s sp2 sp20 tst.b tports bne.s sp15 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 sp15 lea 92(a2),a4 cmp.b #13,8(a2) bne.s sp12 bsr getpdata bra sp12 sp15 move.w #-$4000,$dff09a 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),d3 bsr bytedec 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 cmp.b #255,d0 bne.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 tst.b fromfile bne ul6 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 ul6 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 of4 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 bsr newline 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 bsr newline 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 bsr finddev bne.s ldr1 ldr2 move.l #buffer,d0 bsr putstr move.l #nomount,d0 bsr putstr move.l #dishelp,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 16(a5),a5 bra.s cd2 cd6 bsr freefinfo rts ;Change the current directory setting of a process cd tst.b fromfile bne cd10 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 inphand tst.b background bne.s inph1 bsr installh inph1 move.l #500,d4 lea InInterrupt(PC),a0 inph2 tst.l 4(a0) beq.s inph3 move.l 4(a0),a0 dbf d4,inph2 inph3 tst.b background bne.s inph4 movem.l d4/a0,-(a7) bsr removeh movem.l (a7)+,d4/a0 inph4 cmp.w #-1,d4 bne.s inph5 move.l #failed,d0 bra putnam inph5 move.l a0,-(a7) lea inheader(PC),a0 bsr puthead move.l (a7)+,a5 inph6 move.l 0(a5),a5 tst.l 0(a5) beq.s inph7 move.l a5,d0 bsr hexa move.l 14(a5),d0 bsr hexa move.l 18(a5),d0 bsr hexa move.b 9(a5),d3 bsr plusmins move.l 10(a5),d0 bne.s inph8 move.l #longnix,d0 inph8 bsr putnam bra.s inph6 inph7 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 csin 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 cwin 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 windowoff movem.l d1-d7/a0-a6,-(a7) bsr getscr2 bsr cwin move.l -(a2),a0 move.l a0,d4 tst.l 4(a0) bne.s woff1 bsr getscr2 bsr csin woff1 movem.l (a7)+,d1-d7/a0-a6 rts closetskwin movem.l d1-d7/a0-a6,-(a7) ctw0 bsr getscr2 lea buffer+100,a2 ctw1 move.l (a2)+,a4 move.l 4(a4),a4 ctw6 cmpa.l #0,a4 beq.s ctw4 move.l 86(a4),a0 move.l 16(a0),d1 cmp.l d0,d1 bne.s ctw7 move.l d0,d1 move.l a4,d0 bsr windowoff move.l d1,d0 bra ctw0 ctw7 move.l 0(a4),a4 bra.s ctw6 ctw4 dbf d5,ctw1 movem.l (a7)+,d1-d7/a0-a6 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.s 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). ;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. cancel tst.b fromfile beq.s cancel1 rts cancel1 clr.l remembr ;used for CLI stdio 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 ;d0=task cmp.b #1,8(a1) ;TASK ? bne.s isproc CALL RemTask,_SysBase(PC) rts isproc movem.l d0-d7/a0-a6,-(a7) move.l #-1,d0 ;needed for recursive killing tasks CALL AllocSignal,_SysBase(PC) clr.l d1 bset d0,d1 move.l d1,cancelbit move.l d0,cancelbnum movem.l (a7)+,d0-d7/a0-a6 clr.l d5 tst.l $ac(a1) ;pr_CLI beq.s wascreproc move.l $80(a1),a2 ;Seglist adda.l a2,a2 adda.l a2,a2 move.l 12(a2),d1 ;empty ? bne.s wascreproc move.l $ac(a1),a2 ;CommandLineInterface adda.l a2,a2 adda.l a2,a2 move.l 60(a2),d5 ;cli_Module tst.l 40(a2) ;IsInteractive beq dosreturn move.l 28(a2),remembr ;yes,get Cli-Window locks move.l 56(a2),remembr2 bra dosreturn wascreproc tst.b bool ;it is not a CLI, ask what to do bne.s unload move.b #3,bool move.l #canerr0,d0 ;ask for Workbench bsr putstr bsr readline ori.b #$20,dummy cmp.b #'y',dummy beq.s andagain move.b #2,bool move.l #canerr1,d0 ;ask for unload 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 ;test if the task still there unload move.l 128(a1),d4 ;get Segmentlist beq.s unl3 lsl.l #2,d4 move.l d4,a3 move.l 12(a3),d4 unl3 tst.l d4 bne.s unl4 move.l #unloaderr,d0 ;no Segments !? bra putnam unl4 cmp.b #3,bool ;Workbench Task bne.s unl2 move.l a1,-(a7) move.l #40,d0 ;build a copy of the move.l #$10000,d1 ;Worbench startup-message CALL AllocMem,_SysBase(PC) move.l d0,startmess move.l (a7)+,a1 move.l d0,a0 move.b #5,8(a0) move.w #20,18(a0) move.l d4,24(a0) move.l a1,d0 add.l #92,d0 move.l d0,20(a0) movem.l a0-a1,-(a7) lea wbname(PC),a1 CALL FindPort,_SysBase(PC) movem.l (a7)+,a0-a1 move.l d0,14(a0) unl2 cmp.b #1,bool bne.s dosreturn move.l a1,-(a7) ;unload process manualy move.l d4,d1 CALL UnLoadSeg,dosbase(PC) move.l (a7)+,a1 dosreturn move.l 140(a1),savedat ;Processnumber dosret1 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) ;if waiting bne.s doswait move.l a1,d4 CALL Remove,_SysBase(PC) move.l d4,a1 lea 406(a6),a0 ; activate the task CALL AddHead,_SysBase(PC) move.l d4,a1 doswait move.w #-$4000,$dff09a tst.b bool bne.s endnodos tst.l d5 beq endcanc move.l $ac(a1),a2 adda.l a2,a2 adda.l a2,a2 dwa1 movem.l d0-d7/a0-a6,-(a7) move.l cancelbit(PC),d0 CALL Wait,_SysBase(PC) movem.l (a7)+,d0-d7/a0-a6 clr.l d5 bra dosret1 endcanc move.l a1,-(a7) move.l remembr(PC),d1 ;close CLI-Window beq.s ecan1 ;if any CALL Close,dosbase(PC) ecan1 move.l remembr2(PC),d1 beq.s ecan2 CALL Close,dosbase(PC) ecan2 move.l (a7)+,a1 move.l savedat(PC),d0 ;remove Task from move.l dosbase(PC),a2 ;TaskArray move.l 34(a2),a2 move.l 0(a2),a2 adda.l a2,a2 adda.l a2,a2 lsl.l #2,d0 clr.l 0(a2,d0) endnodos move.l a1,d0 bsr closetskwin move.l cancelbnum(PC),d0 ;remove our Signal CALL FreeSignal,_SysBase(PC) rts ;This Code is (hopefully) excuted by the Process we want ;to kill endtask CALL Forbid,_SysBase(PC) CALL Disable,_SysBase(PC) move.l _SysBase(PC),a1 move.l 276(a1),a1 move.l 176(a1),a1 ;Process_ReturnAddr lea -4(a1),a7 ;reset Process Stackptr tst.b bool bne.s et0 movea.l mytask(PC),a1 move.l cancelbit(PC),d0 ;signal Xoper it CALL Signal,_SysBase(PC) ;died et0 cmp.b #3,bool ;Workbench Process ? bne.s et1 move.l startmess(PC),a1 CALL ReplyMsg,_SysBase(PC) ;reply startup message et1 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 move.l 18(a5),d0 and.l 26(a5),d0 beq.s wa2 movea.l a5,a1 CALL Signal,_SysBase(PC) wa2 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 SHAR_EOF # End of shell archive exit 0 -- Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page Have five nice days.