page@swan.ulowell.edu (Bob Page) (10/29/88)
Submitted-by: g35@dhdurz1.bitnet (Guenther Werner) Posting-number: Volume 2, Issue 36 Archive-name: kernel/xoper12.2 # This is a shell archive. Remove anything before this line # then unpack it by saving it in a file and typing "sh file" # (Files unpacked will be owned by you and have default permissions). # This archive contains the following files: # Xoper.a1 # if `test ! -s Xoper.a1` then echo "writing Xoper.a1" cat > Xoper.a1 << '\Rogue\Monster\' ****************************************** * * * Xoper 1.2 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. ;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 ;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) 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 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 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 '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 bra capture bra clrcold bra clrcool bra clrwarm bra snoop bra usage ;------ Task-Structures----- showaddr clr.b tasktyp bra.s startask showtask move.b #1,tasktyp startask 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 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 bsr prcent bsr newline move.l #infoh2,d0 bsr putstr move.l (a7)+,d0 neg.l d0 move.l d0,dispatches clr.l d3 bsr longdec move.l #27,d1 bsr tab move.l #infoh6,d0 bsr putstr move.l olddisp(PC),d0 bsr longdec bsr newline bsr newline 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 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 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 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 *-------- 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 *--------- 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),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 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 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 bra 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 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 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 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 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 bsr newline hu5 lea hunkheader(PC),a0 bsr puthead hu6 move.l d1,d0 bsr hexa lsl.l #2,d1 move.l d1,a4 move.l d1,d0 addq.l #4,d0 bsr hexa move.l -4(a4),d0 bsr hexa bsr newline move.l 0(a4),d1 bne.s hu6 rts ;change the priority of a node pri bsr getnum tst.b d7 beq syntax move.b d2,newpri bsr nodenam2 moveq.l #5,d7 lea DevNode(PC),a4 bsr findnam tst.b d7 beq.s pi1 move.l d0,a1 move.b newpri,9(a1) cmp.l #SemNode,a4 ble.s pi2 move.l #listerr,d0 bra putnam pi2 CALL Forbid,_SysBase(PC) CALL Remove,_SysBase(PC) move.l d0,a1 move.l a4,a0 move.l 0(a0),d6 lea 0(a6,d6),a0 CALL Enqueue,_SysBase(PC) CALL Permit,_SysBase(PC) pi1 rts ;set all break signals of a task break move.l #$f000,d0 bra setthem signal bsr readhex tst.b d7 beq syntax setthem move.l d0,savedat bsr nodenam moveq.l #2,d7 lea TReNode(PC),a4 bsr findnam tst.b d7 beq.s pi1 move.l d0,a1 move.l savedat,d0 and.l 18(a1),d0 CALL Signal,_SysBase(PC) rts ;'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 capture move.l _SysBase(PC),a1 lea 42(a1),a0 moveq #2,d6 lea coldtxt,a4 cap0 move.l a4,d0 bsr putstr move.l 0(a0),d0 bne.s cap1 move.l #unset,d0 bsr putstr bra cap2 cap1 bsr hexa cap2 bsr newline lea 15(a4),a4 lea 4(a0),a0 dbf d6,cap0 move.l #kicktxt,d0 bsr putstr move.l 546(a1),a0 cmpa.l #0,a0 bne.s kickm3 move.l #unset,d0 bra putnam kickm3 move.l a0,-(a7) bsr newline lea kickhead(PC),a0 bsr puthead move.l (a7)+,a0 kickm0 cmpa.l #0,a0 bne.s kickm1 rts kickm1 move.w 14(a0),d6 subq #1,d6 lea 16(a0),a2 kickm2 move.l 0(a2),d0 bsr hexa move.l 0(a2),d0 move.l 4(a2),d4 add.l d4,d0 bsr hexa move.l d4,d0 clr.b d3 bsr longdec bsr newline lea 8(a2),a2 dbf d6,kickm2 move.l 0(a0),a0 bra kickm0 rts clrcold move.l _SysBase,a0 clr.l 42(a0) bra.s chksum clrcool move.l _SysBase,a0 clr.l 46(a0) bra.s chksum clrwarm move.l _SysBase,a0 clr.l 50(a0) chksum lea 34(a0),a1 move #22,d0 addchk add (a1)+,d1 dbf d0,addchk not d1 move.w d1,82(a0) rts ;display ExecBase->LastAlert lastalert movem.l $100,d1-d2 tst.l d1 bne.s al1 move.l _SysBase(PC),a0 movem.l 514(a0),d1-d2 bra.s al1 alert movem.l $100,d1-d2 cmp.l #'HELP',0 beq.s al1 move.l #noguru,d0 bra putnam al1 move.l #gurutxt,d0 bsr putstr move.l d1,d0 bsr hex8 lea out,a0 move.l ptr(PC),d0 move.b #'.',-1(a0,d0) move.l d2,d0 bsr hex8 bra newline ;toggle '<MORE>' on/off moretst bchg #0,morefl rts ;toggle CPUSE task list usage bchg #0,usageflag 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 \Rogue\Monster\ else echo "will not over write Xoper.a1" fi if [ `wc -c Xoper.a1 | awk '{printf $1}'` -ne 54718 ] then echo `wc -c Xoper.a1 | awk '{print "Got " $1 ", Expected " 54718}'` fi echo "Finished archive 2 of 2" # if you want to concatenate archives, remove anything after this line exit -- Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page Have five nice days.