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

  1.  
  2. ; Lezione11l4.s     - Ondeggio della figura ottenuto cambiando ogni linea i
  3. ;           puntatori ai bitplanes, in piu' la sfumatura del color0
  4. ;           scorre verso l'alto.
  5.  
  6.     Section BITPLANEolljelly,code
  7.  
  8. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  9.  
  10. *****************************************************************************
  11.     include    "startup2.s"    ; salva interrupt, dma eccetera.
  12. *****************************************************************************
  13.  
  14.  
  15. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  16.  
  17.         ;5432109876543210
  18. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA abilitati
  19.  
  20. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  21.  
  22. scr_bytes    = 40    ; Numero di bytes per ogni linea orizzontale.
  23.             ; Da questa si calcola la larghezza dello schermo,
  24.             ; moltiplicando i bytes per 8: schermo norm. 320/8=40
  25.             ; Es. per uno schermo largo 336 pixel, 336/8=42
  26.             ; larghezze esempio:
  27.             ; 264 pixel = 33 / 272 pixel = 34 / 280 pixel = 35
  28.             ; 360 pixel = 45 / 368 pixel = 46 / 376 pixel = 47
  29.             ; ... 640 pixel = 80 / 648 pixel = 81 ...
  30.  
  31. scr_h        = 256    ; Altezza dello schermo in linee
  32. scr_x        = $81    ; Inizio schermo, posizione XX (normale $xx81) (129)
  33. scr_y        = $2c    ; Inizio schermo, posizione YY (normale $2cxx) (44)
  34. scr_res        = 1    ; 2 = HighRes (640*xxx) / 1 = LowRes (320*xxx)
  35. scr_lace    = 0    ; 0 = non interlace (xxx*256) / 1 = interlace (xxx*512)
  36. ham        = 0    ; 0 = non ham / 1 = ham
  37. scr_bpl        = 1    ; Numero Bitplanes
  38.  
  39. ; parametri calcolati automaticamente
  40.  
  41. scr_w        = scr_bytes*8        ; larghezza dello schermo
  42. scr_size    = scr_bytes*scr_h    ; dimensione in bytes dello schermo
  43. BPLC0    = ((scr_res&2)<<14)+(scr_bpl<<12)+$200+(scr_lace<<2)+(ham<<11)
  44. DIWS    = (scr_y<<8)+scr_x
  45. DIWSt    = ((scr_y+scr_h/(scr_lace+1))&255)<<8+(scr_x+scr_w/scr_res)&255
  46. DDFS    = (scr_x-(16/scr_res+1))/2
  47. DDFSt    = DDFS+(8/scr_res)*(scr_bytes/2-scr_res)
  48.  
  49.  
  50. START:
  51.     bsr.s    SetCop        ; Crea la copperlist
  52.  
  53.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  54.                     ; e sprites.
  55.     move.l    #COPPER,$80(a5)        ; Puntiamo la nostra COP
  56.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  57.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  58.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  59.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  60.  
  61. mouse:
  62.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  63.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  64. Waity1:
  65.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  66.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  67.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  68.     BNE.S    Waity1
  69.  
  70.     bsr.w    PrintCarattere    ; Stampa un carattere alla volta
  71.     BSR.w    SistemaCop    ; Copia i valori dalle tabelle alla cop
  72.     BSR.W    RoteaTabOndegg    ; Rotea i valori della tabella di ondeggio
  73.     BSR.W    RoteaTabColori    ; Rotea la tabella dei colori
  74.  
  75.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  76.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  77. Aspetta:
  78.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  79.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  80.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  81.     BEQ.S    Aspetta
  82.  
  83.     btst    #6,$bfe001    ; Mouse premuto?
  84.     bne.s    mouse
  85.     rts            ; esci
  86.  
  87. ;***************************************************************************
  88. ; Questa routine crea la copperlist e ci immette i primi valori
  89. ;***************************************************************************
  90.  
  91. ;               ° o·
  92. ;    ___   _)))  .  °
  93. ;    \ -\_/ (_.)  ·°
  94. ;     \-     ___)o·
  95. ;     /-/`-----'
  96. ;     ¯¯ g®m
  97.  
  98. SETCOP:
  99.     LEA    COPPER1,A0    ; Indirizzo effetto copper
  100.     MOVE.L    ADRCOL1(PC),A2    ; Puntatore alla tab colori
  101.     MOVE.L    #$2c07FFFE,D7    ; Wait (prima linea $30)
  102.     MOVE.L    #BITPLANE,D0    ; Indirizzo del bitplane
  103.     LEA    TABOSC(PC),A1    ; Tabella ondeggiamento
  104.     MOVEQ    #39-1,D5    ; Numero valori di tabella usabili per questo
  105.                 ; effetto. (nota: allora non e' facile capire
  106.                 ; quante linee in pratica e' lungo l'effetto,
  107.                 ; perche'occorre calcolare che ognuno di questi
  108.                 ; loop puo' ripetere la linea piu' volte.
  109. FaiEffetto:
  110.     MOVE.B    (A1)+,D6    ; Metti prossimo valore ondeggio in d6
  111.     TST.B    D6        ; dobbiamo tagliare gia' la linea?
  112.     BNE.S    RipuntaLinea    ; Se no, puntiamola...
  113.     ADDI.L    #40,D0        ; Oppure adda la lunghezza di 1 linea - punta
  114.                 ; alla linea seguente del bitplane
  115.     DBRA    D5,FaiEffetto    ; E continua il loop
  116.     BRA.w    FineEffetto
  117.  
  118. RipuntaLinea:
  119.     MOVE.L    D7,(A0)+    ; Metti il Wait in coplist
  120.     SWAP    D0        ; swappa l'indirizzo del plane
  121.     MOVE.W    #$E0,(A0)+    ; BPL1PTH
  122.     MOVE.W    D0,(A0)+    ; punta la word alta
  123.     SWAP    D0        ; swappa ancora l'indirizzo del plane
  124.     MOVE.W    #$E2,(A0)+    ; BPL1PTL
  125.     MOVE.W    D0,(A0)+    ; punta la word bassa
  126.     TST.W    (A2)        ; fine tab colori?
  127.     BNE.S    SETCOP2        ; Se non ancora, ok
  128.     MOVE.L    ADRCOL2(PC),A2    ; Altrimenti: tab colori -> riparti
  129. SETCOP2:
  130.     MOVE.W    #$180,(A0)+    ; registro color0
  131.     MOVE.W    (A2)+,(A0)+    ; valore del color0
  132.     ADDI.L    #$01000000,D7    ; Fai waitare una linea sotto
  133.     BCC.S    SETCOP3        ; Siamo arrivati a $FF? Se non ancora ok,
  134.     MOVE.L    #$FFDFFFFE,(A0)+ ; Altrimenti fine zona ntsc ($FF)
  135.     MOVE.L    #$0011FFFE,D7     ; E occorre mettere questi 2 wait.
  136. SETCOP3:
  137.     SUBQ.B    #1,D6    ; Subba il valore di "ripetizione linea" preso da
  138.             ; TABOSC.
  139.     TST.B    D6    ; Abbiamo ripetuto abbastanza volte la linea?
  140.     BNE.S    RipuntaLinea    ; Se non ancora, ripuntala, ripetendola
  141.  
  142.     ADDI.L    #40,D0        ; Altrimenti puntiamo piu' in basso di 1 linea
  143.     DBRA    D5,FaiEffetto    ; e vediamo di continuare l'effetto.
  144.  
  145. FineEffetto:
  146.     MOVE.L    #$01000200,(A0)+    ; Metti bplcon0 = no bitplanes
  147.     MOVE.L    #$FFFFFFFE,(A0)+    ; Metti la fine della copperlist
  148.     RTS
  149.  
  150. ;****************************************************************************
  151. ; Questa routine rotea i colori proprio nella tabella colori!
  152. ;****************************************************************************
  153.  
  154. ;     ______________
  155. ;     \    \__/    / 
  156. ;      \__________/
  157. ;      __|______|__
  158. ;    __(\___)(___/)__
  159. ;    \_\    \/    /_/
  160. ;       \ \____/ /
  161. ;        \______/ g®m
  162. ;
  163.  
  164. RoteaTabColori:
  165.     LEA    COLORSTAB(PC),A0    ; tabella colori
  166.     MOVE.W    (A0)+,D0        ; Salva il primo colore in d0
  167. RoteaTabColori2:
  168.     TST.W    (A0)        ; fine della tabella?
  169.     BNE.S    RoteaTabColori1        ; Se non ancora, ok
  170.     MOVE.W    D0,-2(A0)    ; altrimenti metti il primo colore come ultimo
  171.     RTS
  172.  
  173. RoteaTabColori1:
  174.     MOVE.W    (A0)+,-4(A0)    ; Sposta (rotea) il colore "indietro"
  175.     BRA.S    RoteaTabColori2
  176.  
  177. ;***************************************************************************
  178. ; Questa routine rotea i valori nella tabella "TABOSC"
  179. ;***************************************************************************
  180.  
  181. RoteaTabOndegg:
  182.     LEA    TABOSC(PC),A0    ; Indirizzo tabella
  183.     MOVEQ    #63-1,D7    ; Numero di valori nella tabella
  184.     MOVE.B    (A0),D0        ; Salva il primo valore in d0
  185. RoteaTabOndegg1:
  186.     MOVE.B    1(A0),(A0)+    ; sposta i valori "indietro".
  187.     DBRA    D7,RoteaTabOndegg1
  188.     MOVE.B    D0,-1(A0)    ; Rimetti il primo valore come ultimo
  189.     RTS
  190.  
  191. ;***************************************************************************
  192.  
  193. ADRCOL1:
  194.     DC.L    COLORSTAB
  195. ADRCOL2:
  196.     DC.L    COLORSTAB
  197.  
  198. COLORSTAB:
  199.     DC.W    $FC9,$EC9,$DC9,$CC9,$CB9,$CA9,$C99,$C9A,$C9B,$C9C
  200.     DC.W    $C9D,$C9E,$C9F,$B9F,$A9F,$99F,$9AF,$9BF,$9CF,$ACF
  201.     DC.W    $BCF,$CCF,$DCF,$ECF,$FCF,$FBF,$FAF,$F9F,$F9E,$F9D
  202.     DC.W    $F9C,$E9C,$D9C,$C9C,$CAC,$CBC,$CCC,$CDC,$CEC,$CFC
  203.     DC.W    $CFB,$CFA,$CF9,$BF9,$AF9,$9F9,$9FA,$9FB,$9FC,$AFC
  204.     DC.W    $BFC,$CFC,$DFC,$EFC,$FFC,$FEC,$FDC,$FCC,$FCB,$FCA
  205.     DC.W    0    ; con lo zero si termina la tabella
  206.  
  207. ;***************************************************************************
  208. ; La routine non e' altro che SETCOP senza le parti che scrivono i registri
  209. ; e i wait: si scrive solo il necessario.
  210. ; Questa routine agisce sulla copperlist che ridefinisce ad ogni linea i
  211. ; puntatori ai bitplanes. Leggendo da una tabella, sa di ogni linea della
  212. ; pic quante volte ripeterla, ossia ripuntarla. Se per esempio nella tabella
  213. ; ci sono i valori 1,2,3, allora puntera' la prima linea nella prima linea
  214. ; dello schermo (1 volta), poi puntera' la seconda linea 2 volte, e la terza
  215. ; linea 3 volte. Ecco un "disegnino":
  216. ;
  217. ; linea1
  218. ; linea2
  219. ; linea2
  220. ; linea3
  221. ; linea3
  222. ; linea3
  223. ;
  224. ; Notate che la fugura si allunga...
  225. ;***************************************************************************
  226.  
  227. ;     /) ________ (\
  228. ;    (__/        \__)
  229. ;      / ___  ___ \
  230. ;      \ \°_)(_°/ /
  231. ;       \__ `' __/
  232. ;        /      \
  233. ;        \("""")/g®m
  234. ;         ¯    ¯
  235.  
  236. SistemaCop:
  237.     LEA    COPPER1,A0    ; Indirizzo effetto copper
  238.     MOVE.L    ADRCOL1(PC),A2    ; Puntatore alla tab colori
  239.     MOVE.L    #$2c07FFFE,D7    ; Wait (prima linea $30)
  240.     MOVE.L    #BITPLANE,D0    ; Indirizzo del bitplane
  241.     LEA    TABOSC(PC),A1    ; Tabella ondeggiamento
  242.     MOVEQ    #39-1,D5    ; Numero valori di tabella usabili per questo
  243.                 ; effetto. (nota: allora non e' facile capire
  244.                 ; quante linee in pratica e' lungo l'effetto,
  245.                 ; perche'occorre calcolare che ognuno di questi
  246.                 ; loop puo' ripetere la linea piu' volte.
  247. FaiEffetto2:
  248.     MOVE.B    (A1)+,D6    ; Metti prossimo valore ondeggio in d6
  249.     TST.B    D6        ; dobbiamo tagliare gia' la linea?
  250.     BNE.S    RipuntaLinea2    ; Se no, puntiamola...
  251.     ADDI.L    #40,D0        ; Oppure adda la lunghezza di 1 linea - punta
  252.                 ; alla linea seguente del bitplane
  253.     DBRA    D5,FaiEffetto2    ; E continua il loop
  254.     BRA.w    FineEffetto2
  255.  
  256. RipuntaLinea2:
  257.     addq.w    #6,a0        ; Salta il WAIT e il BPL1PTH
  258.     SWAP    D0        ; swappa l'indirizzo del plane
  259.     MOVE.W    D0,(A0)+    ; punta la word alta
  260.     SWAP    D0        ; swappa ancora l'indirizzo del plane
  261.     addq.w    #2,a0        ; salta il BPL1PTL
  262.     MOVE.W    D0,(A0)+    ; punta la word bassa
  263.     TST.W    (A2)        ; fine tab colori?
  264.     BNE.S    SETCOP22    ; Se non ancora, ok
  265.     MOVE.L    ADRCOL2(PC),A2    ; Altrimenti: tab colori -> riparti
  266. SETCOP22:
  267.     addq.w    #2,a0        ; salta il registro color0
  268.     MOVE.W    (A2)+,(A0)+    ; valore del color0
  269.     ADDI.L    #$01000000,D7    ; Fai waitare una linea sotto
  270.     BCC.S    SETCOP32    ; Siamo arrivati a $FF? Se non ancora ok,
  271.     addq.w    #4,a0        ; Salta l'FFDFFFFE
  272.     MOVE.L    #$0011FFFE,D7     ; E occorre mettere questi 2 wait.
  273. SETCOP32:
  274.     SUBQ.B    #1,D6    ; Subba il valore di "ripetizione linea" preso da
  275.             ; TABOSC.
  276.     TST.B    D6    ; Abbiamo ripetuto abbastanza volte la linea?
  277.     BNE.S    RipuntaLinea2    ; Se non ancora, ripuntala, ripetendola
  278.  
  279.     ADDI.L    #40,D0        ; Altrimenti puntiamo piu' in basso di 1 linea
  280.     DBRA    D5,FaiEffetto2    ; e vediamo di continuare l'effetto.
  281.  
  282. FineEffetto2:
  283.     RTS
  284.  
  285. ;********************************************************************
  286.  
  287. ; Tab con 64 valori .byte. Indica per quante linee occorre ripetere la stessa
  288. ; linea. Per esempio, dove c'e' un valore 2, la linea e' ripetura 2 volte,
  289. ; ossia e' raddoppiata in altezza.
  290.  
  291. TABOSC:
  292.     DC.B    1,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9
  293.     DC.B    9,9,8,8,7,7,6,6,5,5,4,4,3,3,2,2
  294.     DC.B    2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9
  295.     DC.B    9,9,8,8,7,7,6,6,5,5,4,4,3,3,2,1
  296.  
  297.     EVEN
  298.  
  299. *****************************************************************************
  300. ;            Routine di Print
  301. *****************************************************************************
  302.  
  303. PRINTcarattere:
  304.     movem.l    d2/a0/a2-a3,-(SP)
  305.     MOVE.L    PuntaTESTO(PC),A0 ; Indirizzo del testo da stampare in a0
  306.     MOVEQ    #0,D2        ; Pulisci d2
  307.     MOVE.B    (A0)+,D2    ; Prossimo carattere in d2
  308.     CMP.B    #$ff,d2        ; Segnale di fine testo? ($FF)
  309.     beq.s    FineTesto    ; Se si, esci senza stampare
  310.     TST.B    d2        ; Segnale di fine riga? ($00)
  311.     bne.s    NonFineRiga    ; Se no, non andare a capo
  312.  
  313.     ADD.L    #40*7,PuntaBITPLANE    ; ANDIAMO A CAPO
  314.     ADDQ.L    #1,PuntaTesto        ; primo carattere riga dopo
  315.                     ; (saltiamo lo ZERO)
  316.     move.b    (a0)+,d2        ; primo carattere della riga dopo
  317.                     ; (saltiamo lo ZERO)
  318.  
  319. NonFineRiga:
  320.     SUB.B    #$20,D2        ; TOGLI 32 AL VALORE ASCII DEL CARATTERE, IN
  321.                 ; MODO DA TRASFORMARE, AD ESEMPIO, QUELLO
  322.                 ; DELLO SPAZIO (che e' $20), in $00, quello
  323.                 ; DELL'ASTERISCO ($21), in $01...
  324.     LSL.W    #3,D2        ; MOLTIPLICA PER 8 IL NUMERO PRECEDENTE,
  325.                 ; essendo i caratteri alti 8 pixel
  326.     MOVE.L    D2,A2
  327.     ADD.L    #FONT,A2    ; TROVA IL CARATTERE DESIDERATO NEL FONT...
  328.  
  329.     MOVE.L    PuntaBITPLANE(PC),A3 ; Indir. del bitplane destinazione in a3
  330.  
  331.                 ; STAMPIAMO IL CARATTERE LINEA PER LINEA
  332.     MOVE.B    (A2)+,(A3)    ; stampa LA LINEA 1 del carattere
  333.     MOVE.B    (A2)+,40(A3)    ; stampa LA LINEA 2  " "
  334.     MOVE.B    (A2)+,40*2(A3)    ; stampa LA LINEA 3  " "
  335.     MOVE.B    (A2)+,40*3(A3)    ; stampa LA LINEA 4  " "
  336.     MOVE.B    (A2)+,40*4(A3)    ; stampa LA LINEA 5  " "
  337.     MOVE.B    (A2)+,40*5(A3)    ; stampa LA LINEA 6  " "
  338.     MOVE.B    (A2)+,40*6(A3)    ; stampa LA LINEA 7  " "
  339.     MOVE.B    (A2)+,40*7(A3)    ; stampa LA LINEA 8  " "
  340.  
  341.     ADDQ.L    #1,PuntaBitplane ; avanziamo di 8 bit (PROSSIMO CARATTERE)
  342.     ADDQ.L    #1,PuntaTesto    ; prossimo carattere da stampare
  343.  
  344. FineTesto:
  345.     movem.l    (SP)+,d2/a0/a2-a3
  346.     RTS
  347.  
  348.  
  349. PuntaTesto:
  350.     dc.l    TESTO
  351.  
  352. PuntaBitplane:
  353.     dc.l    BITPLANE
  354.  
  355. ;    $00 per "fine linea" - $FF per "fine testo"
  356.  
  357.         ; numero caratteri per linea: 40
  358. TESTO:         ;          1111111111222222222233333333334
  359.              ;   1234567890123456789012345678901234567890
  360.     dc.b    '  * * * * * * * * * * * * * * * * *     ',0 ; 1
  361.     dc.b    '  * MAMMA MIA MI BALLA            *     ',0 ; 2
  362.     dc.b    '  *                    LO SCHERMO *     ',0 ; 3
  363.     dc.b    '  * * * * * * * * * * * * * * * * *     ',$FF ; 4
  364.  
  365.     EVEN
  366.  
  367. ;    Il FONT caratteri 8x8 copiato in CHIP dalla CPU e non dal blitter,
  368. ;    per cui puo' stare anche in fast ram. Anzi sarebbe meglio!
  369.  
  370. FONT:
  371.     incbin    "assembler2:sorgenti4/nice.fnt"
  372.  
  373. ;********************************************************************
  374. ;                COPPERLIST
  375. ;********************************************************************
  376.  
  377.     section    cooppera,data_C
  378.  
  379. COPPER:
  380.     dc.w    $8e,DIWS    ; DiwStrt
  381.     dc.w    $90,DIWSt    ; DiwStop
  382.     dc.w    $92,DDFS    ; DdfStart
  383.     dc.w    $94,DDFSt    ; DdfStop
  384.     dc.w    $100,BPLC0    ; BplCon0
  385.     dc.w    $108,0        ; bpl1mod
  386.     dc.w    $10a,0        ; bpl2mod
  387.     DC.w    $182,$000    ; Color1 (scritte) - NERO
  388. COPPER1:
  389.     DCB.b    4000,0    ; Attenzione! La lunghezza dell'effetto dipende
  390.             ; dalla tabella TABOSC e non e' facile calcolarla...
  391.     DC.L    $FFFFFFFE
  392.  
  393. ;********************************************************************
  394. ;    Il bitplane
  395. ;********************************************************************
  396.     section    bitplane,bss_C
  397.  
  398. BITPLANE:
  399.     ds.b    40*320
  400.  
  401.     end
  402.  
  403. Abbiamo visto prima un effetto simile fatto cambiando i moduli, ora cambiando
  404. invece i bplpointers. Questo sistema e' piu' lento di quello con i moduli se
  405. si devono cambiare ogni linea i puntatori di molti bitplanes, ma ogni plane
  406. potrebbe essere definito in maniera diversa per andare per i fatti suoi,
  407. invcece il bplmod coinvolge tutti plane pari e/o dispari.
  408. Una particolarita' di questo sorgente e' che i valori delle tabelle per i plane
  409. e dei colori non sono "roteati" rileggendoli dalle cop e spostandoli, ma
  410. roteando i valori nelle tabelle stesse, per cui basta copiare ogni volta dalla
  411. tabella alla copperlist, dopo che la tabella e' stata "roteata".
  412. Questo sistema e' piu' veloce di altri quando si possiede fast ram ,in quanto
  413. se si dovesse leggere da copperlist il valore e riscriverlo piu' avanti o
  414. indietro, dovremmo accedere 2 volte alla CHIP RAM, con i relativi "ritardi",
  415. mentre nel nostro caso accediamo alla tabella in FAST, con perdita di tempo
  416. minima, e scriviamo solo una volta per colore/plane in CHIP. Su computer come
  417. A4000 l'unico rallentamento e' dato dalla lettura/scrittura in CHIP RAM,
  418. dunque la velocita' dell'esecuzione della routine raddoppia.
  419.