; FILE: Source:modules/NewAlert.ASM REV: 6 --- Display more info on Alert * * Modified by Harry Sintonen. * * 2.4.97 v2.0: removed self-modifying code. * 11.9.00 v2.1: slightly improved the code in general, added MMU aware * address zero clearing. * ; NewAlert - Shows the Taskname within an Alert ; © Jens Lorenz 1997 ; © Harry Sintonen 2000 ; ; very strongly based upon: ; ; Example BlizKick Module ; ~~~~~~~~~~~~~~~~~~~~~~~ ; This code shows how to create replacing BlizKick "Module". ; Should be quite self-explonary... (?) ; ; !CODE MUST BE FULLY PC-RELATIVE! ; ; Written by Harry Sintonen. ; This source code is Public Domain. incdir "include:" include "exec/execbase.i" include "exec/nodes.i" include "exec/tasks.i" include "exec/alerts.i" include "dos/dosextens.i" include "blizkickmodule.i" ; Some required... _LVOSupervisor EQU -$1E _LVORawDoFmt EQU -$20A _LVOOpenLibraryTagged EQU -$32A _LVOTimedDisplayAlert EQU -$336 _LVOCloseLibrary EQU -$19E SECTION MODULE,CODE _DUMMY_LABEL BK_MOD BKMF_ReplaceMode!BKMF_ExtResBuf,_end,(RTF_COLDSTART)<<24+39<<16+NT_UNKNOWN<<8+$C9,_name,_name,_init ; Replace mode on, requires EXTRESBUF buffer, COLDSTART module, requires KS V39.x or better, ; module type NT_UNKNOWN, priority -55. STACKBUF EQU 300 ; +100 - just to be safe ... ; IN: a6 = execbase dc.l 'NewA' ; magic ID (don't change or move!) _init bsr.w clear0 ; clear 0 longword (don't move! must be .w!) movem.l d2/d3/a2/a3/a6,-(sp) ; the movem must be at _init + 4 ! move.l LastAlert(a6),d2 moveq #-1,d0 ; Display no alert? sub.l a2,a2 ; return code = 0 cmp.l d0,d2 beq .exit lea -STACKBUF(sp),sp move.l sp,a3 ; default: 'Software Failure' lea SoftFail(pc),a0 move.l d2,d0 swap d0 cmp.b #(AG_NoMemory>>16),d0 bne.b .skip0 ; 'not enough memory' lea NoMem(pc),a0 bra.b .skip1 .skip0 tst.l d2 ; AT_DeadEnd set? bmi.b .skip1 tst.w d0 ; general purpose alert code defined? beq.b .skip1 ; 'Recoverable Alert' lea Recoverable(pc),a0 .skip1 bsr .dostr lea PressLeftie(pc),a0 bsr .dostr lea Copyright(pc),a0 bsr .dostr clr.b (a3)+ ; put x-pos upper lea ErrorFmt(pc),a0 lea LastAlert(a6),a1 lea .PutChar(pc),a2 jsr _LVORawDoFmt(a6) lea 37(a3),a3 ; Adjust a3 st (a3)+ * decode the TaskName / CLICommandName * lea NoTask(pc),a2 ; No Task move.l (LastAlert+4)(a6),d0 ; ^Task -> d0 beq .fmttaskname ; if 0 move.l d0,a0 ; Task/Process cmp.b #NT_TASK,LN_TYPE(a0) ; is it a task? beq.b .task ; no CLI-Checking needed ; ok, it's a process, check if it's a CLI too move.l pr_CLI(a0),d0 ; process.cli -> d0 beq.b .task ; no cli-struct -> get the Taskname subq.l #8,sp move.l pr_TaskNum(a0),(sp) ; store process.tasknum lsl.l #2,d0 ; d0 was a BPTR !!! move.l d0,a0 ; BADDR(process.cli) -> a0 move.l cli_CommandName(a0),d0 ; cli.commandname -> a0 beq.b .nocliname ; NULL name? hs move.l d0,4(sp) ; cli.commandname -> ArgArray lsl.l #2,d0 ; d0 was a BSTR move.l d0,a0 tst.b (a0) ; Length = 0 ? bne.b .fmtcliname ; -> got CommandName there .nocliname lea NoCLIName(pc),a0 ; get the errorstring move.l a0,d0 lsr.l #2,d0 ; -> BPTR move.l d0,4(sp) ; bra.b .fmtcliname * Format the CLICommandName + CLI-Number * .fmtcliname lea CLINameFmt(pc),a0 move.l sp,a1 lea .PutChar(pc),a2 jsr _LVORawDoFmt(a6) addq.l #8,sp bra.b .display ; display the alert * It's a task * .task lea NoTaskName(pc),a2 ; default: No TaskName move.l LN_NAME(a0),d0 ; tc.ln.name = NULL ? beq.b .fmttaskname move.l d0,a0 tst.b (a0) ; Len = 0 ? beq.b .fmttaskname move.l a0,a2 ; use the tc.ln.name * Format the TaskName * .fmttaskname lea TaskNameFmt(pc),a0 move.l a2,-(sp) ; a2 = ^TaskName move.l sp,a1 lea .PutChar(pc),a2 jsr _LVORawDoFmt(a6) addq.l #4,sp ; bra.b .display .display moveq #3,d0 ; 3=intuition.library jsr _LVOOpenLibraryTagged(a6) ; if this fails we're fucked anyway :-) move.l (LastAlert+3*4)(a6),a1 ; alert timeout move.l a6,a3 move.l d0,a6 move.l d2,d0 ; alert number move.l sp,a0 ; alert string moveq #70,d1 ; alert y-size jsr _LVOTimedDisplayAlert(a6) move.l d0,a2 move.l a6,a1 move.l a3,a6 jsr _LVOCloseLibrary(a6) lea STACKBUF(sp),sp bsr clear0 ; clear 0 longword moveq #-1,d0 ; No alert on next round, please! move.l d0,LastAlert(a6) .exit move.l a2,d0 movem.l (sp)+,d2/d3/a2/a3/a6 rts * Copy the whole String * .dostr clr.b (a3)+ .copy move.b (a0)+,(a3)+ bne.b .copy st (a3)+ rts * Copy one Char * .PutChar move.b d0,(a3)+ clr.b (a3) rts ; routine that makes sure the longword at position 0 is really set ; to zero. (Blizzard PPCs have MMU setup active at alert.hook time!) ; IN: a6 = execbase ; OUT: d1/a0/a1 trashed clear0 btst #3,$129(a6) ; do we have 68040 or 68060? beq.b .no040plus move.l a5,a0 lea .clrit(pc),a1 lea runnommu_s(pc),a5 jsr _LVOSupervisor(a6) move.l a0,a5 .no040plus .clrit clr.l (0).w rts ; IN: a1 = routine to run in supervisor, mmu disabled, end with rts ; d0/d2-d7/a0/a2-a4 = whatever you like ; a6 = execbase ; OUT: d1 = trashed ; d0/d2-d7/a0/a2-a4 = whatever you like ; runnommu_s ori.w #$700,sr movec tc,d1 move.l d1,-(sp) movec cacr,d1 move.l d1,-(sp) movec dtt1,d1 move.l d1,-(sp) movec dtt0,d1 move.l d1,-(sp) movec itt1,d1 move.l d1,-(sp) movec itt0,d1 move.l d1,-(sp) cpusha bc ;make sure the above is written cinva bc move.l #$00FFC000,d1 ;mark 32-bit: Cacheable, Writethrough movec d1,itt0 movec d1,itt1 movec d1,dtt1 move.l #$0000C040,d1 ;mark 24-bit-DMA: Cache-Inhibited, Precise Exception Model movec d1,dtt0 move.l #$80008000,d1 ;instcache + datacache movec d1,cacr moveq #0,d1 ;turn off possible MMU mapping pflusha movec d1,tc cpusha bc cinva bc jsr (a1) cpusha bc move.l (sp)+,d1 movec d1,itt0 move.l (sp)+,d1 movec d1,itt1 move.l (sp)+,d1 movec d1,dtt0 move.l (sp)+,d1 movec d1,dtt1 move.l (sp)+,d1 movec d1,cacr move.l (sp)+,d1 pflusha movec d1,tc cpusha bc cinva bc nop rte ************** Data ************** _name dc.b 'alert.hook',13,10,0 CNOP 0,4 ; we make BPTR of NoCLIName.. NoCLIName dc.b 18,'» No CommandName «',0 APOS1 MACRO IFNE ((\1)>>8) FAIL APOS1: x-position can't be >255 ! MEXIT ENDC dc.b ((\1)&$ff),(\2) ENDM APOS2 MACRO IFEQ ((\1)>>8) FAIL APOS2: x-position can't be <256 ! MEXIT ENDC dc.b ((\1)>>8),((\1)&$ff),(\2) ENDM NoMem APOS1 38,15 dc.b 'not enough memory.',0 SoftFail APOS1 38,15 dc.b 'Software Failure.',0 Recoverable APOS1 38,15 dc.b 'Recoverable Alert.',0 EBTrashed APOS1 38,15 dc.b 'ExecBase Trashed.',0 Copyright APOS1 38,60 dc.b '(NewAlert by Jens Lorenz 1997 & Harry Sintonen 2000)',0 PressLeftie APOS1 234,15 dc.b 'Press left mouse button to continue.',0 ErrorFmt APOS1 142,30 dc.b 'Error: %04x %04x Task: %08lx',0 TaskNameFmt APOS2 270,45 dc.b 'TaskName: %-35.35s',0 CLINameFmt APOS2 270,45 dc.b 'CLI #%-3.3ld: %-35.35b',0 NoTask dc.b '» No Task «',0 NoTaskName dc.b '» No TaskName «',0 CNOP 0,2 _end SECTION VERSION,DATA dc.b '$VER: alert.hook_MODULE 2.1 (11.9.00)',0