home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti6 / lezione10i1.s < prev    next >
Text File  |  1995-10-23  |  11KB  |  339 lines

  1.  
  2. ; Lezione10i1.s    Sine-scroller da 2 pixel
  3. ;        Tasto sinistro per uscire.
  4.  
  5.     SECTION    CiriCop,CODE
  6.  
  7. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  8.  
  9. *****************************************************************************
  10.     include    "startup1.s"    ; Salva Copperlist Etc.
  11. *****************************************************************************
  12.  
  13.         ;5432109876543210
  14. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA
  15.  
  16.  
  17. START:
  18.  
  19.     MOVE.L    #BITPLANE,d0    ; dove puntare
  20.     LEA    BPLPOINTERS,A1    ; puntatori COP
  21.  
  22.     move.w    d0,6(a1)
  23.     swap    d0
  24.     move.w    d0,2(a1)
  25.     swap    d0
  26.  
  27.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  28.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  29.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  30.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  31.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  32.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  33.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  34.  
  35.     lea    testo(pc),a0        ; punta al testo dello scrolltext
  36.  
  37. mouse:
  38.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  39.     MOVE.L    #$10800,d2    ; linea da aspettare = $108
  40. Waity1:
  41.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  42.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  43.     CMPI.L    D2,D0        ; aspetta la linea $108
  44.     BNE.S    Waity1
  45. Waity2:
  46.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  47.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  48.     CMPI.L    D2,D0        ; aspetta la linea $108
  49.     Beq.S    Waity2
  50.  
  51.     bsr.s    printchar    ; routine che stampa i nuovi chars
  52.     bsr.s    Scorri        ; esegui la routine di scorrimento
  53.  
  54.     bsr.w    CancellaSchermo    ; pulisci lo schermo
  55.     bsr.w    Sine        ; esegui il sine-scroll
  56.  
  57.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  58.     bne.s    mouse        ; se no, torna a mouse2:
  59.     rts
  60.  
  61. ;****************************************************************************
  62. ; Questa routine stampa un carattere. Il carattere viene stampato in una
  63. ; parte di schermo invisibile.
  64. ; A0 punta al testo da stampare.
  65. ;****************************************************************************
  66.  
  67. PRINTCHAR:
  68.     subq.w    #1,contatore    ; diminuisci il contatore di 1
  69.     bne.s    NoPrint        ; se e` diverso da 0, non stampiamo,
  70.     move.w    #16,contatore    ; altrimenti si; reinizializza il contatore
  71.  
  72.     MOVEQ    #0,D2        ; Pulisci d2
  73.     MOVE.B    (A0)+,D2    ; Prossimo carattere in d2
  74.     bne.s    noreset        ; Se e` diverso da 0 stampalo,
  75.     lea    testo(pc),a0    ; altrimenti ricomincia il testo daccapo
  76.     MOVE.B    (A0)+,D2    ; Primo carattere in d2
  77. noreset
  78.     SUB.B    #$20,D2        ; TOGLI 32 AL VALORE ASCII DEL CARATTERE, IN
  79.                 ; MODO DA TRASFORMARE, AD ESEMPIO, QUELLO
  80.                 ; DELLO SPAZIO (che e' $20), in $00, quello
  81.                 ; DELL'ASTERISCO ($21), in $01...
  82.     ADD.L    D2,D2        ; MOLTIPLICA PER 2 IL NUMERO PRECEDENTE,
  83.                 ; perche` ogni carattere e` largo 16 pixel
  84.     MOVE.L    D2,A2
  85.  
  86.     ADD.L    #FONT,A2    ; TROVA IL CARATTERE DESIDERATO NEL FONT...
  87.  
  88.     btst    #6,$02(a5)    ; dmaconr - aspetta che il blitter finisca
  89. waitblit:
  90.     btst    #6,$02(a5)
  91.     bne.s    waitblit
  92.  
  93.     move.l    #$09f00000,$40(a5)    ; BLTCON0: copia da A a D
  94.     move.l    #$ffffffff,$44(a5)    ; BLTAFWM e BLTALWM li spieghiamo dopo
  95.  
  96.     move.l    a2,$50(a5)            ; BLTAPT: indirizzo font
  97.     move.l    #buffer+40,$54(a5)        ; BLTDPT: indirizzo bitplane
  98.                         ; fisso, fuori dalla parte
  99.                         ; visibile dello schermo.
  100.     move    #120-2,$64(a5)            ; BLTAMOD: modulo font
  101.     move    #42-2,$66(a5)            ; BLTDMOD: modulo bit planes
  102.     move    #(20<<6)+1,$58(a5)         ; BLTSIZE: font 16*20
  103. NoPrint:
  104.     rts
  105.  
  106. contatore
  107.     dc.w    16
  108.  
  109. ;****************************************************************************
  110. ; Questa routine fa scorrere il testo verso sinistra
  111. ;****************************************************************************
  112.  
  113. Scorri:
  114.  
  115. ; Gli indirizzi sorgente e destinazione sono uguali.
  116. ; Shiftiamo verso sinistra, quindi usiamo il modo discendente.
  117.  
  118.     move.l    #buffer+((21*20)-1)*2,d0    ; ind. sorgente e
  119.                         ; destinazione
  120. ScorriLoop:
  121.     btst    #6,2(a5)        ; aspetta che il blitter finisca
  122. waitblit2:
  123.     btst    #6,2(a5)
  124.     bne.s    waitblit2
  125.  
  126.     move.l    #$19f00002,$40(a5)    ; BLTCON0 e BLTCON1 - copia da A a D
  127.                     ; con shift di un pixel
  128.  
  129.     move.l    #$ffff7fff,$44(a5)    ; BLTAFWM e BLTALWM
  130.                     ; BLTAFWM = $ffff - passa tutto
  131.                     ; BLTALWM = $7fff = %0111111111111111
  132.                     ;   cancella il bit piu` a sinistra
  133. ; carica i puntatori
  134.  
  135.     move.l    d0,$50(a5)            ; bltapt - sorgente
  136.     move.l    d0,$54(a5)            ; bltdpt - destinazione
  137.  
  138. ; facciamo scorrere un immagine larga tutto lo schermo, quindi
  139. ; il modulo e` azzerato.
  140.  
  141.     move.l    #$00000000,$64(a5)        ; bltamod e bltdmod 
  142.     move.w    #(20*64)+21,$58(a5)        ; bltsize
  143.                         ; altezza 20 linee, largo 21
  144.     rts                    ; words (tutto lo schermo)
  145.  
  146.  
  147. ;****************************************************************************
  148. ; Questa routine realizza l'effetto sine-scroll. Attenzione a BLTALWM, perche'
  149. ; e' il registro dove ogni volta selezioniamo la "fettina" o "striscina"
  150. ; verticale su cui operare.
  151. ;****************************************************************************
  152.  
  153. ;      ,-~~-.___.
  154. ;     / |  '     \
  155. ;    (  )         0
  156. ;     \_/-, ,----'
  157. ;        ====           //
  158. ;       /  \-'~;    /~~~(O)
  159. ;      /  __/~|   /       |
  160. ;    =(  _____| (_________|   W<
  161.  
  162. Sine:
  163.     lea    buffer,a2        ; puntatore al buffer contenente
  164.                     ; lo scrolltext
  165.     lea    bitplane,a1        ; puntatore alla destinazione
  166.  
  167.     lea    Sinustab(pc),a3        ; indirizzo tabella seno, con valori
  168.                     ; gia' moltiplicati * 42, per poterli
  169.                     ; addizionare direttamente all'address
  170.                     ; del bitplane.
  171.  
  172.     move.w    #$C000,d5        ; valore iniziale maschera
  173.     moveq    #20-1,d6        ; ripeti per tutte le word dello schero
  174. FaiUnaWord:
  175.     moveq    #8-1,d7            ; routine da 2 pixel. Per ogni word
  176.                     ; ci sono 8 "fettine" da 2 pixel
  177. FaiUnaColonna:
  178.     move.w    (a3)+,d0        ; legge un valore dalla tabella
  179.     cmp.l    #EndSinustab,a3        ; se siamo alla fine della tabella
  180.     blo.s    nostartsine        ; ricomincia da capo
  181.     lea    sinustab(pc),a3
  182. nostartsine:
  183.     move.l    a1,a4            ; copia indirizzo bitplane
  184.     add.w    d0,a4            ; aggiunge la coordinata Y, offset
  185.                     ; preso dalla sintab...
  186.  
  187.     btst    #6,2(a5)        ; aspetta che il blitter finisca
  188. waitblit_sine:
  189.     btst    #6,2(a5)
  190.     bne.s    waitblit_sine
  191.  
  192.     move.w    #$ffff,$44(a5)        ; BLTAFWM
  193.     move.w    d5,$46(a5)        ; BLTALWM - contiene la maschera che
  194.                     ; seleziona le "fettine" di scrolltext
  195.  
  196.     move.l    #$0bfa0000,$40(a5)    ; BLTCON0/BLTCON1 - attiva A,C,D
  197.                     ; D=A OR C
  198.  
  199.     move.w    #$0028,$60(a5)        ; BLTCMOD=42-2=$28
  200.     move.l    #$00280028,$64(a5)    ; BLTAMOD=42-2=$28
  201.                     ; BLTDMOD=42-2=$28
  202.  
  203.     move.l    a2,$50(a5)        ; BLTAPT  (al buffer)
  204.     move.l    a4,$48(a5)        ; BLTCPT  (allo schermo)
  205.     move.l    a4,$54(a5)        ; BLTDPT  (allo schermo)
  206.     move.w    #(64*20)+1,$58(a5)    ; BLTSIZE (blitta un rettangolo
  207.                     ; alto 20 righe e largo 1 word)
  208.  
  209.     ror.w    #2,d5            ; spostati alla "fettina" successiva
  210.                     ; va a destra e dopo l'ultima "fettina"
  211.                     ; di una word ricomincia dalla prima
  212.                     ; della word seguente.
  213.                     ; per lo scroll da 2 pixel ogni
  214.                     ; "fettina" e` larga 2 pixel
  215.  
  216.     dbra    d7,FaiUnaColonna
  217.  
  218.     addq.w    #2,a2            ; punta alla word seguente
  219.     addq.w    #2,a1            ; punta alla word seguente
  220.     dbra    d6,FaiUnaWord
  221.     rts
  222.  
  223. ; Questo e` il testo. con lo 0 si termina. Il font usato ha solo i caratteri
  224. ; maiuscoli, attenzione!
  225.  
  226. testo:
  227.     dc.b    " ECCO COME SINUSCROLLARE... IL FONT E' DI 16*20 PIXEL!..."
  228.     dc.b    " LO SCROLL AVVIENE CON TRANQUILLITA'...",0
  229.     even
  230.  
  231. ;****************************************************************************
  232. ; Questa routine cancella lo schermo mediante il blitter.
  233. ; Viene cancellata solo la parte di schermo sulla quale scorre il testo:
  234. ; dalla riga 130 alla riga 193
  235. ;****************************************************************************
  236.  
  237. CancellaSchermo:
  238.     btst    #6,2(a5)
  239. WBlit3:
  240.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  241.     bne.s    wblit3
  242.  
  243.     move.l    #$01000000,$40(a5)    ; BLTCON0 e BLTCON1: Cancella
  244.     move    #$0000,$66(a5)        ; BLTDMOD=0
  245.     move.l    #bitplane+42*130,$54(a5)    ; BLTDPT
  246.     move.w    #(64*63)+20,$58(a5)    ; BLTSIZE (via al blitter !)
  247.                     ; cancella dalla riga 130
  248.                     ; fino alla riga 193
  249.     rts
  250.  
  251. ;***************************************************************************
  252. ; Questa e` la tabella che contiene i valori delle posizioni verticali
  253. ; dello scrolltext. Le posizioni sono gia` moltiplicate per 42, quindi
  254. ; possono essere addizionate direttamente all'indirizzo del BITPLANE
  255. ;***************************************************************************
  256.  
  257. Sinustab:
  258.     DC.W    $18C6,$191A,$1944,$1998,$19EC,$1A16,$1A6A,$1A94,$1AE8,$1B12
  259.     DC.W    $1B3C,$1B66,$1B90,$1BBA,$1BBA,$1BE4,$1BE4,$1BE4,$1BE4,$1BE4
  260.     DC.W    $1BBA,$1BBA,$1B90,$1B66,$1B3C,$1B12,$1AE8,$1A94,$1A6A,$1A16
  261.     DC.W    $19EC,$1998,$1944,$191A,$18C6,$1872,$181E,$17F4,$17A0,$174C
  262.     DC.W    $1722,$16CE,$16A4,$1650,$1626,$15FC,$15D2,$15A8,$157E,$157E
  263.     DC.W    $1554,$1554,$1554,$1554,$1554,$157E,$157E,$15A8,$15D2,$15FC
  264.     DC.W    $1626,$1650,$16A4,$16CE,$1722,$174C,$17A0,$17F4,$181E,$1872
  265. EndSinustab:
  266.  
  267. ;****************************************************************************
  268.  
  269.     SECTION    GRAPHIC,DATA_C
  270.  
  271. COPPERLIST:
  272.     dc.w    $8E,$2c81    ; DiwStrt
  273.     dc.w    $90,$2cc1    ; DiwStop
  274.     dc.w    $92,$38        ; DdfStart
  275.     dc.w    $94,$d0        ; DdfStop
  276.     dc.w    $102,0        ; BplCon1
  277.     dc.w    $104,0        ; BplCon2
  278.  
  279.     dc.w    $108,2        ; Il bitplane e` largo 42 bytes, ma solo 40
  280.                 ; bytes sono visibili, quindi il modulo
  281.                 ; vale 42-40=2
  282. ;    dc.w    $10a,2        ; Usiamo un solo bitplane, quindi BPLMOD2
  283.                 ; non e` necessario
  284.  
  285.     dc.w    $100,$1200    ; bplcon0 - 1 bitplanes lowres
  286.  
  287. BPLPOINTERS:
  288.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  289.  
  290.     dc.w    $0180,$000    ; color0
  291.     dc.w    $0182,$f50    ; color1
  292.  
  293.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  294.  
  295. ;****************************************************************************
  296.  
  297. ; Qui e` memorizzato il FONT di caratteri 16x20
  298.  
  299. FONT:
  300.     incbin    "font16x20.raw"
  301.  
  302. ;****************************************************************************
  303.  
  304.     SECTION    PLANEVUOTO,BSS_C
  305.  
  306. BITPLANE:
  307.     ds.b    42*256        ; bitplane azzerato lowres
  308.  
  309. Buffer:
  310.     ds.b    42*20        ; buffer invisibile dove viene scrollato
  311.                 ; il testo 
  312.     end
  313.  
  314. ;****************************************************************************
  315.  
  316. In questo esempio vediamo un sine-scroll da 2 pixel. Le routine che stampano
  317. i caratteri e che scrollano il testo sono le stesse della lezione9n1.s,
  318. solo che disegnano in un buffer invisibile invece che sullo schermo.
  319. La routine "Sine" realizza l'effetto. Essa blitta tutto il contenuto del buffer
  320. sullo schermo, a "fettine" di 2 pixel. Per questo deve eseguire blittate larghe
  321. 1 word. Ogni colonna word contiene 8 "fettine" larghe 2 pixel. Quindi la
  322. routine ha 2 cicli annidati: quello piu` interno effettua 8 bittate per copiare
  323. tutta la colonna di word, mentre quello piu` esterno ripete quello interno per
  324. tutte le colonne di word dello schermo. Per selezionare le "fettine"
  325. all'interno della word si usa una maschera contenuta in D5. Dopo ogni blittata
  326. la maschera viene fatta ruotare in modo da selezionare ogni volta una diversa
  327. "fettina". Poiche` con la rotazione i bit che escono da un lato del registro
  328. rientrano dall'altro, non c'e` bisogno di settare D5 ogni volta che i bit
  329. ad 1 escono da destra.
  330. Ogni fettina viene copiata ad una posizione y differente, letta da una tabella
  331. sinusiodale.
  332. La routine di cancellazione dello schermo cancella solo la parte interessata
  333. dal disegno. Per calcolare quale sia la parte interessata, si devono
  334. considerare la minima e la massima coordinata Y delle "fettine", e inoltre
  335. che le "fettine" sono alte 20 pixel. Quindi la prima riga da cancellare e` 
  336. la minima Y delle "fettine", mentre l'ultima riga e` data dalla somma della
  337. massima Y e dell'altezza delle "fettine".
  338.  
  339.