>


visita il sito del nostro sponsor





DisplayAlert




Il presente articolo č stato scritto pių di un decennio fa, pių che altro come memorandum sull'uso della funzione di Intuition DisplayAlert, č rivolto a chi possiede un minimo di conoscenze di programmazione Assembly68K.


Una delle piu' grandi difficoltà nell'usare la routine DisplayAlert di Intuition sta nel formattare correttamente il testo da visualizzare, ora cercherò di spiegare una volta per tutte ed in modo chiaro come si deve procedere. La routine DisplayAlert è un pò curiosa, poichè distrugge in modo irresponsabile il contenuto dei registri A0/A5, quindi quando la si chiama spesso il computer va in Software Failure senza una causa apparente, ho dovuto faticare parecchio per capire la fonte del BUG nel mio programma. Una volta compreso ciò , studiando attentamente il contenuto dei regitri mostrati dal MasterSeka 1.51, ho modificato il mio programma risolvendo il BUG. Prima l'indirizzo di Intuition era posto in A5, purtroppo distrutto dalla DisplayAlert, ma poi ho visto che ,anche in altri listati esterni, il registri A6 era sempre incolume, quindi ho usato A6 per contenere l'indirizzo di Intuition. Vedi programma qui riportato :


; *************************************************************
; *** Acqua nel Drive V0.2 Date 9-Jan-1992 ***
; *** Francesco De Napoli 1992 © Production for U.A.A. ***
; *** Modulo : Guru Meditation Version 0.35 ***
; *************************************************************

GURU: move.l 4,A6 <---- Notare A6 contiene ExecBase
lea Intname(pc),A1
jsr -$0198(A6)
move.l D0,IntBase
beq Exit
GAgain: move.l IntBase,A6 <---- Notare A6 contiene IntuitionBase
lea GuruMSG(pc),A0 <---- Indirizzo del Messaggio
move.l #0,D0 <---- Alert Numer : Vedi tabella 1
move.l #100,D1 <---- Altezza in Pixel della Window
jsr -$005A(A6) <---- Notare A6 contiene IntuitioBase
tst.l d0
bne Exit ; User had selected YES
bra Gagain ; User had selected No
exit: rts

Intname: dc.b 'intuition.library',0
align 4
IntBase: dc.l 0
align 4



-----------------------------------------
| Tabella 1 : Alerts' code |
|-----------------------------------------|
| ALERT_TYPE equ $80000000 |
| RECOVERY_ALERT equ $00000000 |
| DEADEND_ALERT equ $80000000 |
-----------------------------------------




Veniamo ora al punto cruciale di questa trattazione, ovvero alla
FORMATTAZIONE del testo da visualizzare nella guru. Il messaggio da inviare alla DisplayAlert ha una caratteristica molto importante, ma che a volte crea dei problemi se non si conosce a pieno la DisplayAlert, e cioè prima dell'invio della frase bisogna inviare le coordinate dove questa dovrà essere stampata, esempio:


GuruMSG:    dc.w    $0020   ; Word X position
dc.b $14 ; Byte Y position
dc.b ' Hardware Faliure !!! Do Not Panic !!!'




Come si potrà ben vedere già dalla prima dc.x si nota qualcosa di anomalo, la dc.w contiene, ovviamente una WORD, il numero $0020 che in decimale è
32, ed esso rappresenta la coordinata X del primo PIXEL della frase, come certamete si saprà lo schermo non interalacciato di Amiga ha le seguenti risoluzioni (almeno in Italia) : 320x256, 640x256, quindi con un solo Byte non è possibile specificare una posizione piu' a destra di 256 pixel, perciò i progettisti di Amiga hanno deciso di usare ben due Bytes, e cioè una Word, per specificare tale informazione. Qualcuno potrebbe obbiettare che un sol byte è più che sufficiente basterebbe far cominciare il messaggio con tanti <SPACES> quanti sono necessari a portare il NOSTRO messaggio nella sua corretta posizione. Veniamo, quindi, alla seconda istruzione dc.x, questa volta si tratta di una dc.b, cioè di un solo Bytes, che contiene la coordinata Y del primo PIXEL della frase, sta volta un solo byte è sufficiente a coprire l'intero range : 0 < Y < 256. Subito dopo nell'esempio troviamo l'istruzione dc.b nella quale è memorizzata la nostra frase da passare alla DisplayAlert. Spesso una sola riga non è sufficiente a contenere tutte le informazioni che desideriamo vengano passate all'utente, quindi bisogna usare più righe, ma per ogni riga bisogna passare le coordinate X e Y del primo PIXEL, per fare ciò basta ricorrere alle istruzioni sopra già viste : dc.w $XXXX & dc.b $YY, l'importante è che l'ultima frase da visualizzare termini con una Longword nulla, ovvero dc.l $00000000, che dirà alla Displayalert che il NOSTRO messaggio è terminato.


