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

  1.  
  2. ; Lezione10i2.s    Sine-scroller da 1 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.  
  134. ; carica i puntatori
  135.  
  136.     move.l    d0,$50(a5)            ; bltapt - sorgente
  137.     move.l    d0,$54(a5)            ; bltdpt - destinazione
  138.  
  139. ; facciamo scorrere un immagine larga tutto lo schermo, quindi
  140. ; il modulo e` azzerato.
  141.  
  142.     move.l    #$00000000,$64(a5)        ; bltamod e bltdmod 
  143.     move.w    #(20*64)+21,$58(a5)        ; bltsize
  144.                         ; altezza 20 linee, largo 21
  145.     rts                    ; words (tutto lo schermo)
  146.  
  147.  
  148. ;****************************************************************************
  149. ; Questa routine realizza l'effetto sine-scroll. Attenzione a BLTALWM, perche'
  150. ; e' il registro dove ogni volta selezioniamo la "fettina" o "striscina"
  151. ; verticale su cui operare. Qua ci sono le differenze con il sine da 2 pixel!
  152. ;****************************************************************************
  153.  
  154. ;      ,-~~-.___.
  155. ;     / |  '     \
  156. ;    (  )         0
  157. ;     \_/-, ,----'
  158. ;        ====           //
  159. ;       /  \-'~;    /~~~(O)
  160. ;      /  __/~|   /       |
  161. ;    =(  _____| (_________|   W<
  162.  
  163. Sine:
  164.     lea    buffer,a2        ; puntatore al buffer contenente
  165.                     ; lo scrolltext
  166.     lea    bitplane,a1        ; puntatore alla destinazione
  167.  
  168.     move.l    SinusPtr(pc),a3        ; indirizzo primo valore seno (*42)
  169.     subq.w    #2,a3            ; modifica primo valore
  170.     cmp.l    #Sinustab,a3        ; se siamo all'inizio della tabella
  171.     bhs.s    nostartptr        ; ricomincia dalla fine
  172.     lea    EndSinustab(pc),a3
  173. nostartptr:
  174.     move.l    a3,SinusPtr        ; memorizza primo valore usato
  175.  
  176.     move.w    #$8000,d5        ; valore iniziale maschera
  177.     moveq    #20-1,d6        ; ripeti per tutte le word dello schero
  178. FaiUnaWord:
  179.     moveq    #16-1,d7        ; routine da 1 pixel. Per ogni word
  180.                     ; ci sono 16 "fettine" da 1 pixel
  181.  
  182. FaiUnaColonna:
  183.     move.w    (a3)+,d0        ; legge un valore dalla tabella
  184.     cmp.l    #EndSinustab,a3        ; se siamo alla fine della tabella
  185.     blo.s    nostartsine        ; ricomincia da capo
  186.     lea    sinustab(pc),a3
  187. nostartsine:
  188.     move.l    a1,a4            ; copia indirizzo bitplane
  189.     add.w    d0,a4            ; aggiunge la coordnata Y
  190.  
  191.     btst    #6,2(a5)    ; dmaconr - aspetta che il blitter finisca
  192. waitblit_sine:
  193.     btst    #6,2(a5)
  194.     bne.s    waitblit_sine
  195.  
  196.     move.w    #$ffff,$44(a5)        ; BLTAFWM
  197.     move.w    d5,$46(a5)        ; BLTALWM - contiene la maschera che
  198.                     ; seleziona le "fettine" di scrolltext
  199.         
  200.     move.l    #$0bfa0000,$40(a5)    ; BLTCON0/BLTCON1 - attiva A,C,D
  201.                     ; D=A OR C
  202.  
  203.     move.w    #$0028,$60(a5)        ; BLTCMOD=42-2=$28
  204.     move.l    #$00280028,$64(a5)    ; BLTAMOD=42-2=$28
  205.                     ; BLTDMOD=42-2=$28
  206.  
  207.     move.l    a2,$50(a5)        ; BLTAPT  (al buffer)
  208.     move.l    a4,$48(a5)        ; BLTCPT  (allo schermo)
  209.     move.l    a4,$54(a5)        ; BLTDPT  (allo schermo)
  210.     move.w    #(64*20)+1,$58(a5)    ; BLTSIZE (blitta un rettangolo
  211.                     ; alto 20 righe e largo 1 word)
  212.  
  213.     ror.w    #1,d5            ; spostati alla "fettina" successiva
  214.                     ; va a destra e dopo l'ultima "fettina"
  215.                     ; di una word ricomincia dalla prima
  216.                     ; della word seguente.
  217.                     ; per lo scroll da 1 pixel ogni
  218.                     ; "fettina" e` larga 1 pixel
  219.  
  220.     dbra    d7,FaiUnaColonna
  221.  
  222.     addq.w    #2,a2            ; punta alla word seguente
  223.     addq.w    #2,a1            ; punta alla word seguente
  224.     dbra    d6,FaiUnaWord
  225.     rts
  226.  
  227. ; Questo e` il testo. con lo 0 si termina. Il font usato ha solo i caratteri
  228. ; maiuscoli, attenzione!
  229.  
  230. testo:
  231.     dc.b    " ECCO COME SINUSCROLLARE... IL FONT E' DI 16*20 PIXEL!..."
  232.     dc.b    " LO SCROLL AVVIENE CON TRANQUILLITA'...",0
  233.     even
  234.  
  235. ;****************************************************************************
  236. ; Questa routine cancella lo schermo mediante il blitter.
  237. ; Viene cancellata solo la parte di schermo sulla quale scorre il testo:
  238. ; dalla riga 130 alla riga 193
  239. ;****************************************************************************
  240.  
  241. CancellaSchermo:
  242.     btst    #6,2(a5)
  243. WBlit3:
  244.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  245.     bne.s    wblit3
  246.  
  247.     move.l    #$01000000,$40(a5)    ; BLTCON0 e BLTCON1: Cancella
  248.     move    #$0000,$66(a5)        ; BLTDMOD=0
  249.     move.l    #bitplane+42*130,$54(a5)    ; BLTDPT
  250.     move.w    #(64*63)+20,$58(a5)    ; BLTSIZE (via al blitter !)
  251.                     ; cancella dalla riga 130
  252.                     ; fino alla riga 193
  253.     rts
  254.  
  255. ;***************************************************************************
  256.  
  257. ; questo puntatore contiene l'indirizzo del primo valore da leggere dalla
  258. ; tabella
  259.  
  260. SinusPtr:    dc.l    Sinustab
  261.  
  262. ; Questa e` la tabella che contiene i valori delle posizioni verticali
  263. ; dello scrolltext. Le posizioni sono gia` moltiplicate per 42, quindi
  264. ; possono essere addizionate direttamente all'indirizzo del BITPLANE
  265.  
  266. Sinustab:
  267.     DC.W    $189C,$18C6,$18F0,$191A,$1944,$196E,$1998,$19C2,$19C2,$19EC
  268.     DC.W    $1A16,$1A40,$1A6A,$1A6A,$1A94,$1ABE,$1ABE,$1AE8,$1B12,$1B12
  269.     DC.W    $1B3C,$1B3C,$1B66,$1B66,$1B90,$1B90,$1BBA,$1BBA,$1BBA,$1BBA
  270.     DC.W    $1BE4,$1BE4,$1BE4,$1BE4,$1BE4,$1BE4,$1BE4,$1BE4,$1BE4,$1BE4
  271.     DC.W    $1BBA,$1BBA,$1BBA,$1BBA,$1B90,$1B90,$1B66,$1B66,$1B3C,$1B3C
  272.     DC.W    $1B12,$1B12,$1AE8,$1ABE,$1ABE,$1A94,$1A6A,$1A6A,$1A40,$1A16
  273.     DC.W    $19EC,$19C2,$19C2,$1998,$196E,$1944,$191A,$18F0,$18C6,$189C
  274.     DC.W    $189C,$1872,$1848,$181E,$17F4,$17CA,$17A0,$1776,$1776,$174C
  275.     DC.W    $1722,$16F8,$16CE,$16CE,$16A4,$167A,$167A,$1650,$1626,$1626
  276.     DC.W    $15FC,$15FC,$15D2,$15D2,$15A8,$15A8,$157E,$157E,$157E,$157E
  277.     DC.W    $1554,$1554,$1554,$1554,$1554,$1554,$1554,$1554,$1554,$1554
  278.     DC.W    $157E,$157E,$157E,$157E,$15A8,$15A8,$15D2,$15D2,$15FC,$15FC
  279.     DC.W    $1626,$1626,$1650,$167A,$167A,$16A4,$16CE,$16CE,$16F8,$1722
  280.     DC.W    $174C,$1776,$1776,$17A0,$17CA,$17F4,$181E,$1848,$1872,$189C
  281. EndSinustab:
  282.  
  283. ;****************************************************************************
  284.  
  285.     SECTION    GRAPHIC,DATA_C
  286.  
  287. COPPERLIST:
  288.     dc.w    $8E,$2c81    ; DiwStrt
  289.     dc.w    $90,$2cc1    ; DiwStop
  290.     dc.w    $92,$38        ; DdfStart
  291.     dc.w    $94,$d0        ; DdfStop
  292.     dc.w    $102,0        ; BplCon1
  293.     dc.w    $104,0        ; BplCon2
  294.  
  295.     dc.w    $108,2        ; Il bitplane e` largo 42 bytes, ma solo 40
  296.                 ; bytes sono visibili, quindi il modulo
  297.                 ; vale 42-40=2
  298. ;    dc.w    $10a,2        ; Usiamo un solo bitplane, quindi BPLMOD2
  299.                 ; non e` necessario
  300.  
  301.     dc.w    $100,$1200    ; bplcon0 - 1 bitplanes lowres
  302.  
  303. BPLPOINTERS:
  304.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  305.  
  306.     dc.w    $0180,$000    ; color0
  307.     dc.w    $0182,$f50    ; color1
  308.  
  309.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  310.  
  311. ;****************************************************************************
  312.  
  313. ; Qui e` memorizzato il FONT di caratteri 16x20
  314.  
  315. FONT:
  316.     incbin    "font16x20.raw"
  317.  
  318. ;****************************************************************************
  319.  
  320.     SECTION    PLANEVUOTO,BSS_C
  321.  
  322. BITPLANE:
  323.     ds.b    42*256        ; bitplane azzerato lowres
  324.  
  325. Buffer:
  326.     ds.b    42*20        ; buffer invisibile dove viene scrollato
  327.                 ; il testo 
  328.     end
  329.  
  330. ;****************************************************************************
  331.  
  332. In questo esempio vediamo un sine-scroll da 1 pixel. Se guardate attentamente
  333. i bordi delle lettere noterete come la sinusiode sia molto meno scalettata.
  334. La routine "Sine" e` molto simile a quella di lezione10i1.s. Le differenze
  335. sono costituite dal fatto che ora abbiamo "fettine" larghe un pixel, il che
  336. vuol dire che in una word ci sono 16 "fettine" invece che 8, e che naturalmente
  337. la maschera deve ruotare ogni volta di 1 pixel invece che di 2.
  338. Notate inoltre che usiamo una tabella di seni diversa. Infatti se avessimo
  339. usato la stessa la sinusiode sarebbe venuta piu` stretta.
  340. Per rendere un po' piu` vario lo scroller, leggiamo i valori della tabella
  341. ogni volta partendo da un valore diverso. Per questo usiamo un puntatore al
  342. primo valore da leggere che viene modificato ogni volta che viene letto.
  343.  
  344.