home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti9 / lezione15e.s < prev    next >
Text File  |  1995-04-26  |  9KB  |  245 lines

  1.  
  2. ; Lezione15e.s    - Visualiziamo la prima pic in ham8 a 256000 possibili colori.
  3. ;          DA NOTARE CHE BASTA SETTARE 64 REGISTRI COLORE PER LA
  4. ;          PALETTE, I RESTANTI 192 SONO IGNORATI.
  5.  
  6.     SECTION    AgaRulez,CODE
  7.  
  8. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  9.  
  10. *****************************************************************************
  11.     include    "startup2.s"    ; Salva Copperlist Etc.
  12. *****************************************************************************
  13.  
  14.         ;5432109876543210
  15. DMASET    EQU    %1000001110000000    ; copper, bitplane DMA
  16.  
  17. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  18.  
  19. START:
  20.  
  21. ;    Puntiamo la pic AGA
  22.  
  23.     MOVE.L    #PICTURE,d0
  24.     LEA    BPLPOINTERS,A1
  25.     MOVEQ    #8-1,D7        ; num. bitplanes
  26. POINTB:
  27.     move.w    d0,6(a1)
  28.     swap    d0
  29.     move.w    d0,2(a1)
  30.     swap    d0
  31.     addi.l    #80*100,d0    ; Lunghezza di un bitplane
  32.     addq.w    #8,a1
  33.     dbra    d7,POINTB        ;Rifai D1 volte (D1=num of bitplanes)
  34.  
  35.     bsr.s    MettiColori
  36.  
  37.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  38.     move.l    #CopList,$80(a5)    ; Puntiamo la nostra COP
  39.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  40.     move.w    #0,$1fc(a5)        ; Fmode azzerato, burst normale
  41.     move.w    #$c00,$106(a5)        ; BPLCON3 resettato
  42.     move.w    #$11,$10c(a5)        ; BPLCON4 resettato
  43.  
  44. LOOP:
  45.     BTST    #6,$BFE001    ; aspetta il mouse
  46.     BNE.S    LOOP
  47.     RTS
  48.  
  49.  
  50. ; Questa routine, che e' presente anche nella mia demo WORLD OF MANGA, serve
  51. ; per leggere la palette a 24 bit, in questo caso inclusa con un INCBIN
  52. ; In pratica converte ogni colore a 24 bit, che si presenta nel formato di
  53. ; una long $00RrGgBb, dove R = nibble alto di RED, r = nibble basso di RED,
  54. ; G = nibble alto di GREEN eccetera, nel formato della copperlist aga, ossia
  55. ; in due word $0RGB con i nibble alti e $0rgb con i nibble bassi.
  56.  
  57. MettiColori:
  58.     LEA    LogoPal(PC),A0        ; indirizzo della color palette 
  59.     LEA    COLP0+2,A1        ; Indirizzo del primo registro
  60.                     ; settato per i nibble ALTI
  61.     LEA    COLP0B+2,A2        ; Indirizzo del primo registro
  62.                     ; settato per i nibble BASSI
  63.     MOVEQ    #2-1,d7            ; 2 banchi da 32 registri ciascuno
  64.                     ; *NOTA: IN HAM8 BASTA DEFINIRE UNA
  65.                     ; PALETTE DI 64 COLORI! GLI ALTRI
  66.                     ; REGISTRI COLORE DAL 65 AL 255 SONO
  67.                     ; IGNORATI TOTALMENTE!
  68. ConvertiPaletteBank:
  69.     moveq    #0,d0
  70.     moveq    #0,d2
  71.     moveq    #0,d3
  72.     moveq    #32-1,d6    ; 32 registri colore per banco
  73.  
  74. DaLongARegistri:    ; loop che trasforma i colori $00RrGgBb.l nelle 2
  75.             ; word $0RGB, $0rgb adatte ai registri copper.
  76.  
  77. ; Conversione dei nibble bassi da $00RgGgBb (long) al colore aga $0rgb (word)
  78.  
  79.     MOVE.B    1(A0),(a2)    ; Byte alto del colore $00Rr0000 copiato
  80.                 ; nel registro cop per nibble bassi
  81.     ANDI.B    #%00001111,(a2) ; Seleziona solo il nibble BASSO ($0r)
  82.     move.b    2(a0),d2    ; Prendi il byte $0000Gg00 dal colore a 24bit
  83.     lsl.b    #4,d2        ; Sposta a sinistra di 4 bit il nibble basso
  84.                 ; del GREEN, "trasformandolo" in nibble alto
  85.                 ; di del byte basso di D2 ($g0)
  86.     move.b    3(a0),d3    ; Prendi il byte $000000Bb dal colore a 24bit
  87.     ANDI.B    #%00001111,d3    ; Seleziona solo il nibble BASSO ($0b)
  88.     or.b    d2,d3        ; "FONDI" i nibble bassi di green e blu...
  89.     move.b    d3,1(a2)    ; Formando il byte basso finale $gb da mettere
  90.                 ; nel registro colore, dopo il byte $0r, per
  91.                 ; formare la word $0rgb dei nibble bassi
  92.  
  93. ; Conversione dei nibble alti da $00RgGgBb (long) al colore aga $0RGB (word)
  94.  
  95.     MOVE.B    1(A0),d0    ; Byte alto del colore $00Rr0000 in d0
  96.     ANDI.B    #%11110000,d0    ; Seleziona solo il nibble ALTO ($R0)
  97.     lsr.b    #4,d0        ; Shifta a destra di 4 bit il nibble, in modo
  98.                 ; che diventi il nibble basso del byte ($0R)
  99.     move.b    d0,(a1)        ; Copia il byte alto $0R nel color register
  100.     move.b    2(a0),d2    ; Prendi il byte $0000Gg00 dal colore a 24bit
  101.     ANDI.B    #%11110000,d2    ; Seleziona solo il nibble ALTO ($G0)
  102.     move.b    3(a0),d3    ; Prendi il byte $000000Bb dal colore a 24 bit
  103.     ANDI.B    #%11110000,d3    ; Seleziona solo il nibble ALTO ($B0)
  104.     lsr.b    #4,d3        ; Shiftalo di 4 bit a destra trasformandolo in
  105.                 ; nibble basso del byte basso di d3 ($0B)
  106.     ori.b    d2,d3        ; Fondi i nibble alti di green e blu ($G0+$0B)
  107.     move.b    d3,1(a1)    ; Formando il byte basso finale $GB da mettere
  108.                 ; nel registro colore, dopo il byte $0R, per
  109.                 ; formare la word $0RGB dei nibble alti.
  110.  
  111.     addq.w    #4,a0        ; Saltiamo al prossimo colore .l della palette
  112.                 ; attaccata in fondo alla pic
  113.     addq.w    #4,a1        ; Saltiamo al prossimo registro colore per i
  114.                 ; nibble ALTI in Copperlist
  115.     addq.w    #4,a2        ; Saltiamo al prossimo registro colore per i
  116.                 ; nibble BASSI in Copperlist
  117.  
  118.     dbra    d6,DaLongARegistri
  119.  
  120.     add.w    #(128+8),a1    ; salta i registri colore + il dc.w $106,xxx
  121.                 ; dei nibble ALTI
  122.     add.w    #(128+8),a2    ; salta i registri colore + il dc.w $106,xxx
  123.                 ; dei nibble BASSI
  124.  
  125.     dbra    d7,ConvertiPaletteBank    ; Converte un banco da 32 colori per
  126.     rts                ; loop. 8 loop per i 256 colori.
  127.  
  128. ; Palette salvata in binario con il PicCon (opzioni: save as binary, non cop)
  129. ; NOTA: ESSENDO LA PALETTE DI UNA PIC HAM, CONTIENE SOLO 64 COLORI, NON 256.
  130.  
  131. LogoPal:
  132.     incbin    "pic640x100xham8.pal"
  133.  
  134. ;*****************************************************************************
  135. ;*                COPPERLIST                     *
  136. ;*****************************************************************************
  137.  
  138.     CNOP    0,8    ; Allineo a 64 bit
  139.  
  140.     section    coppera,data_C
  141.  
  142. COPLIST:
  143.     dc.w    $8E,$2c81    ; DiwStrt
  144.     dc.w    $90,$2cc1    ; DiwStop
  145.  
  146. ; Nota: il ddfstart/stop HIRES sarebbero $003c e $00d4, ma con il burst attivo
  147. ; va bene lo stesso valore del LOWRES, ossia $0038 e $00d0.
  148.  
  149.     dc.w    $92,$0038    ; DdfStart
  150.     dc.w    $94,$00d0    ; DdfStop
  151.     dc.w    $102,0        ; BplCon1
  152.     dc.w    $104,0        ; BplCon2
  153.     dc.w    $108,-8        ; Bpl1Mod (burst 64bit, modulo=modulo-8)
  154.     dc.w    $10a,-8        ; Bpl2Mod (come sopra)
  155.  
  156.             ; 5432109876543210
  157.     dc.w    $100,%1000101000010001    ; 8 bitplane HIRES 640x256 HAM8. Per
  158.                     ; settare 8 planes setto il bit 4 e
  159.                     ; azzero i bit 12,13,14. Il bit 0 e'
  160.                     ; settato dato che abilita molte
  161.                     ; funzioni AGA che vedremo dopo.
  162.                     ; Settando il bit 11 attivo l'HAM8
  163.  
  164.     dc.w    $1fc,3        ; Burst mode a 64 bit
  165.  
  166. ; Il RAW e' salvato con PicCon, dunque si puo' puntare normalmente.
  167.  
  168. BPLPOINTERS:
  169.     dc.w $e0,0,$e2,0    ; primo     bitplane
  170.     dc.w $e4,0,$e6,0    ; secondo       "
  171.     dc.w $e8,0,$ea,0    ; terzo           "
  172.     dc.w $ec,0,$ee,0    ; quarto       "
  173.     dc.w $f0,0,$f2,0    ; quinto       "
  174.     dc.w $f4,0,$f6,0    ; sesto           "
  175.     dc.w $f8,0,$fA,0    ; settimo       "
  176.     dc.w $fC,0,$fE,0    ; ottavo       "
  177.  
  178. ; Questo e' l'ordine dei bitplanes se salvate il RAW con AgaConv
  179. ;
  180. ;    dc.w $e8,0,$ea,0    ; terzo           bitplane
  181. ;    dc.w $ec,0,$ee,0    ; quarto       "
  182. ;    dc.w $f0,0,$f2,0    ; quinto       "
  183. ;    dc.w $f4,0,$f6,0    ; sesto           "
  184. ;    dc.w $f8,0,$fA,0    ; settimo       "
  185. ;    dc.w $fC,0,$fE,0    ; ottavo       "
  186. ;    dc.w $e0,0,$e2,0    ; primo        "
  187. ;    dc.w $e4,0,$e6,0    ; secondo       "
  188.  
  189.  
  190. ; In questo caso la palette viene aggiornata da una routine, per cui basta
  191. ; lasciare azzerati i valori dei registri.
  192.  
  193. ; *NOTA: IN HAM8 BASTA DEFINIRE 64 COLORI, NON TUTTI E 255!!!!!
  194.  
  195.     DC.W    $106,$c00    ; SELEZIONA PALETTE 0 (0-31), NIBBLE ALTI
  196. COLP0:
  197.     DC.W    $180,0,$182,0,$184,0,$186,0,$188,0,$18A,0,$18C,0,$18E,0
  198.     DC.W    $190,0,$192,0,$194,0,$196,0,$198,0,$19A,0,$19C,0,$19E,0
  199.     DC.W    $1A0,0,$1A2,0,$1A4,0,$1A6,0,$1A8,0,$1AA,0,$1AC,0,$1AE,0
  200.     DC.W    $1B0,0,$1B2,0,$1B4,0,$1B6,0,$1B8,0,$1BA,0,$1BC,0,$1BE,0
  201.  
  202.     DC.W    $106,$e00    ; SELEZIONA PALETTE 0 (0-31), NIBBLE BASSI
  203. COLP0B:
  204.     DC.W    $180,0,$182,0,$184,0,$186,0,$188,0,$18A,0,$18C,0,$18E,0
  205.     DC.W    $190,0,$192,0,$194,0,$196,0,$198,0,$19A,0,$19C,0,$19E,0
  206.     DC.W    $1A0,0,$1A2,0,$1A4,0,$1A6,0,$1A8,0,$1AA,0,$1AC,0,$1AE,0
  207.     DC.W    $1B0,0,$1B2,0,$1B4,0,$1B6,0,$1B8,0,$1BA,0,$1BC,0,$1BE,0
  208.  
  209.     DC.W    $106,$2C00    ; SELEZIONA PALETTE 1 (32-63), NIBBLE ALTI
  210.  
  211.     DC.W    $180,0,$182,0,$184,0,$186,0,$188,0,$18A,0,$18C,0,$18E,0
  212.     DC.W    $190,0,$192,0,$194,0,$196,0,$198,0,$19A,0,$19C,0,$19E,0
  213.     DC.W    $1A0,0,$1A2,0,$1A4,0,$1A6,0,$1A8,0,$1AA,0,$1AC,0,$1AE,0
  214.     DC.W    $1B0,0,$1B2,0,$1B4,0,$1B6,0,$1B8,0,$1BA,0,$1BC,0,$1BE,0
  215.  
  216.     DC.W    $106,$2E00    ; SELEZIONA PALETTE 1 (32-63), NIBBLE BASSI
  217.  
  218.     DC.W    $180,0,$182,0,$184,0,$186,0,$188,0,$18A,0,$18C,0,$18E,0
  219.     DC.W    $190,0,$192,0,$194,0,$196,0,$198,0,$19A,0,$19C,0,$19E,0
  220.     DC.W    $1A0,0,$1A2,0,$1A4,0,$1A6,0,$1A8,0,$1AA,0,$1AC,0,$1AE,0
  221.     DC.W    $1B0,0,$1B2,0,$1B4,0,$1B6,0,$1B8,0,$1BA,0,$1BC,0,$1BE,0
  222.  
  223.     dc.w    $9007,$fffe    ; aspetta la fine del logo
  224.     dc.w    $100,$200    ; zero bitplanes
  225.  
  226.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  227.  
  228. ;******************************************************************************
  229.  
  230. ; Figura RAW ad 8 bitplanes, in HAM8.
  231.  
  232.     CNOP    0,8    ; allineo a 64 bit
  233.  
  234. PICTURE:
  235.     INCBIN    "pic640x100xham8.RAW"
  236.  
  237.     end
  238.  
  239. La particolarta' che avrete notato, e' che la palette e' composta da solo
  240. 64 colori. Basta settare il bit 11 di bplcon0, quello dell'HAM, e il gioco
  241. e' fatto. Non dimenticatevi il particolare dello scambio dei bitplanes 
  242. (puntandoli come nell'esempio in copperlist) nel caso che salviate il RAW con
  243. un Iffconverter che non li scambia da solo, come invece fa il PicCon.
  244.  
  245.