N.B. L'Amiga è una macchina ad indirizzamenti PARI, cioè LONGWORD e non
BYTE, per evitare un errore di indirizzamento, causato dal puntamento ad una locazione di memoria con indirizzo DISPARI, è necessario allineare la frase precedente, ma non è sufficiente la DIRETTIVA del SEKA : Align 4 per fare ciò, ma bisogna procedere manualmente a tentoni inserendo <SPACES> al termine della frase o facendo uso delle due istruzioni seguenti:



                         dc.b  0
dc.b 1




Vedi l'esempio qui riportato :



GuruMSG:    dc.w    $0020   ; Word X position
dc.b $14 ; Byte Y position
dc.b ' Hardware Faliure !!! Do Not Panic !!!'
dc.b 0 <---- Notare l' ALLINEAMENTO
dc.b 1 <---- Notare l' ALLINEAMENTO
dc.w $0020 ; Word X position
dc.b $1e ; Word Y position
dc.b ' In your Drive DF0: there is something of
strange !?!'
dc.b 0 <---- Notare l' ALLINEAMENTO
dc.b 1 <---- Notare l' ALLINEAMENTO
dc.w $00C8 ; Word X position
dc.b $32 ; Byte Y position
dc.b ' May I analyze IT ?'
dc.b 0 <---- Notare l' ALLINEAMENTO
dc.b 1 <---- Notare l' ALLINEAMENTO
dc.w $0080 ; Word X position
dc.b $4c ; Byte Y position
dc.b ' Left = Yes Right = NO'
dc.l 0 <---- Notare la Longword Nulla





Prima di congedarmi non mi resta che spiegare la differenza che intercorre tra una Recovery_Alert ed una Deadend_Alert. La Deadend_Alert è una visualizzazione disperata, ovvero è usata dal sistema operativo quando l'errore, che si è verificato in uno dei suoi moduli, è fatale per l'integrità del sistema operativo stesso; queste guru si concludono sempre con un completo reset della macchina, e sono facilmente identificabili poichè appaiono rosse (sia su O.S. 1.3 e sia su O.S. 2.0), su schermo completamente nero. Se invochiamo tale Alert nel nostro programma qualsiasi sia la scelta effettuata dall'utente (Left or Right Mouse Button) il sistema si resetterà irrimediabilmente! La Recovery_Alert è una visualizzazione non distruttiva, essa è spesso usata dal sistema operativo in luogo dei System Requester quando non vi è sufficiente memoria per la loro visualizzazione. Sono facilmente riconoscibili dalle precedenti in quanto abbassano soltanto il quadro dell'applicazione in esecuzione e visualizzano su O.S. 1.3 un messaggio rosso, mentre su O.S. 2.0 un messaggio verde e giallo sui successivi, inoltre di solito l'ultima riga del messaggio invita l'utente a premere uno dei due tasti del mouse a seconda della scelta da effettuare. Il registro dati D0, dopo una Recovery_Alert, conterrà il valore 0 se si è premuto il bottone destro altrimenti un valore non nullo, quindi spetta al programmatore il compito di creare un controllo su tale registro per vedere quale scelta ha fatto l'utente, per avere un'idea di come si possa fare tale controllo basta guardare il listato. Per questa volta è tutto.


Francesco De Napoli




visita il sito del nostro sponsor