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

  1.  
  2. ; Lezione9n1.s    Signore e signori, lo SCROLLTEXT!!!!!
  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.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  55.     bne.s    mouse        ; se no, torna a mouse2:
  56.     rts
  57.  
  58. ;****************************************************************************
  59. ; Questa routine stampa un carattere. Il carattere viene stampato in una
  60. ; parte di schermo invisibile.
  61. ; A0 punta al testo da stampare.
  62. ;****************************************************************************
  63.  
  64. PRINTCHAR:
  65.     subq.w    #1,contatore    ; diminuisci il contatore di 1
  66.     bne.s    NoPrint        ; se e` diverso da 0, non stampiamo,
  67.     move.w    #16,contatore    ; altrimenti si; reinizializza il contatore
  68.  
  69.     MOVEQ    #0,D2        ; Pulisci d2
  70.     MOVE.B    (A0)+,D2    ; Prossimo carattere in d2
  71.     bne.s    noreset        ; Se e` diverso da 0 stampalo,
  72.     lea    testo(pc),a0    ; altrimenti ricomincia il testo daccapo
  73.     MOVE.B    (A0)+,D2    ; Primo carattere in d2
  74. noreset
  75.     SUB.B    #$20,D2        ; TOGLI 32 AL VALORE ASCII DEL CARATTERE, IN
  76.                 ; MODO DA TRASFORMARE, AD ESEMPIO, QUELLO
  77.                 ; DELLO SPAZIO (che e' $20), in $00, quello
  78.                 ; DELL'ASTERISCO ($21), in $01...
  79.     ADD.L    D2,D2        ; MOLTIPLICA PER 2 IL NUMERO PRECEDENTE,
  80.                 ; perche` ogni carattere e` largo 16 pixel
  81.     MOVE.L    D2,A2
  82.  
  83.     ADD.L    #FONT,A2    ; TROVA IL CARATTERE DESIDERATO NEL FONT...
  84.  
  85.     btst    #6,$02(a5)    ; aspetta che il blitter finisca
  86. waitblit:
  87.     btst    #6,$02(a5)
  88.     bne.s    waitblit
  89.  
  90.     move.l    #$09f00000,$40(a5)    ; BLTCON0: copia da A a D
  91.     move.l    #$ffffffff,$44(a5)    ; BLTAFWM e BLTALWM li spieghiamo dopo
  92.  
  93.     move.l    a2,$50(a5)            ; BLTAPT: indirizzo font
  94.     move.l    #bitplane+50*42+40,$54(a5)    ; BLTDPT: indirizzo bitplane
  95.                         ; fisso, fuori dalla parte
  96.                         ; visibile dello schermo.
  97.     move    #120-2,$64(a5)            ; BLTAMOD: modulo font
  98.     move    #42-2,$66(a5)            ; BLTDMOD: modulo bit planes
  99.     move    #(20<<6)+1,$58(a5)         ; BLTSIZE: font 16*20
  100. NoPrint:
  101.     rts
  102.  
  103. contatore
  104.     dc.w    16
  105.  
  106. ;****************************************************************************
  107. ; Questa routine fa scorrere il testo verso sinistra
  108. ;****************************************************************************
  109.  
  110. ;                                :
  111. ;                                .
  112. ;    
  113. ;            . · ·. ¦:.:.:.:.:.:.¦  . · .     . · .
  114. ;        ° ·       ·|            |.·     . . ·     ·
  115. ;           . ··.   |        __  |                  ·
  116. ;         ·      ·. |       /  ` |     .··.          °
  117. ;      ·            | ,___   ___ |   .·    ·
  118. ;    °              | ____  /   \|  ·       .
  119. ;             .···. l/   o\/°   /l
  120. ;            °     (¯\____/\___/ ¯)          °
  121. ;                   T   (____)   T
  122. ;                   l            j xCz
  123. ;                    \___ O ____/
  124. ;                       `---'
  125.  
  126. Scorri:
  127.  
  128. ; Gli indirizzi sorgente e destinazione sono uguali.
  129. ; Shiftiamo verso sinistra, quindi usiamo il modo discendente.
  130.  
  131.     move.l    #bitplane+((21*(50+20))-1)*2,d0        ; ind. sorgente e
  132.                             ; destinazione
  133. ScorriLoop:
  134.     btst    #6,2(a5)        ; aspetta che il blitter finisca
  135. waitblit2:
  136.     btst    #6,2(a5)
  137.     bne.s    waitblit2
  138.  
  139.     move.l    #$19f00002,$40(a5)    ; BLTCON0 e BLTCON1 - copia da A a D
  140.                     ; con shift di un pixel
  141.  
  142.     move.l    #$ffff7fff,$44(a5)    ; BLTAFWM e BLTALWM
  143.                     ; BLTAFWM = $ffff - passa tutto
  144.                     ; BLTALWM = $7fff = %0111111111111111
  145.                     ;   cancella il bit piu` a sinistra
  146.  
  147. ; carica i puntatori
  148.  
  149.     move.l    d0,$50(a5)            ; bltapt - sorgente
  150.     move.l    d0,$54(a5)            ; bltdpt - destinazione
  151.  
  152. ; facciamo scorrere un immagine larga tutto lo schermo, quindi
  153. ; il modulo e` azzerato.
  154.  
  155.     move.l    #$00000000,$64(a5)        ; bltamod e bltdmod 
  156.     move.w    #(20*64)+21,$58(a5)        ; bltsize
  157.                         ; altezza 20 linee, largo 21
  158.     rts                    ; words (tutto lo schermo)
  159.  
  160. ; Questo e` il testo. con lo 0 si termina. Il font usato ha solo i caratteri
  161. ; maiuscoli, attenzione!
  162.  
  163. testo:
  164.     dc.b    "ECCO FINALMENTE LO SCROLLTEXT, CHE TUTTI STAVANO"
  165.     dc.b    " ASPETTANDO... IL FONT E' DI 16*20 PIXEL!..."
  166.     dc.b    " LO SCROLL AVVIENE CON TRANQUILLITA'...",0
  167.  
  168.  
  169. ;****************************************************************************
  170.  
  171.     SECTION    GRAPHIC,DATA_C
  172.  
  173. COPPERLIST:
  174.     dc.w    $8E,$2c81    ; DiwStrt
  175.     dc.w    $90,$2cc1    ; DiwStop
  176.     dc.w    $92,$38        ; DdfStart
  177.     dc.w    $94,$d0        ; DdfStop
  178.     dc.w    $102,0        ; BplCon1
  179.     dc.w    $104,0        ; BplCon2
  180.  
  181.     dc.w    $108,2        ; Il bitplane e` largo 42 bytes, ma solo 40
  182.                 ; bytes sono visibili, quindi il modulo
  183.                 ; vale 42-40=2
  184. ;    dc.w    $10a,2        ; Usiamo un solo bitplane, quindi BPLMOD2
  185.                 ; non e` necessario
  186.  
  187.     dc.w    $100,$1200    ; bplcon0 - 1 bitplanes lowres
  188.  
  189. BPLPOINTERS:
  190.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  191.  
  192.     dc.w    $0180,$000    ; color0
  193.  
  194. ; queste istruzioni della copperlist cambiano il colore 1 ogni 2 righe
  195.  
  196.     dc.w    $5e01,$fffe    ; prima riga scrolltext
  197.     dc.w    $0182,$f50    ; color1
  198.     dc.w    $6001,$fffe
  199.     dc.w    $0182,$d90
  200.     dc.w    $6201,$fffe
  201.     dc.w    $0182,$dd0
  202.     dc.w    $6401,$fffe
  203.     dc.w    $0182,$5d2
  204.     dc.w    $6601,$fffe
  205.     dc.w    $0182,$2f4
  206.     dc.w    $6801,$fffe
  207.     dc.w    $0182,$0d7
  208.     dc.w    $6a01,$fffe
  209.     dc.w    $0182,$0dd
  210.     dc.w    $6c01,$fffe
  211.     dc.w    $0182,$07d
  212.     dc.w    $6e01,$fffe
  213.     dc.w    $0182,$22f
  214.     dc.w    $7001,$fffe
  215.     dc.w    $0182,$40d
  216.     dc.w    $7201,$fffe
  217.     dc.w    $0182,$80d
  218.  
  219.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  220.  
  221. ;****************************************************************************
  222.  
  223. ; Qui e` memorizzato il FONT di caratteri 16x20
  224.  
  225. FONT:
  226.     incbin    "assembler2:sorgenti6/font16x20.raw"
  227.  
  228. ;****************************************************************************
  229.  
  230.     SECTION    PLANEVUOTO,BSS_C
  231.  
  232. BITPLANE:
  233.     ds.b    42*256        ; bitplane azzerato lowres
  234.  
  235.     end
  236.  
  237. ;****************************************************************************
  238.  
  239. In questo esempio presentiamo uno degli effetti piu` classici delle demo:
  240. lo scrolltext. Si tratta di un testo che scorre sullo schermo da destra
  241. verso sinistra, e che di solito contiene i saluti (greeetings) mandati
  242. dagli autori della demo agli altri demo-coders. Come si realizza uno
  243. scrolltext? Si potrebbe pensare di stampare tutto il testo su un bitplane
  244. piu` grande dello schermo visibile e poi scrollare il bitplane. Questa
  245. tecnica ha lo svantaggio di occupare molta memoria, perche` ha bisogno
  246. di un bitplane che contenga tutto il testo.
  247. Noi usiamo un'altra tecnica basata sul blitter, per la quale basta disporre
  248. di un bitplane largo appena 16 pixel (1 word) in piu` dell'area visibile.
  249. Abbiamo dunque una colonna di una word invisibile alla destra dello schermo.
  250. Supponiamo di stampare un carattere nella parte invisibile del bitplane, e
  251. contemporaneamente di far scorrere verso sinistra il bitplane mediante il
  252. blitter. Accade, come potete immaginare, che il carattere si sposti un pixel
  253. alla volta verso sinistra.
  254. Notate che i puntatori ai bitplane rimangono sempre fissi.
  255. Quando il carattere e` completamente visiblie, il che accade dopo 16
  256. shiftate di 1 pixel, essendo il carattere largo 16 pixel, possiamo stampare
  257. il carattere successivo nella parte invisibile dello schermo.
  258. I caratteri che arrivano al bordo sinistro vengono cancellati dalla maschera
  259. del blitter.
  260. In pratica l'effetto e` ottenuto usando 2 routine.
  261. La prima "Printchar" si occupa di stampare i caratteri sullo schermo.
  262. La stampa deve avvenire solo quando il carattere precedentemente stampato e`
  263. diventato completamente visibile, in modo da evitare di sovrapporre i 2
  264. caratteri.
  265. Siccome ogni carattere e` largo 16 pixel, e il testo scorre un pixel alla
  266. volta, in  sostanza la stampa deve avvenire ogni 16 volte che la routine viene
  267. chiamata.
  268. Per questo viene usato un contatore che viene decrementato ad ogni chiamata.
  269. Quando esso assume il valore 0 il carattere viene stampato, e il contatore
  270. reinizializzato a 16. La stampa vera e propria e` una semplice copia con il
  271. blitter (usato in modo ascendente) fatta nella maniera che conosciamo.
  272. La routine "Scorri" e` incaricata di far scorrere il testo usando lo shift
  273. del blitter verso sinistra (cioe` in modo discendente) nel modo che abbiamo
  274. visto nell' esempio lezione9m2.s. Poiche` i caratteri sono alti 20 righe,
  275. tutto il testo occupa una "fascia" di schermo alta 20 righe.
  276. E` necessario far scorrere tutta questa "fascia", ovvero un rettangolo alto 20
  277. righe e largo quanto tutto il bitplane (compresa naturalmente la parte
  278. INVISIBILE, in modo da far scorrere i caratteri nella parte visibile).
  279. La maschera dell'ultima word provvede a cancellare i caratteri che raggiungono
  280. il bordo sinistro.
  281. Abbiamo usato uno schermo formato da 1 bitplane, e i colori sono ottenuti
  282. tramite il copper (altrimenti che furbi saremmo?).
  283.  
  284.