home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti3 / lezione7v2.s < prev    next >
Text File  |  1995-09-29  |  14KB  |  530 lines

  1.  
  2. ; lezione7v2.s  -  Sprite nel Dual Playfield mode
  3. ; In questo esempio mostriamo i vari livelli di priorita` per gli sprite
  4. ; rispetto ai 2 playfield. Gli sprite si muovono dall'alto in basso.
  5. ; Ogni volta che raggiungono il bordo inferiore ripartono dall'alto con un
  6. ; diverso livello di priorita`. Attendere la fine del programma.
  7.  
  8.     SECTION    CiriCop,CODE
  9.  
  10. Inizio:
  11.     move.l    4.w,a6        ; Execbase
  12.     jsr    -$78(a6)    ; Disable
  13.     lea    GfxName(PC),a1    ; Nome lib
  14.     jsr    -$198(a6)    ; OpenLibrary
  15.     move.l    d0,GfxBase
  16.     move.l    d0,a6
  17.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  18.  
  19. ;    Puntiamo le PIC
  20.  
  21.     MOVE.L    #PIC1,d0    ; puntiamo il playfield 1
  22.     LEA    BPLPOINTERS1,A1
  23.     MOVEQ    #3-1,D1
  24. POINTBP:
  25.     move.w    d0,6(a1)
  26.     swap    d0
  27.     move.w    d0,2(a1)
  28.     swap    d0
  29.     ADD.L    #40*256,d0
  30.     addq.w    #8,a1
  31.     dbra    d1,POINTBP
  32.  
  33.     MOVE.L    #PIC2,d0    ; puntiamo il playfield 2
  34.     LEA    BPLPOINTERS2,A1
  35.     MOVEQ    #3-1,D1
  36. POINTBP2:
  37.     move.w    d0,6(a1)
  38.     swap    d0
  39.     move.w    d0,2(a1)
  40.     swap    d0
  41.     ADD.L    #40*256,d0
  42.     addq.w    #8,a1
  43.     dbra    d1,POINTBP2
  44.  
  45. ;    Puntiamo gli sprite
  46.  
  47.     MOVE.L    #MIOSPRITE0,d0        ; indirizzo dello sprite in d0
  48.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  49.     move.w    d0,6(a1)
  50.     swap    d0
  51.     move.w    d0,2(a1)
  52.     MOVE.L    #MIOSPRITE1,d0        ; indirizzo dello sprite in d0
  53.     addq.w    #8,a1            ; prossimi SPRITEPOINTERS
  54.     move.w    d0,6(a1)
  55.     swap    d0
  56.     move.w    d0,2(a1)
  57.     MOVE.L    #MIOSPRITE2,d0        ; indirizzo dello sprite in d0
  58.     addq.w    #8,a1            ; prossimi SPRITEPOINTERS
  59.     move.w    d0,6(a1)
  60.     swap    d0
  61.     move.w    d0,2(a1)
  62.     MOVE.L    #MIOSPRITE3,d0        ; indirizzo dello sprite in d0
  63.     addq.w    #8,a1            ; prossimi SPRITEPOINTERS
  64.     move.w    d0,6(a1)
  65.     swap    d0
  66.     move.w    d0,2(a1)
  67.     MOVE.L    #MIOSPRITE4,d0        ; indirizzo dello sprite in d0
  68.     addq.w    #8,a1            ; prossimi SPRITEPOINTERS
  69.     move.w    d0,6(a1)
  70.     swap    d0
  71.     move.w    d0,2(a1)
  72.     MOVE.L    #MIOSPRITE5,d0        ; indirizzo dello sprite in d0
  73.     addq.w    #8,a1            ; prossimi SPRITEPOINTERS
  74.     move.w    d0,6(a1)
  75.     swap    d0
  76.     move.w    d0,2(a1)
  77.     MOVE.L    #MIOSPRITE6,d0        ; indirizzo dello sprite in d0
  78.     addq.w    #8,a1            ; prossimi SPRITEPOINTERS
  79.     move.w    d0,6(a1)
  80.     swap    d0
  81.     move.w    d0,2(a1)
  82.     MOVE.L    #MIOSPRITE7,d0        ; indirizzo dello sprite in d0
  83.     addq.w    #8,a1            ; prossimi SPRITEPOINTERS
  84.     move.w    d0,6(a1)
  85.     swap    d0
  86.     move.w    d0,2(a1)
  87.  
  88.     move.l    #COPPERLIST,$dff080    ; nostra COP
  89.     move.w    d0,$dff088        ; START COP
  90.     move.w    #0,$dff1fc        ; NO AGA!
  91.     move.w    #$c00,$dff106        ; NO AGA!
  92.  
  93.     lea    PriList(PC),a0    ; a0 punta alla lista dei valori di priorita`
  94.     
  95.     move.w    #$0000,$dff104    ; BPLCON2
  96.                 ; con questo valore gli sprite sono tutti
  97.                 ; sotto entrambi i playfield
  98.  
  99. aspetta1:
  100.     cmpi.b    #$ff,$dff006    ; Linea 255?
  101.     bne.s    aspetta1
  102.  
  103.     bsr.s    MuoviSprites    ; Muove in basso gli sprites
  104.  
  105. aspetta2:
  106.     cmpi.b    #$ff,$dff006    ; linea 255?
  107.     beq.s    aspetta2
  108.  
  109.     cmp.w    #250,altezza    ; gli sprite hanno raggiunto il bordo basso?
  110.     blo.s    aspetta1    ; no, continua a muoverli
  111.  
  112.     move.w    #$2c,altezza    ; si. Rimetti gli sprite in alto
  113.     cmp.l    #EndPriList,a0    ; abbiamo terminato i valori di priorita`?
  114.     beq.s    esci        ; se si esci.
  115.     move.w    (a0)+,$dff104    ; se no, metti il prossimo valore in BPLCON2
  116.     bra.s    aspetta1
  117.  
  118.  
  119. esci    move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  120.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  121.  
  122.     move.l    4.w,a6
  123.     jsr    -$7e(a6)    ; Enable
  124.     move.l    gfxbase(PC),a1
  125.     jsr    -$19e(a6)    ; Closelibrary
  126.     rts
  127.  
  128. ;    Dati
  129.  
  130. GfxName:
  131.     dc.b    "graphics.library",0,0
  132.  
  133. GfxBase:
  134.     dc.l    0
  135.  
  136. OldCop:
  137.     dc.l    0
  138.  
  139. ; Questa routine muove gli 8 sprites in basso di un pixel alla volta
  140. ; Tutti gli sprites hanno la stessa altezza
  141.  
  142. Muovisprites:
  143.  
  144. ; muove lo sprite 0
  145.  
  146.     addq.w    #1,altezza
  147.     move.w    altezza(PC),d0
  148.  
  149.     CLR.B    VHBITS0        ; azzera i bit 8 delle posizioni verticali
  150.     MOVE.b    d0,VSTART0    ; copia i bit da 0 a 7 in VSTART
  151.     BTST.l    #8,D0        ; la posizione e` maggiore di 255 ?
  152.     BEQ.S    NOBIGVSTART    ; se no vai oltre infatti il bit e` stato gia`
  153.                 ; azzerato con la CLR.b VHBITS
  154.  
  155.     BSET.b    #2,VHBITS0    ; altrimenti metti a 1 il bit 8 della posizione
  156.                 ; verticale di partenza
  157.  
  158. NOBIGVSTART:
  159.     ADDQ.W    #8,D0        ; Aggiungi la lunghezza dello sprite per
  160.                 ; determinare la posizione finale (VSTOP)
  161.     move.b    d0,VSTOP0    ; Muovi i bit da 0 a 7 in VSTOP
  162.     BTST.l    #8,D0        ; la posizione e` maggiore di 255 ?
  163.     BEQ.S    NOBIGVSTOP    ; se no vai oltre infatti il bit e` stato gia` 
  164.                 ; azzerato con la CLR.b VHBITS
  165.  
  166.     BSET.b    #1,VHBITS0    ; altrimenti metti a 1 il bit 8 della posizione
  167.                 ; verticale di fine dello sprite
  168. NOBIGVSTOP:
  169.  
  170. ; copia l'altezza sugli altri sprites
  171.  
  172.     move.b    vstart0,vstart1    ; copia vstart
  173.     move.w    vstop0,vstop1    ; copia VSTOP e VHBITS
  174.  
  175.     move.b    vstart0,vstart2    ; copia vstart
  176.     move.w    vstop0,vstop2    ; copia VSTOP e VHBITS
  177.  
  178.     move.b    vstart0,vstart3    ; copia vstart
  179.     move.w    vstop0,vstop3    ; copia VSTOP e VHBITS
  180.  
  181.     move.b    vstart0,vstart4    ; copia vstart
  182.     move.w    vstop0,vstop4    ; copia VSTOP e VHBITS
  183.  
  184.     move.b    vstart0,vstart5    ; copia vstart
  185.     move.w    vstop0,vstop5    ; copia VSTOP e VHBITS
  186.  
  187.     move.b    vstart0,vstart6    ; copia vstart
  188.     move.w    vstop0,vstop6    ; copia VSTOP e VHBITS
  189.  
  190.     move.b    vstart0,vstart7    ; copia vstart
  191.     move.w    vstop0,vstop7    ; copia VSTOP e VHBITS
  192.  
  193. FineMuovisprites:
  194.     rts
  195.  
  196. altezza:
  197.     dc.w    $2c
  198.  
  199. ; Questa e` la lista dei valori di priorita`. Potete variarla come volete.
  200. ; Dopo l'ultimo valore deve esserci pero` la label EndPriList
  201. ; Questi valori verranno scritti in BPLCON2. Notate che a differenza
  202. ; dell'esempio lezione7w1.s qui usiamo uno schermo dual playfield, e
  203. ; pertanto possiamo usare per ciascun playfield un diverso livello di
  204. ; priorita`,
  205. ; Vi ricordo che tra gli sprite le priorita` sono fisse e sono in ordine
  206. ; decrescente: lo sprite 0 ha la priorita` maggiore, il 7 la minore.
  207.  
  208. PriList:
  209.     dc.w    $0008    ; %001000 - con questo valore le priorita` sono:
  210.             ; playfield 1 (sopra tutto)
  211.             ; sprite 0 e 1
  212.             ; playfield 2
  213.             ; sprite 2,3,4,5,6,7 (sotto tutto)
  214.  
  215.     dc.w    $0010    ; %010000 - con questo valore le priorita` sono:
  216.             ; playfield 1 (sopra tutto)
  217.             ; sprite 0,1,2,3
  218.             ; playfield 2
  219.             ; sprite 4,5,6,7 (sotto tutto)
  220.  
  221.     dc.w    $0018    ; %011000 - con questo valore le priorita` sono:
  222.             ; playfield 1 (sopra tutto)
  223.             ; sprite 0,1,2,3,4,5
  224.             ; playfield 2
  225.             ; sprite 6,7 (sotto tutto)
  226.             
  227.     dc.w    $0020    ; %100000 - con questo valore le priorita` sono:
  228.             ; playfield 1 (sopra tutto)
  229.             ; sprite 0,1,2,3,4,5,6,7
  230.             ; playfield 2
  231.             
  232.     dc.w    $0021    ; %100001 - con questo valore le priorita` sono:
  233.             ; sprite 0 e 1 (sopra tutto)
  234.             ; playfield 1
  235.             ; sprite 2,3,4,5,6,7
  236.             ; playfield 2 (sotto tutto)
  237.             
  238.     dc.w    $0022    ; %100010 - con questo valore le priorita` sono:
  239.             ; sprite 0,1,2,3 (sopra tutto)
  240.             ; playfield 1
  241.             ; sprite 4,5,6,7
  242.             ; playfield 2 (sotto tutto)
  243.         
  244.     dc.w    $0023    ; %100011 - con questo valore le priorita` sono:
  245.             ; sprite 0,1,2,3,4,5 (sopra tutto)
  246.             ; playfield 1
  247.             ; sprite 6,7
  248.             ; playfield 2 (sotto tutto)
  249.  
  250.     dc.w    $0024    ; %100100 - con questo valore le priorita` sono:
  251.             ; sprite 0,1,2,3,4,5,6,7 (sopra tutto)
  252.             ; playfield 1
  253.             ; playfield 2 (sotto tutto)
  254. EndPriList:
  255.  
  256.  
  257.  
  258.     SECTION    GRAPHIC,DATA_C
  259.  
  260. COPPERLIST:
  261. SpritePointers:
  262.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  263.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  264.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  265.     dc.w    $13e,0
  266.  
  267.  
  268.     dc.w    $8E,$2c81    ; DiwStrt
  269.     dc.w    $90,$2cc1    ; DiwStop
  270.     dc.w    $92,$38        ; DdfStart
  271.     dc.w    $94,$d0        ; DdfStop
  272.  
  273. ;    abbiamo tolto il BPLCON2 dalla Copperlist, dato che lo variamo
  274. ;    col processore "manualmente".
  275.  
  276.     dc.w    $102,0        ; BplCon1
  277.     dc.w    $108,0        ; Bpl1Mod
  278.     dc.w    $10a,0        ; Bpl2Mod
  279.  
  280.             ; 5432109876543210
  281.     dc.w    $100,%0110011000000000    ; bit 10 acceso = dual playfield
  282.                     ; uso 6 planes = 8 colori per playfield
  283.  
  284. BPLPOINTERS1:
  285.     dc.w $e0,0,$e2,0    ;primo bitplane playfield 1 (BPLPT1)
  286.     dc.w $e8,0,$ea,0    ;secondo bitplane playfield 1 (BPLPT3)
  287.     dc.w $f0,0,$f2,0    ;terzo bitplane playfield 1 (BPLPT5)
  288.  
  289.  
  290. BPLPOINTERS2:
  291.     dc.w $e4,0,$e6,0    ;primo bitplane playfield 2 (BPLPT2)
  292.     dc.w $ec,0,$ee,0    ;secondo bitplane playfield 2 (BPLPT4)
  293.     dc.w $f4,0,$f6,0    ;terzo bitplane playfield 2 (BPLPT6)
  294.  
  295.     dc.w    $180,$110    ; palette playfield 1
  296.     dc.w    $182,$005    ; colori da 0 a 7
  297.     dc.w    $184,$a40
  298.     dc.w    $186,$f80 
  299.     dc.w    $188,$f00 
  300.     dc.w    $18a,$0f0 
  301.     dc.w    $18c,$00f
  302.     dc.w    $18e,$080
  303.  
  304.  
  305.                 ; palette playfield 2
  306.     dc.w    $192,$367    ; colori da 9 a 15
  307.     dc.w    $194,$0cc     ; il colore 8 e` trasparente, non va settato
  308.     dc.w    $196,$a0a 
  309.     dc.w    $198,$242 
  310.     dc.w    $19a,$282 
  311.     dc.w    $19c,$861
  312.     dc.w    $19e,$ff0
  313.  
  314.  
  315.     dc.w    $1A2,$F00    ; palette degli sprites
  316.     dc.w    $1A4,$0F0
  317.     dc.w    $1A6,$FF0
  318.  
  319.     dc.w    $1AA,$FFF
  320.     dc.w    $1AC,$0BD
  321.     dc.w    $1AE,$D50
  322.  
  323.     dc.w    $1B2,$00F
  324.     dc.w    $1B4,$F0F
  325.     dc.w    $1B6,$BBB
  326.  
  327.     dc.w    $1BA,$8E0
  328.     dc.w    $1BC,$a70
  329.     dc.w    $1BE,$d00
  330.  
  331.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  332.  
  333.  
  334. ;    I due playfields
  335.  
  336.  
  337. PIC1:    incbin    "dual1.raw"
  338. PIC2:    incbin    "dual2.raw"
  339.  
  340. ; ************ Ecco gli sprite: OVVIAMENTE in CHIP RAM! ************
  341. MIOSPRITE0:
  342. VSTART0:
  343.     dc.b $60
  344. HSTART0:
  345.     dc.b $60
  346. VSTOP0:
  347.     dc.b $68
  348. VHBITS0
  349.     dc.b $00
  350.  dc.w    %0000001111000000,%0111110000111110
  351.  dc.w    %0000111111110000,%1111001110001111
  352.  dc.w    %0011111111111100,%1100010001000011
  353.  dc.w    %0111111111111110,%1000010001000001
  354.  dc.w    %0111111111111110,%1000010001000001
  355.  dc.w    %0011111111111100,%1100010001000011
  356.  dc.w    %0000111111110000,%1111001110001111
  357.  dc.w    %0000001111000000,%0111110000111110
  358.  dc.w    0,0
  359.  
  360.  
  361. MIOSPRITE1:
  362. VSTART1:
  363.     dc.b $60
  364. HSTART1:
  365.     dc.b $60+14
  366. VSTOP1:
  367.     dc.b $68
  368.     dc.b $00
  369.  dc.w    %0000001111000000,%0111110000111110
  370.  dc.w    %0000111111110000,%1111000010001111
  371.  dc.w    %0011111111111100,%1100000110000011
  372.  dc.w    %0111111111111110,%1000000010000001
  373.  dc.w    %0111111111111110,%1000000010000001
  374.  dc.w    %0011111111111100,%1100000010000011
  375.  dc.w    %0000111111110000,%1111000111001111
  376.  dc.w    %0000001111000000,%0111110000111110
  377.  dc.w    0,0
  378.  
  379. MIOSPRITE2:
  380. VSTART2:
  381.     dc.b $60
  382. HSTART2:
  383.     dc.b $60+(14*2)
  384. VSTOP2:
  385.     dc.b $68
  386.     dc.b $00
  387.  dc.w    %0000001111000000,%0111110000111110
  388.  dc.w    %0000111111110000,%1111000111001111
  389.  dc.w    %0011111111111100,%1100001000100011
  390.  dc.w    %0111111111111110,%1000000000100001
  391.  dc.w    %0111111111111110,%1000000111000001
  392.  dc.w    %0011111111111100,%1100001000000011
  393.  dc.w    %0000111111110000,%1111001111101111
  394.  dc.w    %0000001111000000,%0111110000111110
  395.  dc.w    0,0
  396.  
  397. MIOSPRITE3:
  398. VSTART3:
  399.     dc.b $60
  400. HSTART3:
  401.     dc.b $60+(14*3)
  402. VSTOP3:
  403.     dc.b $68
  404.     dc.b $00
  405.  dc.w    %0000001111000000,%0111110000111110
  406.  dc.w    %0000111111110000,%1111001111101111
  407.  dc.w    %0011111111111100,%1100000000100011
  408.  dc.w    %0111111111111110,%1000000111100001
  409.  dc.w    %0111111111111110,%1000000000100001
  410.  dc.w    %0011111111111100,%1100000000100011
  411.  dc.w    %0000111111110000,%1111001111101111
  412.  dc.w    %0000001111000000,%0111110000111110
  413.  dc.w    0,0
  414.  
  415.  
  416. MIOSPRITE4:
  417. VSTART4:
  418.     dc.b $60
  419. HSTART4:
  420.     dc.b $60+(14*4)
  421. VSTOP4:
  422.     dc.b $68
  423.     dc.b $00
  424.  dc.w    %0000001111000000,%0111110000111110
  425.  dc.w    %0000111111110000,%1111001001001111
  426.  dc.w    %0011111111111100,%1100001001000011
  427.  dc.w    %0111111111111110,%1000001111000001
  428.  dc.w    %0111111111111110,%1000000001000001
  429.  dc.w    %0011111111111100,%1100000001000011
  430.  dc.w    %0000111111110000,%1111000001001111
  431.  dc.w    %0000001111000000,%0111110000111110
  432.  dc.w    0,0
  433.  
  434. MIOSPRITE5:
  435. VSTART5:
  436.     dc.b $60
  437. HSTART5:
  438.     dc.b $60+(14*5)
  439. VSTOP5:
  440.     dc.b $68
  441.     dc.b $00
  442.  dc.w    %0000001111000000,%0111110000111110
  443.  dc.w    %0000111111110000,%1111001111001111
  444.  dc.w    %0011111111111100,%1100001000000011
  445.  dc.w    %0111111111111110,%1000001111000001
  446.  dc.w    %0111111111111110,%1000000001000001
  447.  dc.w    %0011111111111100,%1100000001000011
  448.  dc.w    %0000111111110000,%1111001111001111
  449.  dc.w    %0000001111000000,%0111110000111110
  450.  dc.w    0,0
  451.  
  452. MIOSPRITE6:
  453. VSTART6:
  454.     dc.b $60
  455. HSTART6:
  456.     dc.b $60+(14*6)
  457. VSTOP6:
  458.     dc.b $68
  459.     dc.b $00
  460.  dc.w    %0000001111000000,%0111110000111110
  461.  dc.w    %0000111111110000,%1111001111001111
  462.  dc.w    %0011111111111100,%1100001000000011
  463.  dc.w    %0111111111111110,%1000001111000001
  464.  dc.w    %0111111111111110,%1000001001000001
  465.  dc.w    %0011111111111100,%1100001001000011
  466.  dc.w    %0000111111110000,%1111001111001111
  467.  dc.w    %0000001111000000,%0111110000111110
  468.  dc.w    0,0
  469.  
  470. MIOSPRITE7:
  471. VSTART7:
  472.     dc.b $60
  473. HSTART7:
  474.     dc.b $60+(14*7)
  475. VSTOP7:
  476.     dc.b $68
  477.     dc.b $00
  478.  dc.w    %0000001111000000,%0111110000111110
  479.  dc.w    %0000111111110000,%1111001111001111
  480.  dc.w    %0011111111111100,%1100000001000011
  481.  dc.w    %0111111111111110,%1000000001000001
  482.  dc.w    %0111111111111110,%1000000001000001
  483.  dc.w    %0011111111111100,%1100000001000011
  484.  dc.w    %0000111111110000,%1111000001001111
  485.  dc.w    %0000001111000000,%0111110000111110
  486.  dc.w    0,0
  487.  
  488.     end
  489.  
  490. Questo esempio mostra come funzionano le priorita` degli sprite rispetto
  491. ad uno schermo dualplayfield. Per ogni playfield si puo` settare un livello
  492. di priorita` diverso.
  493. Per questo esempio abbiamo usato una lista di valori di priorita`.
  494. Una lista in pratica e` una serie di valori, come una TABELLA.
  495. Con un registro indirizzi (in questo caso a0) puntiamo al primo valore con
  496. l'istruzione:
  497.  
  498.     lea PriList(PC),a0
  499.  
  500. Ogni volta che viene letto un valore, il registro a0 viene spostato a puntare
  501. il valore successivo, mediante l'indirizzamento indiretto con postincremento,
  502. ovvero:
  503.  
  504.     move.w    (a0)+,$dff104    ; Mettiamo il valore in BPLCON2
  505.  
  506. Quando raggiungiamo l'ultimo valore, a0 viene fatto puntare all'indirizzo
  507. di memoria che segue l'ultimo valore. Questo indirizzo e` il valore della
  508. label EndPriList. Quando  a0 diventa uguale a EndPriList allora abbiamo
  509. raggiunto la fine della lista, e quindi usciamo dal programma.
  510.  
  511. Potete cambiare i valori nella lista, sperimentando vari livelli di priorita`.
  512. Per es. se provate con $0011 vedrete gli sprite 0 e 1 sopra tutti e 2 i
  513. playfield, gli sprite 2 e 3 sopra il playfield 2 e sotto l'uno, mentre gli
  514. altri sprite sotto entrambi i playfield.
  515.  
  516. NOTA: In questo esempio cambiamo la priorita' scrivendo direttamente nel
  517.       registro $dff104 (BPLCON2). Questo e' stato possibile togliendo la
  518.       definizione di tale registro dalla copperlist, ossia la linea:
  519.  
  520.     dc.w    $104,0    ; BPLCON2
  521.  
  522.      Se provate a rimettere al suo posto questa istruzione copper, sara'
  523.      annullato l'effetto, proprio perche' ogni fotogramma la copperlist
  524.      viene eseguita, e con essa il BPLCON2 viene azzerato.
  525.      Si puo' decidere dunque di modificare certi registri con la copperlist
  526.      e certi altri direttamente col processore, ma vi consiglio di
  527.      modificarli col copper quando e' possibile, dato che potete sincronizzare
  528.      meglio il momento e la linea video adatti per l'accesso al registro.
  529.  
  530.