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

  1.  
  2. ; Lezione7g.s    UNO SPRITE A 16 COLORI IN MODO ATTACCHED MOSSO SULLO SCHERMO
  3. ;         USANDO DUE TABELLE DI VALORI (ossia di coordinate verticali
  4. ;        e orizzontali) PRESTABILITI.
  5.  
  6.  
  7.     SECTION    CiriCop,CODE
  8.  
  9. Inizio:
  10.     move.l    4.w,a6        ; Execbase
  11.     jsr    -$78(a6)    ; Disable
  12.     lea    GfxName(PC),a1    ; Nome lib
  13.     jsr    -$198(a6)    ; OpenLibrary
  14.     move.l    d0,GfxBase
  15.     move.l    d0,a6
  16.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  17.  
  18. ;    Puntiamo la PIC "vuota"
  19.  
  20.     MOVE.L    #BITPLANE,d0    ; dove puntare
  21.     LEA    BPLPOINTERS,A1    ; puntatori COP
  22.     move.w    d0,6(a1)
  23.     swap    d0
  24.     move.w    d0,2(a1)
  25.  
  26. ;    Puntiamo gli sprite 0 ed 1, che ATTACCATI formeranno un solo sprite
  27. ;    a 16 colori. Lo sprite1, quello dispari, deve avere il bit 7 della
  28. ;    seconda word ad 1.
  29.  
  30.     MOVE.L    #MIOSPRITE0,d0        ; indirizzo dello sprite in d0
  31.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  32.     move.w    d0,6(a1)
  33.     swap    d0
  34.     move.w    d0,2(a1)
  35.     MOVE.L    #MIOSPRITE1,d0        ; indirizzo dello sprite in d0
  36.     addq.w    #8,a1            ; prossimi SPRITEPOINTERS
  37.     move.w    d0,6(a1)
  38.     swap    d0
  39.     move.w    d0,2(a1)
  40.  
  41.     bset    #7,MIOSPRITE1+3        ; Setta il bit dell'attacched allo
  42.                     ; sprite 1. Togliendo questa istruzione
  43.                     ; gli sprite non sono ATTACCHED, ma
  44.                     ; due a 3 colori sovrapposti.
  45.  
  46.     move.l    #COPPERLIST,$dff080    ; nostra COP
  47.     move.w    d0,$dff088        ; START COP
  48.     move.w    #0,$dff1fc        ; NO AGA!
  49.     move.w    #$c00,$dff106        ; NO AGA!
  50.  
  51. mouse:
  52.     cmpi.b    #$ff,$dff006    ; Linea 255?
  53.     bne.s    mouse
  54.  
  55.     bsr.s    MuoviSpriteX    ; Muovi lo sprite 0 orizzontalmente
  56.     bsr.w    MuoviSpriteY    ; Muovi lo sprite 0 verticalmente
  57.  
  58. Aspetta:
  59.     cmpi.b    #$ff,$dff006    ; linea 255?
  60.     beq.s    Aspetta
  61.  
  62.     btst    #6,$bfe001    ; mouse premuto?
  63.     bne.s    mouse
  64.  
  65.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  66.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  67.  
  68.     move.l    4.w,a6
  69.     jsr    -$7e(a6)    ; Enable
  70.     move.l    gfxbase(PC),a1
  71.     jsr    -$19e(a6)    ; Closelibrary
  72.     rts
  73.  
  74. ;    Dati
  75.  
  76. GfxName:
  77.     dc.b    "graphics.library",0,0
  78.  
  79. GfxBase:
  80.     dc.l    0
  81.  
  82. OldCop:
  83.     dc.l    0
  84.  
  85. ; Questa routine sposta  lo sprite agendo sul suo byte HSTART, ossia
  86. ; il byte della sua posizione X, immettendoci delle coordinate gia' stabilite
  87. ; nella tabella TABX. (Scatti di 2 pixel alla volta)
  88.  
  89. MuoviSpriteX:
  90.     ADDQ.L    #1,TABXPOINT     ; Fai puntare al byte successivo
  91.     MOVE.L    TABXPOINT(PC),A0 ; indirizzo contenuto in long TABXPOINT
  92.                  ; copiato in a0
  93.     CMP.L    #FINETABX-1,A0  ; Siamo all'ultima longword della TAB?
  94.     BNE.S    NOBSTARTX    ; non ancora? allora continua
  95.     MOVE.L    #TABX-1,TABXPOINT ; Riparti a puntare dal primo byte-1
  96. NOBSTARTX:
  97.     MOVE.b    (A0),MIOSPRITE0+1 ; copia il byte dalla tabella ad HSTART0
  98.     MOVE.b    (A0),MIOSPRITE1+1 ; copia il byte dalla tabella ad HSTART1
  99.     rts
  100.  
  101. TABXPOINT:
  102.     dc.l    TABX-1        ; NOTA: i valori della tabella sono bytes
  103.  
  104. ; Tabella con coordinate X dello sprite precalcolate.
  105.  
  106. TABX:
  107.     incbin    "XCOORDINAT.TAB"    ; 334 valori
  108. FINETABX:
  109.  
  110.  
  111. ; Questa routine sposta in alto e in basso lo sprite agendo sui suoi byte
  112. ; VSTART e VSTOP, ossia i byte della sua posizione Y di inizio e fine,
  113. ; immettendoci delle coordinate gia' stabilite nella tabella TABY
  114.  
  115. MuoviSpriteY:
  116.     ADDQ.L    #1,TABYPOINT     ; Fai puntare al byte successivo
  117.     MOVE.L    TABYPOINT(PC),A0 ; indirizzo contenuto in long TABXPOINT
  118.                  ; copiato in a0
  119.     CMP.L    #FINETABY-1,A0  ; Siamo all'ultima longword della TAB?
  120.     BNE.S    NOBSTARTY    ; non ancora? allora continua
  121.     MOVE.L    #TABY-1,TABYPOINT ; Riparti a puntare dal primo byte (-1)
  122. NOBSTARTY:
  123.     moveq    #0,d0        ; Pulisci d0
  124.     MOVE.b    (A0),d0        ; copia il byte dalla tabella in d0
  125.     MOVE.b    d0,MIOSPRITE0    ; copia il byte in VSTART0
  126.     MOVE.b    d0,MIOSPRITE1    ; copia il byte in VSTART1
  127.     ADD.B    #15,D0        ; Aggiungi la lunghezza dello sprite per
  128.                 ; determinare la posizione finale (VSTOP)
  129.     move.b    d0,MIOSPRITE0+2    ; Muovi il valore giusto in VSTOP0
  130.     move.b    d0,MIOSPRITE1+2    ; Muovi il valore giusto in VSTOP1
  131.     rts
  132.  
  133. TABYPOINT:
  134.     dc.l    TABY-1        ; NOTA: i valori della tabella sono bytes
  135.  
  136. ; Tabella con coordinate Y dello sprite precalcolate.
  137.  
  138. TABY:
  139.     incbin    "YCOORDINAT.TAB"    ; 200 valori
  140. FINETABY:
  141.  
  142.  
  143.     SECTION    GRAPHIC,DATA_C
  144.  
  145. COPPERLIST:
  146. SpritePointers:
  147.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  148.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  149.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  150.     dc.w    $13e,0
  151.  
  152.     dc.w    $8E,$2c81    ; DiwStrt
  153.     dc.w    $90,$2cc1    ; DiwStop
  154.     dc.w    $92,$38        ; DdfStart
  155.     dc.w    $94,$d0        ; DdfStop
  156.     dc.w    $102,0        ; BplCon1
  157.     dc.w    $104,0        ; BplCon2
  158.     dc.w    $108,0        ; Bpl1Mod
  159.     dc.w    $10a,0        ; Bpl2Mod
  160.  
  161.             ; 5432109876543210
  162.     dc.w    $100,%0001001000000000    ; bit 12 acceso!! 1 bitplane lowres
  163.  
  164. BPLPOINTERS:
  165.     dc.w $e0,0,$e2,0    ;primo     bitplane
  166.  
  167. ;    Palette della PIC
  168.  
  169.     dc.w    $180,$000    ; color0    ; sfondo nero
  170.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  171.                         ; in questo caso e' vuoto,
  172.                         ; per cui non compare.
  173.  
  174. ;    Palette degli SPRITE attacched
  175.  
  176.     dc.w    $1A2,$FFC    ; color17, COLORE 1 per gli sprite attaccati
  177.     dc.w    $1A4,$EEB    ; color18, COLORE 2 per gli sprite attaccati
  178.     dc.w    $1A6,$CD9    ; color19, COLORE 3 per gli sprite attaccati
  179.     dc.w    $1A8,$AC8    ; color20, COLORE 4 per gli sprite attaccati
  180.     dc.w    $1AA,$8B6    ; color21, COLORE 5 per gli sprite attaccati
  181.     dc.w    $1AC,$6A5    ; color22, COLORE 6 per gli sprite attaccati
  182.     dc.w    $1AE,$494    ; color23, COLORE 7 per gli sprite attaccati
  183.     dc.w    $1B0,$384    ; color24, COLORE 7 per gli sprite attaccati
  184.     dc.w    $1B2,$274    ; color25, COLORE 9 per gli sprite attaccati
  185.     dc.w    $1B4,$164    ; color26, COLORE 10 per gli sprite attaccati
  186.     dc.w    $1B6,$154    ; color27, COLORE 11 per gli sprite attaccati
  187.     dc.w    $1B8,$044    ; color28, COLORE 12 per gli sprite attaccati
  188.     dc.w    $1BA,$033    ; color29, COLORE 13 per gli sprite attaccati
  189.     dc.w    $1BC,$012    ; color30, COLORE 14 per gli sprite attaccati
  190.     dc.w    $1BE,$001    ; color31, COLORE 15 per gli sprite attaccati
  191.  
  192.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  193.  
  194.  
  195. ; ************ Ecco gli sprite: OVVIAMENTE in CHIP RAM! **********
  196.  
  197. MIOSPRITE0:        ; lunghezza 15 linee
  198. VSTART0:
  199.     dc.b $00    ; Posizione verticale di inizio sprite (da $2c a $f2)
  200. HSTART0:
  201.     dc.b $00    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  202. VSTOP0:
  203.     dc.b $00    ; posizione verticale di fine sprite
  204.     dc.b $00
  205.  
  206.     dc.w $0380,$0650,$04e8,$07d0,$0534,$1868,$1e5c,$1636 ; dati dello
  207.     dc.w $377e,$5514,$43a1,$1595,$0172,$1317,$6858,$5035 ; sprite 0
  208.     dc.w $318c,$0c65,$7453,$27c9,$5ece,$5298,$0bfe,$2c32
  209.     dc.w $005c,$13c4,$0be8,$0c18,$03e0,$03e0
  210.  
  211.     dc.w    0,0    ; 2 word azzerate definiscono la fine dello sprite.
  212.  
  213.  
  214.  
  215. MIOSPRITE1:        ; lunghezza 15 linee
  216. VSTART1:
  217.     dc.b $00    ; Posizione verticale di inizio sprite (da $2c a $f2)
  218. HSTART1:
  219.     dc.b $00    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  220. VSTOP1:
  221.     dc.b $00    ; $50+13=$5d    ; posizione verticale di fine sprite
  222.     dc.b $00    ; settare il bit 7 per attaccare sprite 0 ed 1.
  223.  
  224.     dc.w $0430,$07f0,$0fc8,$0838,$0fe4,$101c,$39f2,$200e ; dati dello
  225.     dc.w $58f2,$600e,$5873,$600f,$5cf1,$600f,$1ff3,$600f ; sprite 1
  226.     dc.w $4fe3,$701f,$47c7,$783f,$6286,$7d7e,$300e,$3ffe
  227.     dc.w $1c3c,$1ffc,$0ff8,$0ff8,$03e0,$03e0
  228.  
  229.     dc.w    0,0    ; 2 word azzerate definiscono la fine dello sprite.
  230.  
  231.  
  232.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  233.                     ; perche' per vedere gli sprite
  234.                     ; e' necessario che ci siano bitplanes
  235.                     ; abilitati
  236. BITPLANE:
  237.     ds.b    40*256        ; bitplane azzerato lowres
  238.  
  239.     end
  240.  
  241. A parte la novita' del bit ATTACCHED per fare uno sprite a 16 colori anziche'
  242. due a 4 colori, sono da notare un paio di cose:
  243. 1) Le tabelle X ed Y sono state salvate col comando "WB" e vengono caricate
  244. con l'incbin, in questo modo le tabelle possono essere caricate dai vari
  245. listati che le richiedono, basta che siano sul disco!
  246. 2) Non vengono piu' usate le label VSTART0,VSTART1,HSTART0,HSTART1 ecc. per
  247. muovere lo sprite. Le label rimangono al loro posto nello sprite in questo
  248. listato, ma risulta piu' comodo "raggiungere" i byte di controllo cosi':
  249.  
  250.     MIOSPRITE    ; Per VSTART
  251.     MIOSPRITE+1    ; Per HSTART
  252.     MIOSPRITE+2    ; Per VSTOP
  253.  
  254. In questo modo si puo' semplicemente cominciare lo sprite con:
  255.  
  256. MIOSPRITE:
  257.     DC.W    0,0
  258.     ..dati...
  259.  
  260. Senza dividere le due word in singoli byte, ognuno con una LABEL che allunga
  261. il listato.
  262. Anche per settare il bit 7 della word 2 dello SPRITE1, quello dell'ATTACCHED,
  263. e' bastata questa istruzione:
  264.  
  265.     bset    #7,MIOSPRITE1+3
  266.  
  267. Altrimento avremmo potuto settarlo "a mano" nel quarto byte:
  268.  
  269. MIOSPRITE1:
  270. VSTART1:
  271.     dc.b $00
  272. HSTART1:
  273.     dc.b $00
  274. VSTOP1:
  275.     dc.b $00
  276.     dc.b %10000000        ; oppure dc.b $80 ($80=%10000000)
  277.  
  278. Se si devono usare tutti e 8 gli sprite si risparmiano un bel po' di label e
  279. di spazio. Ancora meglio sarebbe mettere in un registro Ax l'indirizzo dello
  280. sprite ed eseguire gli offset da quel registro:
  281.  
  282.     lea    MIOSPRITE,a0
  283.     MOVE.B    #yy,(a0)    ; Per VSTART
  284.     MOVE.B    #xx,1(A0)    ; Per HSTART
  285.     MOVE.B    #y2,2(A0)    ; Per VSTOP
  286.  
  287. Definirsi in binario uno sprite a 16 colori diventa problematico.
  288. Dunque bisogna ricorrere ad un programma di disegno, basta ricordarsi di
  289. usare uno schermo a 16 colori e di disegnare gli sprite non piu' larghi di 16
  290. pixel. Una volta salvata la PIC a 16 colori (o un BRUSH piu' piccolo con lo
  291. sprite) in formato IFF, convertirlo con l'IFFCONVERTER e' facile come
  292. convertire una figura.
  293.  
  294. NOTA: Per BRUSH si intende un pezzo di figura di dimensioni variabili.
  295.  
  296. Ecco come potete convertirvi uno sprite col KEFCON:
  297.  
  298. 1) Caricate il file IFF, che deve essere a 16 colori
  299. 2) Dovete selezionare solo lo sprite, per fare cio' premete il tasto destro,
  300. poi posizionatevi sull'angolo in alto a sinistra del futuro sprite, e premete
  301. il tasto sinistro. Muovendo il mouse vi apparira' una griglia che, guarda caso,
  302. e' divisa a strisce larghe 16 pixel. Potete comunque controllare la larghezza
  303. e la lunghezza del blocco selezionato. Per includere bene lo sprite dovete
  304. considerare che dovete passare per il bordo dello sprite con la "striscia" di
  305. selezione del rettangolo, l'ultima linea inclusa nel rettangolo e' quella che
  306. passa per la striscia di confine, non e' quella interna alla striscia:
  307.  
  308.     <----- 16 pixel ----->
  309.  
  310.     |========####========| /\
  311.     ||     ########        || ||
  312.     ||   ############   || ||
  313.     || ################ || ||
  314.     ||##################|| ||
  315.     ###################### ||
  316.     ###################### Lunghezza dello sprite, massimo 256 pixel
  317.     ###################### ||
  318.     ||##################|| ||
  319.     || ################ || ||
  320.     ||   ############   || ||
  321.     ||     ########     || ||
  322.     |========####========| \/
  323.  
  324.  
  325. Se lo sprite e' piu' piccolo di 16 pixel dovete lasciare un margine vuoto ai
  326. lati, o ad un solo lato, in modo che la larghezza del blocco sia sempre 16.
  327.  
  328. Una volta selezionato lo sprite dentro il rettangolo, occorre salvarlo come
  329. SPRITE16 se e' uno sprite a 16 colori, o come SPRITE4 se e' uno sprite a
  330. quattro colori. Lo sprite viene salvato in "dc.b", ossia in formato TESTO, che
  331. potete includere nel listato col comando "I" dell'Asmone o caricandolo in un
  332. altro buffer di testo e copiandolo con Amiga+b+c+i.
  333.  
  334. Ecco come il KEFCON salva lo sprite attacched (16 colori):
  335.  
  336.     dc.w $0000,$0000
  337.     dc.w $0380,$0650,$04e8,$07d0,$0534,$1868,$1e5c,$1636
  338.     dc.w $377e,$5514,$43a1,$1595,$0172,$1317,$6858,$5035
  339.     dc.w $318c,$0c65,$7453,$27c9,$5ece,$5298,$0bfe,$2c32
  340.     dc.w $005c,$13c4,$0be8,$0c18,$03e0,$03e0
  341.     dc.w 0,0
  342.  
  343.     dc.w $0000,$0000
  344.     dc.w $0430,$07f0,$0fc8,$0838,$0fe4,$101c,$39f2,$200e
  345.     dc.w $58f2,$600e,$5873,$600f,$5cf1,$600f,$1ff3,$600f
  346.     dc.w $4fe3,$701f,$47c7,$783f,$6286,$7d7e,$300e,$3ffe
  347.     dc.w $1c3c,$1ffc,$0ff8,$0ff8,$03e0,$03e0
  348.     dc.w 0,0
  349.  
  350. Come potete notare, questi sono i due sprite con le due word di controllo
  351. azzerate, i dati in formato esadecimale e le due word azzerate di FINE SPRITE.
  352. Basta mettere le due label "MIOSPRITE0:" e "MIOSPRITE1:" all'inizio dei due
  353. sprite, dopodiche' lavorando con MIOSPRITE+x per raggiungere i byte delle
  354. coordinate non occorre aggiungere altre LABEL. L'unico particolare e' che
  355. bisogna settare il bit dell'ATTACCHED con un BSET #7,MIOSPRITE+3 oppure
  356. direttamente nello sprite:
  357.  
  358. MIOSPRITE1:
  359.     dc.w $0000,$0080    ; $80, ossia %10000000 -> ATTACCHED!
  360.     dc.w $0430,$07f0,$0fc8,$0838,$0fe4,$101c,$39f2,$200e
  361.     ...
  362.  
  363. Se volete disegnarvi e convertirvi anche gli sprite a 4 colori, il problema non
  364. sussiste, perche' viene salvato un solo sprite e non occorre settare il bit!
  365.  
  366. Per quanto riguarda la palette dei colori degli sprite, bisogna salvarli dal
  367. KEFCON dopo aver salvato lo SPRITE16 o SPRITE4, con l'opzione COPPER, proprio
  368. come per le figure normali. Il problemuccio e' che viene salvata la palette
  369. intesa come FIGURA a 16 COLORI, e non come SPRITE.
  370. Ecco come il KEFCON salva la palette:
  371.  
  372.     dc.w $0180,$0000,$0182,$0ffc,$0184,$0eeb,$0186,$0cd9
  373.     dc.w $0188,$0ac8,$018a,$08b6,$018c,$06a5,$018e,$0494
  374.     dc.w $0190,$0384,$0192,$0274,$0194,$0164,$0196,$0154
  375.     dc.w $0198,$0044,$019a,$0033,$019c,$0012,$019e,$0001
  376.  
  377. I colori sono giusti, ma i registri colore si riferiscono ai primi 16 colori
  378. e non gli ultimi 16. Basta riscriverli "a mano" nei registri colore giusti:
  379.  
  380.     dc.w    $1A2,$FFC    ; color17, COLORE 1 per gli sprite attaccati
  381.     dc.w    $1A4,$EEB    ; color18, COLORE 2 per gli sprite attaccati
  382.     dc.w    $1A6,$CD9    ; color19, COLORE 3 per gli sprite attaccati
  383.     dc.w    $1A8,$AC8    ; color20, COLORE 4 per gli sprite attaccati
  384.     dc.w    $1AA,$8B6    ; color21, COLORE 5 per gli sprite attaccati
  385.     dc.w    $1AC,$6A5    ; color22, COLORE 6 per gli sprite attaccati
  386.     dc.w    $1AE,$494    ; color23, COLORE 7 per gli sprite attaccati
  387.     dc.w    $1B0,$384    ; color24, COLORE 7 per gli sprite attaccati
  388.     dc.w    $1B2,$274    ; color25, COLORE 9 per gli sprite attaccati
  389.     dc.w    $1B4,$164    ; color26, COLORE 10 per gli sprite attaccati
  390.     dc.w    $1B6,$154    ; color27, COLORE 11 per gli sprite attaccati
  391.     dc.w    $1B8,$044    ; color28, COLORE 12 per gli sprite attaccati
  392.     dc.w    $1BA,$033    ; color29, COLORE 13 per gli sprite attaccati
  393.     dc.w    $1BC,$012    ; color30, COLORE 14 per gli sprite attaccati
  394.     dc.w    $1BE,$001    ; color31, COLORE 15 per gli sprite attaccati
  395.  
  396. Si noti che in $1a2 bisogna copiare il colore in $182, in $1a4 quello in $184
  397. e cosi' via.
  398.  
  399. Provate a sostituire lo sprite a 16 colori di questo listato con uno vostro,
  400. con la vostra palette colori, e anche a convertirne uno a 4 colori da
  401. sostituire a quello delle lezioni precedenti. Farlo servira' da verifica!!!
  402.  
  403.