home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti4 / lezione8a.s < prev    next >
Text File  |  1995-11-13  |  14KB  |  416 lines

  1.  
  2. ; Lezione8a.s - La startup universale, per studiare i canali DMA
  3.  
  4. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  5.  
  6.         ;5432109876543210
  7. DMASET    EQU    %1000001110000000    ; copper e bitplane DMA abilitati
  8. ;         -----a-bcdefghij
  9.  
  10. ;    a: Blitter Nasty   (Per ora non ci interessa, lasciamolo a zero)
  11. ;    b: Bitplane DMA       (Se non e' settato, spariscono anche gli sprite)
  12. ;    c: Copper DMA       (Azzerandolo non e' eseguita nemmeno la copperlist)
  13. ;    d: Blitter DMA       (Per ora non ci interessa, azzeriamolo)
  14. ;    e: Sprite DMA       (Azzerandolo spariscono solo gli 8 sprite)
  15. ;    f: Disk DMA       (Per ora non ci interessa, azzeriamolo)
  16. ;    g-j: Audio 3-0 DMA (Azzeriamo lasciando muto l'Amiga)
  17.  
  18. ******************************************************************************
  19. ;    680X0 & AGA STARTUP BY FABIO CIUCCI - Livello di complessita' 1
  20. ******************************************************************************
  21.  
  22. MAINCODE:
  23.     movem.l    d0-d7/a0-a6,-(SP)    ; Salva i registri nello stack
  24.     move.l    4.w,a6            ; ExecBase in a6
  25.     LEA    GfxName(PC),A1        ; Nome libreria da aprire
  26.     JSR    -$198(A6)        ; OldOpenLibrary - apri la lib
  27.     MOVE.L    d0,GFXBASE        ; Salva il GfxBase in una label
  28.     BEQ.w    EXIT2            ; Se si, esci senza eseguire il codice
  29.     LEA    IntuiName(PC),A1    ; Intuition.lib
  30.     JSR    -$198(A6)        ; Openlib
  31.     MOVE.L    D0,IntuiBase
  32.     BEQ.w    EXIT1            ; Se zero, esci! Errore!
  33.  
  34.     MOVE.L    IntuiBase(PC),A0
  35.     CMP.W    #39,$14(A0)    ; versione 39 o maggiore? (kick3.0+)
  36.     BLT.s    VecchiaIntui
  37.     BSR.w    ResettaSpritesV39
  38. VecchiaIntui:
  39.  
  40.     MOVE.L    GfxBase(PC),A6
  41.     MOVE.L    $22(A6),WBVIEW    ; Salva il WBView attuale di sistema
  42.  
  43.     SUBA.L    A1,A1        ; View nullo per azzerare il modo video
  44.     JSR    -$DE(A6)    ; LoadView nullo - modo video azzerato
  45.     SUBA.L    A1,A1        ; View nullo
  46.     JSR    -$DE(A6)    ; LoadView (due volte per sicurezza...)
  47.     JSR    -$10E(A6)    ; WaitOf ( Queste due chiamate a WaitOf    )
  48.     JSR    -$10E(A6)    ; WaitOf ( servono a resettare l'interlace )
  49.     JSR    -$10E(A6)    ; Altre due, vah!
  50.     JSR    -$10E(A6)
  51.  
  52.     MOVEA.L    4.w,A6
  53.     SUBA.L    A1,A1        ; NULL task - trova questo task
  54.     JSR    -$126(A6)    ; findtask (d0=task, FindTask(name) in a1)
  55.     MOVEA.L    D0,A1        ; Task in a1
  56.     MOVEQ    #127,D0        ; Priorita' in d0 (-128, +127) - MASSIMA!
  57.     JSR    -$12C(A6)    ;_LVOSetTaskPri (d0=priorita', a1=task)
  58.  
  59.     MOVE.L    GfxBase(PC),A6
  60.     jsr    -$1c8(a6)    ; OwnBlitter, che ci da l'esclusiva sul blitter
  61.                 ; impedendone l'uso al sistema operativo.
  62.     jsr    -$E4(A6)    ; WaitBlit - Attende la fine di ogni blittata
  63.     JSR    -$E4(A6)    ; WaitBlit
  64.  
  65.     move.l    4.w,a6        ; ExecBase in A6
  66.     JSR    -$84(a6)    ; FORBID - Disabilita il Multitasking
  67.     JSR    -$78(A6)    ; DISABLE - Disabilita anche gli interrupt
  68.                 ;        del sistema operativo
  69.  
  70.     bsr.w    HEAVYINIT    ; Ora puoi eseguire la parte che opera
  71.                 ; sui registri hardware
  72.  
  73.     move.l    4.w,a6        ; ExecBase in A6
  74.     JSR    -$7E(A6)    ; ENABLE - Abilita System Interrupts
  75.     JSR    -$8A(A6)    ; PERMIT - Abilita il multitasking
  76.  
  77.     SUBA.L    A1,A1        ; NULL task - trova questo task
  78.     JSR    -$126(A6)    ; findtask (d0=task, FindTask(name) in a1)
  79.     MOVEA.L    D0,A1        ; Task in a1
  80.     MOVEQ    #0,D0        ; Priorita' in d0 (-128, +127) - NORMALE
  81.     JSR    -$12C(A6)    ;_LVOSetTaskPri (d0=priorita', a1=task)
  82.  
  83.     MOVE.W    #$8040,$DFF096    ; abilita blit
  84.     BTST.b    #6,$dff002    ; WaitBlit...
  85. Wblittez:
  86.     BTST.b    #6,$dff002
  87.     BNE.S    Wblittez
  88.  
  89.     MOVE.L    GFXBASE(PC),A6    ; GFXBASE in A6
  90.     jsr    -$E4(A6)    ; Aspetta la fine di eventuali blittate
  91.     JSR    -$E4(A6)    ; WaitBlit
  92.     jsr    -$1ce(a6)    ; DisOwnBlitter, il sistema operativo ora
  93.                 ; puo' nuovamente usare il blitter
  94.     MOVE.L    IntuiBase(PC),A0
  95.     CMP.W    #39,$14(A0)    ; V39+?
  96.     BLT.s    Vecchissima
  97.     BSR.w    RimettiSprites
  98. Vecchissima:
  99.  
  100.     MOVE.L    GFXBASE(PC),A6    ; GFXBASE in A6
  101.     MOVE.L    $26(a6),$dff080    ; COP1LC - Punta la vecchia copper1 di sistema
  102.     MOVE.L    $32(a6),$dff084    ; COP2LC - Punta la vecchia copper2 di sistema
  103.     JSR    -$10E(A6)    ; WaitOf ( Risistema l'eventuale interlace)
  104.     JSR    -$10E(A6)    ; WaitOf
  105.     MOVE.L    WBVIEW(PC),A1    ; Vecchio WBVIEW in A1
  106.     JSR    -$DE(A6)    ; loadview - rimetti il vecchio View
  107.     JSR    -$10E(A6)    ; WaitOf ( Risistema l'eventuale interlace)
  108.     JSR    -$10E(A6)    ; WaitOf
  109.     MOVE.W    #$11,$DFF10C    ; Questo non lo ripristina da solo..!
  110.     MOVE.L    $26(a6),$dff080    ; COP1LC - Punta la vecchia copper1 di sistema
  111.     MOVE.L    $32(a6),$dff084    ; COP2LC - Punta la vecchia copper2 di sistema
  112.     moveq    #100,d7
  113. RipuntLoop:
  114.     MOVE.L    $26(a6),$dff080    ; COP1LC - Punta la vecchia copper1 di sistema
  115.     move.w    d0,$dff088
  116.     dbra    d7,RipuntLoop    ; Per sicurezza...
  117.  
  118.     MOVEA.L    IntuiBase(PC),A6
  119.     JSR    -$186(A6)    ; _LVORethinkDisplay - Ridisegna tutto il
  120.                 ; display, comprese ViewPorts e eventuali
  121.                 ; modi interlace o multisync.
  122.     MOVE.L    a6,A1        ; IntuiBase in a1 per chiudere la libreria
  123.     move.l    4.w,a6        ; ExecBase in A6
  124.     jsr    -$19E(a6)    ; CloseLibrary - intuition.library CHIUSA
  125. Exit1:
  126.     MOVE.L    GfxBase(PC),A1    ; GfxBase in a1 per chiudere la libreria
  127.     jsr    -$19E(a6)    ; CloseLibrary - graphics.library CHIUSA
  128. Exit2:
  129.     movem.l    (SP)+,d0-d7/a0-a6 ; Riprendi i vecchi valori dei registri
  130.     RTS              ; Torna all'ASMONE o al Dos/WorkBench
  131.  
  132. *******************************************************************************
  133. ;    Resetta la risoluzione degli sprite "legalmente"
  134. *******************************************************************************
  135.  
  136. ResettaSpritesV39:
  137.     LEA    Workbench(PC),A0 ; Nome schermo del Workbench in a0
  138.     MOVE.L    IntuiBase(PC),A6
  139.     JSR    -$1FE(A6)    ; _LVOLockPubScreen - "blocchiamo" lo schermo
  140.                 ; (il cui nome e' in a0).
  141.     MOVE.L    D0,SchermoWBLocckato
  142.     BEQ.s    ErroreSchermo
  143.     MOVE.L    D0,A0        ; Struttura Screen in a0
  144.     MOVE.L    $30(A0),A0    ; sc_ViewPort+vp_ColorMap: in a0 ora abbiamo
  145.                 ; la struttura ColorMap dell schermo, che ci
  146.                 ; serve (in a0) per eseguire un "video_control"
  147.                 ; della graphics.library.
  148.     LEA    GETVidCtrlTags(PC),A1    ; In a1 la TagList per la routine
  149.                     ; "Video_control" - la richiesta che
  150.                     ; facciamo a questa routine e' di
  151.                     ; VTAG_SPRITERESN_GET, ossia di sapere
  152.                     ; la risoluzione attuale degli sprite.
  153.     MOVE.L    GfxBase(PC),A6
  154.     JSR    -$2C4(A6)    ; Video_Control (in a0 la cm e in a1 i tags)
  155.                 ; riporta nella taglist, nella long
  156.                 ; "risoluzione", la risoluzione attuale degli
  157.                 ; sprite in quello schermo.
  158.  
  159. ; Ora chiediamo alla routine VideoControl di settare la risoluzione.
  160. ; SPRITERESN_140NS -> ossia lowres!
  161.  
  162.     MOVE.L    SchermoWBLocckato(PC),A0
  163.     MOVE.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  164.     LEA    SETVidCtrlTags(PC),A1    ; TagList che resetta gli sprite.
  165.     MOVE.L    GfxBase(PC),A6
  166.     JSR    -$2C4(A6)    ; video_control... resetta gli sprite!
  167.  
  168. ; Ora resettiamo anche l'eventuale schermo "in primo piano", ad esempio la
  169. ; schermata dell'assemblatore:
  170.  
  171.     MOVE.L    IntuiBase(PC),A6
  172.     move.l    $3c(a6),a0    ; Ib_FirstScreen (Schermo in "primo piano!")
  173.     MOVE.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  174.     LEA    GETVidCtrlTags2(PC),A1    ; In a1 la TagList GET
  175.     MOVE.L    GfxBase(PC),A6
  176.     JSR    -$2C4(A6)    ; Video_Control (in a0 la cm e in a1 i tags)
  177.  
  178.     MOVEA.L    IntuiBase(PC),A6
  179.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  180.                 ; primo piano (ad es. ASMONE)
  181.     MOVEA.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  182.     LEA    SETVidCtrlTags(PC),A1    ; TagList che resetta gli sprite.
  183.     MOVEA.L    GfxBase(PC),A6
  184.     JSR    -$2C4(A6)    ; video_control... resetta gli sprite!
  185.  
  186.     MOVEA.L    SchermoWBLocckato(PC),A0
  187.     MOVEA.L    IntuiBase(PC),A6
  188.     JSR    -$17A(A6)    ; _LVOMakeScreen - occorre rifare lo schermo
  189.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  190.                 ; primo piano (ad es. ASMONE)
  191.     JSR    -$17A(A6)    ; _LVOMakeScreen - occorre rifare lo schermo
  192.                 ; per essere sicuri del reset: ossia occorre
  193.                 ; chiamare MakeScreen, seguito da...
  194.     JSR    -$186(A6)    ; _LVORethinkDisplay - che ridisegna tutto il
  195.                 ; display, comprese ViewPorts e eventuali
  196. ErroreSchermo:            ; modi interlace o multisync.
  197.     RTS
  198.  
  199. ; Ora dobbiamo risettare gli sprites alla risoluzione di partenza.
  200.  
  201. RimettiSprites:
  202.     MOVE.L    SchermoWBLocckato(PC),D0 ; Indirizzo strutt. Screen
  203.     BEQ.S    NonAvevaFunzionato     ; Se = 0, allora peccato...
  204.     MOVE.L    D0,A0
  205.     MOVE.L    OldRisoluzione(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
  206.     LEA    SETOldVidCtrlTags(PC),A1
  207.     MOVE.L    $30(A0),A0    ; Struttura ColorMap dello screen
  208.     MOVE.L    GfxBase(PC),A6
  209.     JSR    -$2C4(A6)    ; _LVOVideoControl - Risetta la risoluzione
  210.  
  211. ; Ora dello schermo in primo piano (eventuale)...
  212.  
  213.     MOVE.L    IntuiBase(PC),A6
  214.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  215.                 ; primo piano (ad es. ASMONE)
  216.     MOVE.L    OldRisoluzioneP(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
  217.     LEA    SETOldVidCtrlTags(PC),A1
  218.     MOVE.L    $30(A0),A0    ; Struttura ColorMap dello screen
  219.     MOVE.L    GfxBase(PC),A6
  220.     JSR    -$2C4(A6)    ; _LVOVideoControl - Risetta la risoluzione
  221.  
  222.     MOVEA.L    SchermoWBLocckato(PC),A0
  223.     MOVEA.L    IntuiBase(PC),A6
  224.     JSR    -$17A(A6)    ; RethinkDisplay - "ripensiamo" il display
  225.     move.l    $3c(a6),a0    ; Ib_FirstScreen - schermo in primo piano
  226.     JSR    -$17A(A6)    ; RethinkDisplay - "ripensiamo" il display
  227.     MOVE.L    SchermoWBLocckato(PC),A1
  228.     SUB.L    A0,A0        ; null
  229.     MOVEA.L    IntuiBase(PC),A6
  230.     JSR    -$204(A6)    ; _LVOUnlockPubScreen - e "sblocchiamo" lo
  231. NonAvevaFunzionato:        ; screen del workbench.
  232.     RTS
  233.  
  234. SchermoWBLocckato:
  235.     dc.l    0
  236.  
  237. ; Questa e' la struttura per usare Video_Control. La prima long serve per
  238. ; CAMBIARE (SET) la risoluzione degli sprite o per sapere (GET) quella vecchia.
  239.  
  240. GETVidCtrlTags:
  241.     dc.l    $80000032    ; GET
  242. OldRisoluzione:
  243.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  244.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  245.  
  246. GETVidCtrlTags2:
  247.     dc.l    $80000032    ; GET
  248. OldRisoluzioneP:
  249.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  250.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  251.  
  252. SETVidCtrlTags:
  253.     dc.l    $80000031    ; SET
  254.     dc.l    1    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  255.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  256.  
  257. SETOldVidCtrlTags:
  258.     dc.l    $80000031    ; SET
  259. OldRisoluzione2:
  260.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  261.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  262.  
  263. ; Nome schermo del WorkBench
  264.  
  265. Workbench:
  266.     dc.b    'Workbench',0
  267.  
  268. ******************************************************************************
  269. ;    Da qua in avanti si puo' operare sull'hardware in modo diretto
  270. ******************************************************************************
  271.  
  272. HEAVYINIT:
  273.     LEA    $DFF000,A5        ; Base dei registri CUSTOM per Offsets
  274.     MOVE.W    $2(A5),OLDDMA        ; Salva il vecchio status di DMACON
  275.     MOVE.W    $1C(A5),OLDINTENA    ; Salva il vecchio status di INTENA
  276.     MOVE.W    $10(A5),OLDADKCON    ; Salva il vecchio status di ADKCON
  277.     MOVE.W    $1E(A5),OLDINTREQ    ; Salva il vecchio status di INTREQ
  278.     MOVE.L    #$80008000,d0        ; Prepara la maschera dei bit alti
  279.                     ; da settare nelle word dove sono
  280.                     ; stati salvati i registri
  281.     OR.L    d0,OLDDMA    ; Setta il bit 15 di tutti i valori salvati
  282.     OR.L    d0,OLDADKCON    ; dei registri hardware, indispensabile per
  283.                 ; rimettere tali valori nei registri.
  284.  
  285.     MOVE.L    #$7FFF7FFF,$9A(a5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  286.     MOVE.L    #0,$144(A5)        ; SPR0DAT - ammazza il puntatore!
  287.     MOVE.W    #$7FFF,$96(a5)        ; DISABILITA I DMA
  288.  
  289.     bsr.s    START            ; Esegui il programma.
  290.  
  291.     LEA    $dff000,a5        ; Custom base per offsets
  292.     MOVE.W    #$7FFF,$96(A5)        ; DISABILITA TUTTI I DMA
  293.     MOVE.L    #$7FFF7FFF,$9A(A5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  294.     MOVE.W    #$7fff,$9E(a5)        ; Disabilita i bit di ADKCON
  295.     MOVE.W    OLDADKCON(PC),$9E(A5)    ; ADKCON 
  296.     MOVE.W    OLDDMA(PC),$96(A5)    ; Rimetti il vecchio status DMA
  297.     MOVE.W    OLDINTENA(PC),$9A(A5)    ; INTENA STATUS
  298.     MOVE.W    OLDINTREQ(PC),$9C(A5)    ; INTREQ
  299.     RTS
  300.  
  301. ;    Dati salvati dalla startup
  302.  
  303. WBVIEW:            ; Indirizzo del View del WorkBench
  304.     DC.L    0
  305. GfxName:
  306.     dc.b    'graphics.library',0,0
  307. IntuiName:
  308.     dc.b    'intuition.library',0
  309.  
  310. GfxBase:        ; Puntatore alla Base della Graphics Library
  311.     dc.l    0
  312. IntuiBase:        ; Puntatore alla Base della Intuition Library
  313.     dc.l    0
  314. OLDDMA:            ; Vecchio status DMACON
  315.     dc.w    0
  316. OLDINTENA:        ; Vecchio status INTENA
  317.     dc.w    0
  318. OLDADKCON:        ; Vecchio status ADKCON
  319.     DC.W    0
  320. OLDINTREQ:        ; Vecchio status INTREQ
  321.     DC.W    0
  322.  
  323. START:
  324. ;     PUNTIAMO IL NOSTRO BITPLANE
  325.  
  326.     MOVE.L    #BITPLANE,d0
  327.     LEA    BPLPOINTERS,A1
  328.     move.w    d0,6(a1)
  329.     swap    d0
  330.     move.w    d0,2(a1)
  331.  
  332.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane e copper
  333.  
  334.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  335.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  336.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  337.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  338.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  339.  
  340. mouse:
  341.     btst    #6,$bfe001
  342.     bne.s    mouse
  343.     rts
  344.  
  345.  
  346.     Section    CopProva,data_C
  347.  
  348. COPPERLIST:
  349.     dc.w    $8E,$2c81    ; DiwStrt
  350.     dc.w    $90,$2cc1    ; DiwStop
  351.     dc.w    $92,$0038    ; DdfStart
  352.     dc.w    $94,$00d0    ; DdfStop
  353.     dc.w    $102,0        ; BplCon1
  354.     dc.w    $104,0        ; BplCon2
  355.     dc.w    $108,0        ; Bpl1Mod
  356.     dc.w    $10a,0        ; Bpl2Mod
  357.             ; 5432109876543210
  358.     dc.w    $100,%0001001000000000    ; 1 bitplane LOWRES 320x256
  359.  
  360. BPLPOINTERS:
  361.     dc.w $e0,0,$e2,0    ;primo     bitplane
  362.  
  363.     dc.w    $0180,$000    ; color0 - SFONDO
  364.     dc.w    $0182,$19a    ; color1 - SCRITTE
  365.  
  366. ;    Sfumatura copperlist
  367.  
  368.     dc.w    $5007,$fffe    ; WAIT linea $50
  369.     dc.w    $180,$001    ; color0
  370.     dc.w    $5207,$fffe    ; WAIT linea $52
  371.     dc.w    $180,$002    ; color0
  372.     dc.w    $5407,$fffe    ; WAIT linea $54
  373.     dc.w    $180,$003    ; color0
  374.     dc.w    $5607,$fffe    ; WAIT linea $56
  375.     dc.w    $180,$004    ; color0
  376.     dc.w    $5807,$fffe    ; WAIT linea $58
  377.     dc.w    $180,$005    ; color0
  378.     dc.w    $5a07,$fffe    ; WAIT linea $5a
  379.     dc.w    $180,$006    ; color0
  380.     dc.w    $5c07,$fffe    ; WAIT linea $5c
  381.     dc.w    $180,$007    ; color0
  382.     dc.w    $5e07,$fffe    ; WAIT linea $5e
  383.     dc.w    $180,$008    ; color0
  384.     dc.w    $6007,$fffe    ; WAIT linea $60
  385.     dc.w    $180,$009    ; color0
  386.     dc.w    $6207,$fffe    ; WAIT linea $62
  387.     dc.w    $180,$00a    ; color0
  388.  
  389.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  390.  
  391. ;    Con il comando dcb facciamo un disegno a caso per il bitplane
  392.  
  393. BITPLANE:
  394.     dcb.l    10240/4,$FF00FF00
  395.  
  396.     end
  397.  
  398. Ci sono due particolari che non figurano nella lezione: il primo e' che c'e'
  399. una routine che resetta il modo video degli sprite, in caso il kickstart sia
  400. il 3.0 o superiore.
  401. Il secondo particolare e' che e' stata aggiunta una istruzione a quelle
  402. presenti per disabilitare l'AGA:
  403.  
  404.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  405.  
  406. In realta' anche questa istruzione e' quasi superflua, perche' quasi mai e'
  407. fuori posto, ma anche qua la sicurezza non deve essere trascurata.
  408.  
  409. Provate a spegnere i canali dma dei bitplane e del copper, uno ad uno.
  410. Noterete che spegnendo solo il canale dei bitplane sparisce il disegno
  411. a barre, disabilitando il copper sparisce pure la sfumatura.
  412. Provate anche a disattivare solo il bit 9, l'interruttore generale, e vedrete
  413. che anche se gli atri bit sono attivati si spegne tutto.
  414. Inutile provare ad azzerare il bit 15!
  415.  
  416.