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

  1.  
  2. ; Lezione7h.s    4 SPRITE A 16 COLORI IN MODO ATTACCHED MOSSI SULLO SCHERMO
  3. ;         USANDO DUE TABELLE DI VALORI (ossia di coordinate verticali
  4. ;        e orizzontali) PRESTABILITI.
  5. ;        ** NOTA ** Per vedere il programma ed uscire premere:
  6. ;        TASTO SINISTRO, TASTO DESTRO, TASTO SINISTRO, TASTO DESTRO.
  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 la PIC "vuota"
  20.  
  21.     MOVE.L    #BITPLANE,d0    ; dove puntare
  22.     LEA    BPLPOINTERS,A1    ; puntatori COP
  23.     move.w    d0,6(a1)
  24.     swap    d0
  25.     move.w    d0,2(a1)
  26.  
  27. ;    Puntiamo gli 8 sprite, che ATTACCATI formeranno 4 sprite a 16 colori.
  28. ;    Gli sprite 1,3,5,7, quelli dispari, devono avere il bit 7 della
  29. ;    seconda word ad 1.
  30.  
  31.  
  32.     MOVE.L    #MIOSPRITE0,d0        ; indirizzo dello sprite in d0
  33.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  34.     move.w    d0,6(a1)
  35.     swap    d0
  36.     move.w    d0,2(a1)
  37.     MOVE.L    #MIOSPRITE1,d0        ; indirizzo dello sprite in d0
  38.     addq.w    #8,a1            ; prossimi SPRITEPOINTERS
  39.     move.w    d0,6(a1)
  40.     swap    d0
  41.     move.w    d0,2(a1)
  42.     MOVE.L    #MIOSPRITE2,d0        ; indirizzo dello sprite in d0
  43.     addq.w    #8,a1            ; prossimi SPRITEPOINTERS
  44.     move.w    d0,6(a1)
  45.     swap    d0
  46.     move.w    d0,2(a1)
  47.     MOVE.L    #MIOSPRITE3,d0        ; indirizzo dello sprite in d0
  48.     addq.w    #8,a1            ; prossimi SPRITEPOINTERS
  49.     move.w    d0,6(a1)
  50.     swap    d0
  51.     move.w    d0,2(a1)
  52.     MOVE.L    #MIOSPRITE4,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    #MIOSPRITE5,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    #MIOSPRITE6,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    #MIOSPRITE7,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.  
  73. ; Settiamo i bit dell'ATTACCHED
  74.  
  75.     bset    #7,MIOSPRITE1+3        ; Setta il bit dell'attacched allo
  76.                     ; sprite 1. Togliendo questa istruzione
  77.                     ; gli sprite non sono ATTACCHED, ma
  78.                     ; due a 3 colori sovrapposti.
  79.  
  80.     bset    #7,MIOSPRITE3+3
  81.     bset    #7,MIOSPRITE5+3
  82.     bset    #7,MIOSPRITE7+3
  83.  
  84.     move.l    #COPPERLIST,$dff080    ; nostra COP
  85.     move.w    d0,$dff088        ; START COP
  86.     move.w    #0,$dff1fc        ; NO AGA!
  87.     move.w    #$c00,$dff106        ; NO AGA!
  88.  
  89. ;    Creiamo una differenza di posizione nei puntatori alle tabelle tra i
  90. ;    4 sprite per fargli fare movimenti diversi l'uno dall'altro.
  91.  
  92.     MOVE.L    #TABX+55,TABXPOINT0
  93.     MOVE.L    #TABX+86,TABXPOINT1
  94.     MOVE.L    #TABX+130,TABXPOINT2
  95.     MOVE.L    #TABX+170,TABXPOINT3
  96.     MOVE.L    #TABY-1,TABYPOINT0
  97.     MOVE.L    #TABY+45,TABYPOINT1
  98.     MOVE.L    #TABY+90,TABYPOINT2
  99.     MOVE.L    #TABY+140,TABYPOINT3
  100.  
  101.  
  102. Mouse1:
  103.     bsr.w    MuoviGliSprite    ; Attende un fotogramma, muove gli sprite e
  104.                 ; ritorna.
  105.  
  106.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  107.     bne.s    mouse1
  108.  
  109.     MOVE.L    #TABX+170,TABXPOINT0
  110.     MOVE.L    #TABX+130,TABXPOINT1
  111.     MOVE.L    #TABX+86,TABXPOINT2
  112.     MOVE.L    #TABX+55,TABXPOINT3
  113.     MOVE.L    #TABY-1,TABYPOINT0
  114.     MOVE.L    #TABY+45,TABYPOINT1
  115.     MOVE.L    #TABY+90,TABYPOINT2
  116.     MOVE.L    #TABY+140,TABYPOINT3
  117.  
  118. Mouse2:
  119.     bsr.w    MuoviGliSprite    ; Attende un fotogramma, muove gli sprite e
  120.                 ; ritorna.
  121.  
  122.     btst    #2,$dff016    ; tasto destro del mouse premuto?
  123.     bne.s    mouse2
  124.  
  125. ; SPRITE IN FILA INDIANA
  126.  
  127.     MOVE.L    #TABX+30,TABXPOINT0
  128.     MOVE.L    #TABX+20,TABXPOINT1
  129.     MOVE.L    #TABX+10,TABXPOINT2
  130.     MOVE.L    #TABX-1,TABXPOINT3
  131.     MOVE.L    #TABY+30,TABYPOINT0
  132.     MOVE.L    #TABY+20,TABYPOINT1
  133.     MOVE.L    #TABY+10,TABYPOINT2
  134.     MOVE.L    #TABY-1,TABYPOINT3
  135.  
  136. Mouse3:
  137.     bsr.w    MuoviGliSprite    ; Attende un fotogramma, muove gli sprite e
  138.                 ; ritorna.
  139.  
  140.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  141.     bne.s    mouse3
  142.  
  143. ; SPRITE UBRIACHI PER LO SCHERMO
  144.  
  145.     MOVE.L    #TABX+220,TABXPOINT0
  146.     MOVE.L    #TABX+30,TABXPOINT1
  147.     MOVE.L    #TABX+102,TABXPOINT2
  148.     MOVE.L    #TABX+5,TABXPOINT3
  149.     MOVE.L    #TABY-1,TABYPOINT0
  150.     MOVE.L    #TABY+180,TABYPOINT1
  151.     MOVE.L    #TABY+20,TABYPOINT2
  152.     MOVE.L    #TABY+100,TABYPOINT3
  153.  
  154.  
  155. Mouse4:
  156.     bsr.w    MuoviGliSprite    ; Attende un fotogramma, muove gli sprite e
  157.                 ; ritorna.
  158.  
  159.     btst    #2,$dff016    ; tasto destro del mouse premuto?
  160.     bne.s    mouse4
  161.  
  162.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  163.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  164.  
  165.  
  166.     move.l    4.w,a6
  167.     jsr    -$7e(a6)    ; Enable
  168.     move.l    gfxbase(PC),a1
  169.     jsr    -$19e(a6)    ; Closelibrary
  170.     rts
  171.  
  172. ;    Dati
  173.  
  174. GfxName:
  175.     dc.b    "graphics.library",0,0
  176.  
  177. GfxBase:
  178.     dc.l    0
  179.  
  180. OldCop:
  181.     dc.l    0
  182.  
  183.  
  184. ; Questa routine esegue le singole routines di movimento degli sprite
  185. ; ed include anche il loop di attesa del fotogramma per la temporizzazione.
  186.  
  187. MuoviGliSprite:
  188.     cmpi.b    #$ff,$dff006    ; Linea 255?
  189.     bne.s    MuoviGliSprite
  190.  
  191.     bsr.s    MuoviSpriteX0    ; Muovi lo sprite 0 orizzontalmente
  192.     bsr.w    MuoviSpriteX1    ; Muovi lo sprite 1 orizzontalmente
  193.     bsr.w    MuoviSpriteX2    ; Muovi lo sprite 2 orizzontalmente
  194.     bsr.w    MuoviSpriteX3    ; Muovi lo sprite 3 orizzontalmente
  195.     bsr.w    MuoviSpriteY0    ; Muovi lo sprite 0 verticalmente
  196.     bsr.w    MuoviSpriteY1    ; Muovi lo sprite 1 verticalmente
  197.     bsr.w    MuoviSpriteY2    ; Muovi lo sprite 2 verticalmente
  198.     bsr.w    MuoviSpriteY3    ; Muovi lo sprite 3 verticalmente
  199.  
  200. Aspetta:
  201.     cmpi.b    #$ff,$dff006    ; linea 255?
  202.     beq.s    Aspetta
  203.  
  204.     rts        ; Torna al loop MOUSE
  205.  
  206.  
  207. ; ********************* ROUTINES DI MOVIMENTO ORIZZONTALE *******************
  208.  
  209. ; Queste routines spostano lo sprite agendo sul suo byte HSTART, ossia
  210. ; il byte della sua posizione X, immettendoci delle coordinate gia' stabilite
  211. ; nella tabella TABX (Scorrimento orizzontale a scatti di 2 pixel e non 1)
  212.  
  213. ; Per lo sprite0 ATTACCHED: (ossia Sprite0+Sprite1)
  214.  
  215. MuoviSpriteX0:
  216.     ADDQ.L    #1,TABXPOINT0     ; Fai puntare al byte successivo
  217.     MOVE.L    TABXPOINT0(PC),A0 ; indirizzo contenuto in long TABXPOINT
  218.                  ; copiato in a0
  219.     CMP.L    #FINETABX-1,A0  ; Siamo all'ultima longword della TAB?
  220.     BNE.S    NOBSTARTX0    ; non ancora? allora continua
  221.     MOVE.L    #TABX-1,TABXPOINT0 ; Riparti a puntare dal primo byte-1
  222. NOBSTARTX0:
  223.     MOVE.b    (A0),MIOSPRITE0+1 ; copia il byte dalla tabella ad HSTART0
  224.     MOVE.b    (A0),MIOSPRITE1+1 ; copia il byte dalla tabella ad HSTART1
  225.     rts
  226.  
  227. TABXPOINT0:
  228.     dc.l    TABX+55        ; NOTA: i valori della tabella sono bytes
  229.  
  230.  
  231.  
  232. ; Per lo sprite1 ATTACCHED: (ossia Sprite2+Sprite3)
  233.  
  234. MuoviSpriteX1:
  235.     ADDQ.L    #1,TABXPOINT1     ; Fai puntare al byte successivo
  236.     MOVE.L    TABXPOINT1(PC),A0 ; indirizzo contenuto in long TABXPOINT
  237.                  ; copiato in a0
  238.     CMP.L    #FINETABX-1,A0  ; Siamo all'ultima longword della TAB?
  239.     BNE.S    NOBSTARTX1    ; non ancora? allora continua
  240.     MOVE.L    #TABX-1,TABXPOINT1 ; Riparti a puntare dal primo byte-1
  241. NOBSTARTX1:
  242.     MOVE.b    (A0),MIOSPRITE2+1 ; copia il byte dalla tabella ad HSTART2
  243.     MOVE.b    (A0),MIOSPRITE3+1 ; copia il byte dalla tabella ad HSTART3
  244.     rts
  245.  
  246. TABXPOINT1:
  247.     dc.l    TABX+86        ; NOTA: i valori della tabella sono bytes
  248.  
  249.  
  250.  
  251. ; Per lo sprite2 ATTACCHED: (ossia Sprite4+Sprite5)
  252.  
  253. MuoviSpriteX2:
  254.     ADDQ.L    #1,TABXPOINT2     ; Fai puntare al byte successivo
  255.     MOVE.L    TABXPOINT2(PC),A0 ; indirizzo contenuto in long TABXPOINT
  256.                  ; copiato in a0
  257.     CMP.L    #FINETABX-1,A0  ; Siamo all'ultima longword della TAB?
  258.     BNE.S    NOBSTARTX2    ; non ancora? allora continua
  259.     MOVE.L    #TABX-1,TABXPOINT2 ; Riparti a puntare dal primo byte-1
  260. NOBSTARTX2:
  261.     MOVE.b    (A0),MIOSPRITE4+1 ; copia il byte dalla tabella ad HSTART4
  262.     MOVE.b    (A0),MIOSPRITE5+1 ; copia il byte dalla tabella ad HSTART5
  263.     rts
  264.  
  265. TABXPOINT2:
  266.     dc.l    TABX+130    ; NOTA: i valori della tabella sono bytes
  267.  
  268.  
  269.  
  270. ; Per lo sprite3 ATTACCHED: (ossia Sprite6+Sprite7)
  271.  
  272. MuoviSpriteX3:
  273.     ADDQ.L    #1,TABXPOINT3     ; Fai puntare al byte successivo
  274.     MOVE.L    TABXPOINT3(PC),A0 ; indirizzo contenuto in long TABXPOINT
  275.                  ; copiato in a0
  276.     CMP.L    #FINETABX-1,A0  ; Siamo all'ultima longword della TAB?
  277.     BNE.S    NOBSTARTX3    ; non ancora? allora continua
  278.     MOVE.L    #TABX-1,TABXPOINT3 ; Riparti a puntare dal primo byte-1
  279. NOBSTARTX3:
  280.     MOVE.b    (A0),MIOSPRITE6+1 ; copia il byte dalla tabella ad HSTART6
  281.     MOVE.b    (A0),MIOSPRITE7+1 ; copia il byte dalla tabella ad HSTART7
  282.     rts
  283.  
  284. TABXPOINT3:
  285.     dc.l    TABX+170    ; NOTA: i valori della tabella sono bytes
  286.  
  287. ; ********************* ROUTINES DI MOVIMENTO VERTICALE *******************
  288.  
  289. ; Queste routines spostano in alto e in basso lo sprite agendo sui suoi byte
  290. ; VSTART e VSTOP, ossia i byte della sua posizione Y di inizio e fine,
  291. ; immettendoci delle coordinate gia' stabilite nella tabella TABY
  292.  
  293. ; Per lo sprite0 ATTACCHED: (ossia Sprite0+Sprite1)
  294.  
  295. MuoviSpriteY0:
  296.     ADDQ.L    #1,TABYPOINT0     ; Fai puntare al byte successivo
  297.     MOVE.L    TABYPOINT0(PC),A0 ; indirizzo contenuto in long TABXPOINT
  298.                  ; copiato in a0
  299.     CMP.L    #FINETABY-1,A0  ; Siamo all'ultima longword della TAB?
  300.     BNE.S    NOBSTARTY0    ; non ancora? allora continua
  301.     MOVE.L    #TABY-1,TABYPOINT0 ; Riparti a puntare dal primo byte (-1)
  302. NOBSTARTY0:
  303.     moveq    #0,d0        ; Pulisci d0
  304.     MOVE.b    (A0),d0        ; copia il byte dalla tabella in d0
  305.     MOVE.b    d0,MIOSPRITE0    ; copia il byte in VSTART0
  306.     MOVE.b    d0,MIOSPRITE1    ; copia il byte in VSTART1
  307.     ADD.B    #15,D0        ; Aggiungi la lunghezza dello sprite per
  308.                 ; determinare la posizione finale (VSTOP)
  309.     move.b    d0,MIOSPRITE0+2    ; Muovi il valore giusto in VSTOP0
  310.     move.b    d0,MIOSPRITE1+2    ; Muovi il valore giusto in VSTOP1
  311.     rts
  312.  
  313. TABYPOINT0:
  314.     dc.l    TABY-1        ; NOTA: i valori della tabella sono bytes
  315.  
  316.  
  317.  
  318. ; Per lo sprite1 ATTACCHED: (ossia Sprite2+Sprite3)
  319.  
  320. MuoviSpriteY1:
  321.     ADDQ.L    #1,TABYPOINT1     ; Fai puntare al byte successivo
  322.     MOVE.L    TABYPOINT1(PC),A0 ; indirizzo contenuto in long TABXPOINT
  323.                  ; copiato in a0
  324.     CMP.L    #FINETABY-1,A0  ; Siamo all'ultima longword della TAB?
  325.     BNE.S    NOBSTARTY1    ; non ancora? allora continua
  326.     MOVE.L    #TABY-1,TABYPOINT1 ; Riparti a puntare dal primo byte (-1)
  327. NOBSTARTY1:
  328.     moveq    #0,d0        ; Pulisci d0
  329.     MOVE.b    (A0),d0        ; copia il byte dalla tabella in d0
  330.     MOVE.b    d0,MIOSPRITE2    ; copia il byte in VSTART2
  331.     MOVE.b    d0,MIOSPRITE3    ; copia il byte in VSTART3
  332.     ADD.B    #15,D0        ; Aggiungi la lunghezza dello sprite per
  333.                 ; determinare la posizione finale (VSTOP)
  334.     move.b    d0,MIOSPRITE2+2    ; Muovi il valore giusto in VSTOP2
  335.     move.b    d0,MIOSPRITE3+2    ; Muovi il valore giusto in VSTOP3
  336.     rts
  337.  
  338. TABYPOINT1:
  339.     dc.l    TABY+45        ; NOTA: i valori della tabella sono bytes
  340.  
  341.  
  342.  
  343. ; Per lo sprite2 ATTACCHED: (ossia Sprite4+Sprite5)
  344.  
  345. MuoviSpriteY2:
  346.     ADDQ.L    #1,TABYPOINT2     ; Fai puntare al byte successivo
  347.     MOVE.L    TABYPOINT2(PC),A0 ; indirizzo contenuto in long TABXPOINT
  348.                  ; copiato in a0
  349.     CMP.L    #FINETABY-1,A0  ; Siamo all'ultima longword della TAB?
  350.     BNE.S    NOBSTARTY2    ; non ancora? allora continua
  351.     MOVE.L    #TABY-1,TABYPOINT2 ; Riparti a puntare dal primo byte (-1)
  352. NOBSTARTY2:
  353.     moveq    #0,d0        ; Pulisci d0
  354.     MOVE.b    (A0),d0        ; copia il byte dalla tabella in d0
  355.     MOVE.b    d0,MIOSPRITE4    ; copia il byte in VSTART4
  356.     MOVE.b    d0,MIOSPRITE5    ; copia il byte in VSTART5
  357.     ADD.B    #15,D0        ; Aggiungi la lunghezza dello sprite per
  358.                 ; determinare la posizione finale (VSTOP)
  359.     move.b    d0,MIOSPRITE4+2    ; Muovi il valore giusto in VSTOP4
  360.     move.b    d0,MIOSPRITE5+2    ; Muovi il valore giusto in VSTOP5
  361.     rts
  362.  
  363. TABYPOINT2:
  364.     dc.l    TABY+90        ; NOTA: i valori della tabella sono bytes
  365.  
  366.  
  367.  
  368. ; Per lo sprite3 ATTACCHED: (ossia Sprite5+Sprite6)
  369.  
  370. MuoviSpriteY3:
  371.     ADDQ.L    #1,TABYPOINT3     ; Fai puntare al byte successivo
  372.     MOVE.L    TABYPOINT3(PC),A0 ; indirizzo contenuto in long TABXPOINT
  373.                  ; copiato in a0
  374.     CMP.L    #FINETABY-1,A0  ; Siamo all'ultima longword della TAB?
  375.     BNE.S    NOBSTARTY3    ; non ancora? allora continua
  376.     MOVE.L    #TABY-1,TABYPOINT3 ; Riparti a puntare dal primo byte (-1)
  377. NOBSTARTY3:
  378.     moveq    #0,d0        ; Pulisci d0
  379.     MOVE.b    (A0),d0        ; copia il byte dalla tabella in d0
  380.     MOVE.b    d0,MIOSPRITE6    ; copia il byte in VSTART6
  381.     MOVE.b    d0,MIOSPRITE7    ; copia il byte in VSTART7
  382.     ADD.B    #15,D0        ; Aggiungi la lunghezza dello sprite per
  383.                 ; determinare la posizione finale (VSTOP)
  384.     move.b    d0,MIOSPRITE6+2    ; Muovi il valore giusto in VSTOP6
  385.     move.b    d0,MIOSPRITE7+2    ; Muovi il valore giusto in VSTOP7
  386.     rts
  387.  
  388. TABYPOINT3:
  389.     dc.l    TABY+140    ; NOTA: i valori della tabella sono bytes
  390.  
  391.  
  392.  
  393. ; Tabella con coordinate X dello sprite precalcolate.
  394.  
  395. TABX:
  396.     incbin    "XCOORDINAT.TAB"    ; 334 valori
  397. FINETABX:
  398.  
  399.  
  400. ; Tabella con coordinate Y dello sprite precalcolate.
  401.  
  402. TABY:
  403.     incbin    "YCOORDINAT.TAB"    ; 200 valori
  404. FINETABY:
  405.  
  406.  
  407.     SECTION    GRAPHIC,DATA_C
  408.  
  409. COPPERLIST:
  410. SpritePointers:
  411.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  412.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  413.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  414.     dc.w    $13e,0
  415.  
  416.     dc.w    $8E,$2c81    ; DiwStrt
  417.     dc.w    $90,$2cc1    ; DiwStop
  418.     dc.w    $92,$38        ; DdfStart
  419.     dc.w    $94,$d0        ; DdfStop
  420.     dc.w    $102,0        ; BplCon1
  421.     dc.w    $104,0        ; BplCon2
  422.     dc.w    $108,0        ; Bpl1Mod
  423.     dc.w    $10a,0        ; Bpl2Mod
  424.  
  425.             ; 5432109876543210
  426.     dc.w    $100,%0001001000000000    ; bit 12 acceso!! 1 bitplane lowres
  427.  
  428. BPLPOINTERS:
  429.     dc.w $e0,0,$e2,0    ;primo     bitplane
  430.  
  431. ;    Palette della PIC
  432.  
  433.     dc.w    $180,$000    ; color0    ; sfondo nero
  434.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  435.                         ; in questo caso e' vuoto,
  436.                         ; per cui non compare.
  437.  
  438. ;    Palette degli SPRITE attacched
  439.  
  440.     dc.w    $1A2,$FFC    ; color17, COLORE 1 per gli sprite attaccati
  441.     dc.w    $1A4,$EEB    ; color18, COLORE 2 per gli sprite attaccati
  442.     dc.w    $1A6,$CD9    ; color19, COLORE 3 per gli sprite attaccati
  443.     dc.w    $1A8,$AC8    ; color20, COLORE 4 per gli sprite attaccati
  444.     dc.w    $1AA,$8B6    ; color21, COLORE 5 per gli sprite attaccati
  445.     dc.w    $1AC,$6A5    ; color22, COLORE 6 per gli sprite attaccati
  446.     dc.w    $1AE,$494    ; color23, COLORE 7 per gli sprite attaccati
  447.     dc.w    $1B0,$384    ; color24, COLORE 7 per gli sprite attaccati
  448.     dc.w    $1B2,$274    ; color25, COLORE 9 per gli sprite attaccati
  449.     dc.w    $1B4,$164    ; color26, COLORE 10 per gli sprite attaccati
  450.     dc.w    $1B6,$154    ; color27, COLORE 11 per gli sprite attaccati
  451.     dc.w    $1B8,$044    ; color28, COLORE 12 per gli sprite attaccati
  452.     dc.w    $1BA,$033    ; color29, COLORE 13 per gli sprite attaccati
  453.     dc.w    $1BC,$012    ; color30, COLORE 14 per gli sprite attaccati
  454.     dc.w    $1BE,$001    ; color31, COLORE 15 per gli sprite attaccati
  455.  
  456.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  457.  
  458.  
  459. ; ************ Ecco gli sprite: OVVIAMENTE in CHIP RAM! **********
  460.  
  461. MIOSPRITE0:                ; lunghezza 15 linee
  462.     incbin    "Sprite16Col.PARI"
  463.  
  464. MIOSPRITE1:                ; lunghezza 15 linee
  465.     incbin    "Sprite16Col.DISPARI"
  466.  
  467. MIOSPRITE2:                ; lunghezza 15 linee
  468.     incbin    "Sprite16Col.PARI"
  469.  
  470. MIOSPRITE3:                ; lunghezza 15 linee
  471.     incbin    "Sprite16Col.DISPARI"
  472.  
  473. MIOSPRITE4:                ; lunghezza 15 linee
  474.     incbin    "Sprite16Col.PARI"
  475.  
  476. MIOSPRITE5:                ; lunghezza 15 linee
  477.     incbin    "Sprite16Col.DISPARI"
  478.  
  479. MIOSPRITE6:                ; lunghezza 15 linee
  480.     incbin    "Sprite16Col.PARI"
  481.  
  482. MIOSPRITE7:                ; lunghezza 15 linee
  483.     incbin    "Sprite16Col.DISPARI"
  484.  
  485.  
  486.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  487.                     ; perche' per vedere gli sprite
  488.                     ; e' necessario che ci siano bitplanes
  489.                     ; abilitati
  490. BITPLANE:
  491.     ds.b    40*256        ; bitplane azzerato lowres
  492.  
  493.     end
  494.  
  495. In questo listato vengono visualizzati tutti i 4 sprite ATTACCHED a 16 colori.
  496. Gli sprite sono stati salvati (comprese le word di controllo) in file,
  497. usando il comando "WB". Questo per risparmiare spazio nel listato e per
  498. riutilizzare lo sprite attacched in altri listati e varie volte nello stesso
  499. listato, infatti lo stesso sprite (diviso in SPRITE PARI e DISPARI) e'
  500. utilizzato per tutti i quattro sprite.
  501. Per quanto riguarda il movimento degli sprite, ognuno ha una routine di
  502. movimento autonoma, con un puntatore alle tabelle di X e di Y autonomo.
  503. In questo modo, facendo partire il movimento da fasi diverse (ossia punti
  504. diversi della tabella) in ogni sprite, si generano i movimenti piu' disparati.
  505. Le due tabelle X ed Y pero' sono le stesse per tutte le routine, tra una
  506. routine e l'altra cambia solo la posizione di inizio del puntatore, per cui
  507. mentre uno sprite parte dalla posizione X,Y, un'altro parte dalla posizione
  508. X+n, Y+n, creando sprite piu' avanti e piu' indietro nella curva (NEL CASO
  509. DELLA "FILA INDIANA"), oppure traiettorie apparentemente casuali.
  510. E' degna di nota una particolarita' della struttura delle routine in questo
  511. listato: dovendo aspettare la pressione del tasto sinistro e destro piu' volte
  512. per cambiare il movimento degli sprite prima di uscire, sarebbe stato
  513. necessario riscrivere ogni volta i due loop che aspettano la linea $FF del
  514. pennello elettronico e tutti gli 8 "BSR muovisprite":
  515.  
  516. ; aspetta linea $FF
  517. ; bsr muovisprite
  518. ; aspetta il mouse sinistro
  519.  
  520. ; cambia la traiettoria degli sprite
  521.  
  522. ; aspetta linea $FF
  523. ; bsr muovisprite
  524. ; aspetta il mouse destro
  525.  
  526. ; cambia la traiettoria degli sprite
  527.  
  528. ; aspetta linea $FF
  529. ; bsr muovisprite
  530. ; aspetta il mouse sinistro
  531.  
  532. ; cambia la traiettoria degli sprite
  533.  
  534. ; aspetta linea $FF
  535. ; bsr muovisprite
  536. ; aspetta il mouse destro
  537.  
  538. Per risparmiare linee di listato una soluzione e' quella di includere il
  539. loop che aspetta il pennello elettronico per la temporizzazione nella
  540. subroutine BSR muovisprite:
  541.  
  542. ; Questa routine esegue le singole routines di movimento degli sprite
  543. ; ed include anche il loop di attesa del fotogramma per la temporizzazione.
  544.  
  545. MuoviGliSprite:
  546.     cmpi.b    #$ff,$dff006    ; Linea 255?
  547.     bne.s    MuoviGliSprite
  548.  
  549.     bsr.s    MuoviSpriteX0    ; Muovi lo sprite 0 orizzontalmente
  550.     bsr.w    MuoviSpriteX1    ; Muovi lo sprite 1 orizzontalmente
  551.     bsr.w    MuoviSpriteX2    ; Muovi lo sprite 2 orizzontalmente
  552.     bsr.w    MuoviSpriteX3    ; Muovi lo sprite 3 orizzontalmente
  553.     bsr.w    MuoviSpriteY0    ; Muovi lo sprite 0 verticalmente
  554.     bsr.w    MuoviSpriteY1    ; Muovi lo sprite 1 verticalmente
  555.     bsr.w    MuoviSpriteY2    ; Muovi lo sprite 2 verticalmente
  556.     bsr.w    MuoviSpriteY3    ; Muovi lo sprite 3 verticalmente
  557.  
  558. Aspetta:
  559.     cmpi.b    #$ff,$dff006    ; linea 255?
  560.     beq.s    Aspetta
  561.  
  562.     rts        ; Torna al loop MOUSE
  563.  
  564. In questo modo basta aspettare la pressione del tasto del mouse, se non e'
  565. premuto eseguire MuovigliSprite:
  566.  
  567.  
  568. Mouse1:
  569.     bsr.w    MuoviGliSprite    ; Attende un fotogramma, muove gli sprite e
  570.                 ; ritorna.
  571.  
  572.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  573.     bne.s    mouse1
  574.  
  575.     MOVE.L    #TABX+170,TABXPOINT0    ; cambia la traiettoria degli sprite
  576.     ...
  577.  
  578. Mouse2:
  579.     bsr.w    MuoviGliSprite    ; Attende un fotogramma, muove gli sprite e
  580.                 ; ritorna.
  581.  
  582.     btst    #2,$dff016    ; tasto destro del mouse premuto?
  583.     bne.s    mouse2
  584.  
  585.