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

  1.  
  2. ; Lezione9i2.s    BOB a colori
  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.     MOVEQ    #3-1,D1        ; numero di bitplanes (qua sono 3)
  22. POINTBP:
  23.     move.w    d0,6(a1)
  24.     swap    d0
  25.     move.w    d0,2(a1)
  26.     swap    d0
  27.     ADD.L    #40*256,d0        ; + LUNGHEZZA DI UNA PLANE !!!!!
  28.     addq.w    #8,a1
  29.     dbra    d1,POINTBP
  30.  
  31.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  32.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  33.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  34.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  35.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  36.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  37.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  38.  
  39. mouse:
  40.     bsr.w    LeggiMouse        ; Leggi coordinate
  41.     bsr.s    ControllaCoordinate    ; evita che il bob esca dallo schermo
  42.     bsr.s    DisegnaOggetto        ; disegna il bob
  43.  
  44.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  45.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  46. Waity1:
  47.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  48.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  49.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  50.     BNE.S    Waity1
  51.  
  52.     bsr.w    CancellaOggetto        ; cancella il bob dalla vecchia
  53.                     ; posizione
  54.  
  55.     btst    #6,$bfe001        ; tasto sinistro del mouse premuto?
  56.     bne.s    mouse            ; se no, torna a mouse:
  57.     rts
  58.  
  59. ;****************************************************************************
  60. ; Questa routine fa in modo che le coordinate del bob rimangano sempre
  61. ; all'interno dello schermo.
  62. ;****************************************************************************
  63.  
  64. ControllaCoordinate:
  65.     tst.w    ogg_x        ; controlla X
  66.     bpl.s    NoMinX        ; controlla bordo sinistro
  67.     clr.w    ogg_x        ; se X e` negativa, pone X=0
  68.     bra.s    controllaY    ; va a controllare la Y
  69.  
  70. NoMinX:
  71.     cmp.w    #319-32,ogg_x    ; Controlla il bordo destro. In X_OGG
  72.                 ; e` memorizzata la coordinata del bordo
  73.                 ; sinistro del bob. Se esso ha raggiunto
  74.                 ; 319-32, allora il bordo destro ha raggiunto
  75.                 ; la coordinata 319.
  76.     bls.s    controllaY    ; Se e` minore tutto bene, controlla la Y
  77.     move.w    #319-32,ogg_x    ; altrimenti fissa la coordinata sul bordo.
  78.  
  79. controllaY:
  80.     tst.w    ogg_y        ; controlla bordo in alto
  81.     bpl.s    NoMinY        ; se e` positiva controlla in basso
  82.     clr.w    ogg_y        ; altrimenti poni Y=0
  83.     bra.s    EndControlla    ; ed esci
  84.  
  85. NoMinY:
  86.     cmp.w    #255-11,ogg_y    ; controlla il bordo basso. In Y_OGG
  87.                 ; e` memorizzata la coordinata del bordo
  88.                 ; alto del bob. Se esso ha raggiunto
  89.                 ; Y=255-11, allora il bordo basso ha raggiunto
  90.                 ; la coordinata Y=255
  91.     bls.s    EndControlla    ; se e` minore tutto bene, controlla la Y
  92.     move.w    #255-11,ogg_y    ; altrimenti fissa la coordinata sul bordo.
  93. EndControlla:
  94.     rts
  95.  
  96. ;****************************************************************************
  97. ; Questa routine disegna il BOB alle coordinate specificate nelle variabili
  98. ; X_OGG e Y_OGG. Il BOB e lo schermo sono in formato normale, e pertanto
  99. ; sono utilizzate le formule relative a questo formato nel calcolo dei
  100. ; valori da scrivere nei registri del blitter. Inoltre viene impiegata la
  101. ; tecnica di mascherare l'ultima word del BOB vista nella lezione.
  102. ;****************************************************************************
  103.  
  104. ;         _
  105. ;        /_\---.
  106. ;      _//_\ __|
  107. ;     C/ ( °\°/l)
  108. ;     /   (___)|
  109. ;    (_ ° _____!
  110. ;     `---'|,|_
  111. ;        /¯' ` |
  112. ;       //T· ·T|
  113. ;       \\l ° |l
  114. ;       (__) (_¯)
  115. ;         |¯¬¯|¯ xCz
  116. ;         l__Tl__
  117. ;         (____)_)
  118.  
  119. DisegnaOggetto:
  120.     lea    bitplane,a0    ; destinazione in a0
  121.     move.w    ogg_y(pc),d0    ; coordinata Y
  122.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga e` costituita da
  123.                 ; 40 bytes
  124.     add.w    d0,a0        ; aggiungi all'indirizzo di partenza
  125.  
  126.     move.w    ogg_x(pc),d0    ; coordinata X
  127.     move.w    d0,d1        ; copia
  128.     and.w    #$000f,d0    ; si selezionano i primi 4 bit perche' vanno
  129.                 ; inseriti nello shifter del canale A 
  130.     lsl.w    #8,d0        ; i 4 bit vengono spostati sul nibble alto
  131.     lsl.w    #4,d0        ; della word...
  132.     or.w    #$09f0,d0    ; ...giusti per inserirsi nel registro BLTCON0
  133.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  134.                 ; arrotonda ai multipli di 8 per il puntatore
  135.                 ; allo schermo, ovvero agli indirizzi dispari
  136.                 ; (anche ai byte, quindi)
  137.                 ; x es.: un 16 come coordinata diventa il
  138.                 ; byte 2 
  139.     and.w    #$fffe,d1    ; escludo il bit 0 del
  140.     add.w    d1,a0        ; somma all'indirizzo del bitplane, trovando
  141.                 ; l'indirizzo giusto di destinazione
  142.  
  143.     lea    figura,a1    ; puntatore sorgente
  144.     moveq    #3-1,d7        ; ripeti per ogni plane
  145. PlaneLoop:
  146.     btst    #6,2(a5)
  147. WBlit2:
  148.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  149.     bne.s    wblit2
  150.  
  151.     move.l    #$ffff0000,$44(a5)    ; BLTAFWM = $ffff fa passare tutto
  152.                     ; BLTALWM = $0000 azzera l'ultima word
  153.  
  154.  
  155.     move.w    d0,$40(a5)        ; BLTCON0 (usa A+D)
  156.     move.w    #$0000,$42(a5)        ; BLTCON1 (nessun modo speciale)
  157.     move.l    #$fffe0022,$64(a5)    ; BLTAMOD=$fffe=-2 torna indietro
  158.                     ; all'inizio della riga.
  159.                     ; BLTDMOD=40-6=34=$22 come al solito
  160.     move.l    a1,$50(a5)        ; BLTAPT  (fisso alla figura sorgente)
  161.     move.l    a0,$54(a5)        ; BLTDPT  (linee di schermo)
  162.     move.w    #(64*11)+3,$58(a5)    ; BLTSIZE (via al blitter !)
  163.  
  164.     lea    4*11(a1),a1        ; punta al prossimo plane sorgente
  165.                     ; ogni plane e` largo 2 words e alto
  166.                     ; 11 righe
  167.  
  168.     lea    40*256(a0),a0        ; punta al prossimo plane destinazione
  169.     dbra    d7,PlaneLoop
  170.  
  171.     rts
  172.  
  173. ;*****************************************************************************
  174. ; Questa routine cancella il BOB mediante il blitter. La cancellazione
  175. ; viene fatta sul rettangolo che racchiude il bob alto 6 linee e largo 3 words
  176. ;****************************************************************************
  177.  
  178. CancellaOggetto:
  179.     lea    bitplane,a0    ; destinazione in a0
  180.     move.w    ogg_y(pc),d0    ; coordinata Y
  181.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga e` costituita da
  182.                 ; 40 bytes
  183.     add.w    d0,a0        ; aggiungi all'indirizzo di partenza
  184.  
  185.     move.w    ogg_x(pc),d1    ; coordinata X
  186.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  187.                 ; arrotonda ai multipli di 8 per il puntatore
  188.                 ; allo schermo, ovvero agli indirizzi dispari
  189.                 ; (anche ai byte, quindi)
  190.                 ; x es.: un 16 come coordinata diventa il
  191.                 ; byte 2 
  192.     and.w    #$fffe,d1    ; escludo il bit 0 del
  193.     add.w    d1,a0        ; somma all'indirizzo del bitplane, trovando
  194.                 ; l'indirizzo giusto di destinazione
  195.  
  196.     moveq    #3-1,d7        ; ripeti per ogni plane
  197. PlaneLoop2:
  198.     btst    #6,2(a5)
  199. WBlit3:
  200.     btst    #6,2(a5)     ; attendi che il blitter abbia finito
  201.     bne.s    wblit3
  202.  
  203.     move.l    #$01000000,$40(a5)    ; BLTCON0 e BLTCON1: Cancella
  204.     move.w    #$0022,$66(a5)        ; BLTDMOD=40-6=34=$22
  205.     move.l    a0,$54(a5)        ; BLTDPT
  206.     move.w    #(64*11)+3,$58(a5)    ; BLTSIZE (via al blitter !)
  207.                     ; cancella il rettangolo che racchiude
  208.                     ; il BOB
  209.  
  210.     lea    40*256(a0),a0        ; punta al prossimo plane destinazione
  211.     dbra    d7,PlaneLoop2
  212.  
  213.     rts                
  214.  
  215. *****************************************************************************
  216. ; Questa routine legge il mouse e aggiorna i valori contenuti nelle
  217. ; variabili OGG_X e OGG_Y
  218. ;****************************************************************************
  219.  
  220. LeggiMouse:
  221.     move.b    $dff00a,d1    ; JOY0DAT posizione verticale mouse
  222.     move.b    d1,d0        ; copia in d0
  223.     sub.b    mouse_y(PC),d0    ; sottrai vecchia posizione mouse
  224.     beq.s    no_vert        ; se la differenza = 0, il mouse e` fermo
  225.     ext.w    d0        ; trasforma il byte in word
  226.                 ; (vedi alla fine del listato)
  227.     add.w    d0,ogg_y    ; modifica posizione oggetto
  228.  
  229. no_vert:
  230.       move.b    d1,mouse_y    ; salva posizione mouse per la prossima volta
  231.  
  232.     move.b    $dff00b,d1    ; posizione orizzontale mouse
  233.     move.b    d1,d0        ; copia in d0
  234.     sub.b    mouse_x(PC),d0    ; sottrai vecchia posizione
  235.     beq.s    no_oriz        ; se la differenza = 0, il mouse e` fermo
  236.     ext.w    d0        ; trasforma il byte in word
  237.                 ; (vedi alla fine del listato)
  238.     add.w    d0,ogg_x    ; modifica pos. oggetto
  239. no_oriz
  240.       move.b    d1,mouse_x    ; salva posizione mouse per la prossima volta
  241.     RTS
  242.  
  243. OGG_Y:        dc.w    0    ; qui viene memorizzata la Y dell'oggetto
  244. OGG_X:        dc.w    0    ; qui viene memorizzata la X dell'oggetto
  245. MOUSE_Y:    dc.b    0    ; qui viene memorizzata la Y del mouse
  246. MOUSE_X:    dc.b    0    ; qui viene memorizzata la X del mouse
  247.  
  248. ;****************************************************************************
  249.  
  250.     SECTION    GRAPHIC,DATA_C
  251.  
  252. COPPERLIST:
  253.     dc.w    $8E,$2c81    ; DiwStrt
  254.     dc.w    $90,$2cc1    ; DiwStop
  255.     dc.w    $92,$38        ; DdfStart
  256.     dc.w    $94,$d0        ; DdfStop
  257.     dc.w    $102,0        ; BplCon1
  258.     dc.w    $104,0        ; BplCon2
  259.     dc.w    $108,0        ; VALORE MODULO 0
  260.     dc.w    $10a,0        ; ENTRAMBI I MODULI ALLO STESSO VALORE.
  261.  
  262.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres
  263.  
  264. BPLPOINTERS:
  265.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  266.     dc.w $e4,$0000,$e6,$0000
  267.     dc.w $e8,$0000,$ea,$0000
  268.  
  269.     dc.w    $0180,$000    ; color0
  270.     dc.w    $0182,$475    ; color1
  271.     dc.w    $0184,$fff    ; color2
  272.     dc.w    $0186,$ccc    ; color3
  273.     dc.w    $0188,$999    ; color4
  274.     dc.w    $018a,$232    ; color5
  275.     dc.w    $018c,$777    ; color6
  276.     dc.w    $018e,$444    ; color7
  277.  
  278.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  279.  
  280. ;****************************************************************************
  281.  
  282. ; Questi sono i dati che compongono la figura del bob.
  283. ; Il bob e` in formato normale, largo 32 pixel (2 words)
  284. ; alto 11 righe e formato da 3 bitplanes
  285.  
  286. Figura:    dc.l    $007fc000    ; plane 1
  287.     dc.l    $03fff800
  288.     dc.l    $07fffc00
  289.     dc.l    $0ffffe00
  290.     dc.l    $1fe07f00
  291.     dc.l    $1fe07f00
  292.     dc.l    $1fe07f00
  293.     dc.l    $0ffffe00
  294.     dc.l    $07fffc00
  295.     dc.l    $03fff800
  296.     dc.l    $007fc000
  297.  
  298.     dc.l    $00000000    ; plane 2
  299.     dc.l    $007fc000
  300.     dc.l    $03fff800
  301.     dc.l    $07fffc00
  302.     dc.l    $0fe07e00
  303.     dc.l    $0fe07e00
  304.     dc.l    $0fe07e00
  305.     dc.l    $07fffc00
  306.     dc.l    $03fff800
  307.     dc.l    $007fc000
  308.     dc.l    $00000000
  309.  
  310.     dc.l    $007fc000    ; plane 3
  311.     dc.l    $03803800
  312.     dc.l    $04000400
  313.     dc.l    $081f8200
  314.     dc.l    $10204100
  315.     dc.l    $10204100
  316.     dc.l    $10204100
  317.     dc.l    $081f8200
  318.     dc.l    $04000400
  319.     dc.l    $03803800
  320.     dc.l    $007fc000
  321.  
  322. ;****************************************************************************
  323.  
  324. BITPLANE:
  325.     incbin    "assembler2:sorgenti6/amiga.raw"
  326.                     ; qua carichiamo la figura in
  327.                     ; formato RAWBLIT (o interleaved),
  328.                     ; convertita col KEFCON.
  329.     end
  330.  
  331. ;****************************************************************************
  332.  
  333. In questo esempio abbiamo un BOB a colori che si muove sullo schermo comandato
  334. dal mouse. Sullo schermo c'e` un' immagine di sfondo. Viene usato il formato
  335. interleaved. Per il BOB usiamo la tecnica di mascherare l'ultima word che
  336. abbiamo gia` usato nell'esempio lezione9i1.s. Il programma si compone di 4
  337. routine che vengono chiamate ciclicamente. La routine "LeggiMouse" e` la stessa
  338. usata nella lezione7. Legge dal mouse le cordinate del BOB e le memorizza nelle
  339. variabili X_OGG e Y_OGG. La routine "ControllaCoordinate" serve ad impedire che
  340. il BOB esca dallo schermo. La routine "DisegnaOggetto" e` la routine che
  341. disegna il BOB sullo schermo, ed e` analoga a quelle gia` viste prima. Notate
  342. che questa routine quando disegna sovrascrive lo sfondo. Una volta disegnato
  343. il BOB il programma attende il prossimo vertical blank, per permettere la
  344. visualizzazione dell'immagine con il BOB nella posizione corrente. Dopo il
  345. vertical blank viene chiamata la routine "CancellaOggetto" che cancella il BOB
  346. dalla posizione attuale. Questa routine effettua una cancellazione con il
  347. blitter del rettangolo che contiene il BOB. Al posto del BOB appare spazio
  348. vuoto. Successivamente ricomincia il loop principale, con la lettura delle
  349. nuove coordinate, il controllo e il disegno del BOB nella nuova posizione.
  350. Il grande "difetto" di questo programma e` che il BOB cancella le parti di
  351. sfondo sopra le quali passa.
  352.  
  353.