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

  1.  
  2. ; Lezione10d1.s    BOB con ripristino dello sfondo.
  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.  
  41.     bsr.w    LeggiMouse        ; leggi coordinate
  42.     bsr.s    ControllaCoordinate    ; evita che il bob esca dallo schermo
  43.     bsr.w    SalvaSfondo        ; salva lo sfondo
  44.     bsr.s    DisegnaOggetto        ; disegna il bob
  45.  
  46.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  47.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  48. Waity1:
  49.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  50.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  51.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  52.     BNE.S    Waity1
  53.  
  54.     bsr.w    RipristinaSfondo    ; ripristina lo sfondo
  55.  
  56.     btst    #6,$bfe001        ; tasto sinistro del mouse premuto?
  57.     bne.s    mouse            ; se no, torna a mouse:
  58.  
  59.     rts
  60.  
  61.  
  62. ;****************************************************************************
  63. ; Questa routine fa in modo che le coordinate del bob rimangano sempre
  64. ; all'interno dello schermo.
  65. ;****************************************************************************
  66.  
  67. ControllaCoordinate:
  68.     tst.w    ogg_x        ; controlla X
  69.     bpl.s    NoMinX        ; controlla bordo sinistro
  70.     clr.w    ogg_x        ; se X e` negativa, pone X=0
  71.     bra.s    controllaY    ; va a controllare la Y
  72.  
  73. NoMinX:
  74.     cmp.w    #319-32,ogg_x    ; controlla il bordo destro. In X_OGG
  75.                 ; e` memorizzata la coordinata del bordo
  76.                 ; sinistro del bob. Se esso ha raggiunto
  77.                 ; 319-32, allora il bordo destro ha raggiunto
  78.                 ; la coordinata 319
  79.     bls.s    controllaY    ; se e` minore tutto bene, controlla la Y
  80.     move.w    #319-32,ogg_x    ; altrimenti fissa la coordinata sul bordo.
  81.  
  82. controllaY:
  83.     tst.w    ogg_y        ; controlla bordo in alto
  84.     bpl.s    NoMinY        ; se e` positiva controlla in basso
  85.     clr.w    ogg_y        ; altrimenti poni Y=0
  86.     bra.s    EndControlla    ; ed esci
  87.  
  88. NoMinY:
  89.     cmp.w    #255-11,ogg_y    ; controlla il bordo basso. In Y_OGG
  90.                 ; e` memorizzata la coordinata del bordo
  91.                 ; alto del bob. Se esso ha raggiunto
  92.                 ; Y=255-11, allora il bordo basso ha raggiunto
  93.                 ; la coordinata Y=255
  94.     bls.s    EndControlla    ; se e` minore tutto bene, controlla la Y
  95.     move.w    #255-11,ogg_y    ; altrimenti fissa la coordinata sul bordo.
  96. EndControlla:
  97.     rts
  98.  
  99. ;***************************************************************************
  100. ; Questa routine disegna il BOB alle coordinate specificate nelle variabili
  101. ; X_OGG e Y_OGG. Il BOB e lo schermo sono in formato normale, e pertanto
  102. ; sono utilizzate le formule relative a questo formato nel calcolo dei
  103. ; valori da scrivere nei registri del blitter. Inoltre viene impiegata la
  104. ; tecnica di mascherare l'ultima word del BOB vista nella lezione
  105. ;****************************************************************************
  106.  
  107. ;    .         .     ___
  108. ;     .°·    °/\_/\_\\|/))
  109. ;     _______/. @¤  \/ /
  110. ;    (|O|___ /  ¯    \/
  111. ;     |_| /  \_______/~
  112. ;     :  /     `¡:°  \
  113. ;     . _\   ___·. _  \
  114. ;      * ¯\ /  /.  °  /
  115. ;     ð/aL \\_/______/
  116. ;            ¯¯  `----'
  117.  
  118. DisegnaOggetto:
  119.     lea    bitplane,a0    ; destinazione in a0
  120.     move.w    ogg_y(pc),d0    ; coordinata Y
  121.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga e` costituita da
  122.                 ; 40 bytes
  123.     add.w    d0,a0        ; aggiungi all'indirizzo di partenza
  124.  
  125.     move.w    ogg_x(pc),d0    ; coordinata X
  126.     move.w    d0,d1        ; copia
  127.     and.w    #$000f,d0    ; si selezionano i primi 4 bit perche' vanno
  128.                 ; inseriti nello shifter del canale A 
  129.     lsl.w    #8,d0        ; i 4 bit vengono spostati sul nibble alto
  130.     lsl.w    #4,d0        ; della word...
  131.     move.w    d0,d2
  132.  
  133.     or.w    #$0FCA,d0    ; ...giusti per inserirsi nel registro BLTCON0
  134.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  135.                 ; arrotonda ai multipli di 8 per il puntatore
  136.                 ; allo schermo, ovvero agli indirizzi dispari
  137.                 ; (anche ai byte, quindi)
  138.                 ; x es.: un 16 come coordinata diventa il
  139.                 ; byte 2 
  140.     and.w    #$fffe,d1    ; escludo il bit 0 del
  141.     add.w    d1,a0        ; somma all'indirizzo del bitplane, trovando
  142.                 ; l'indirizzo giusto di destinazione
  143.  
  144.     lea    figura,a1    ; puntatore sorgente
  145.     moveq    #3-1,d7        ; ripeti per ogni plane
  146. PlaneLoop:
  147.     btst    #6,2(a5)
  148. WBlit2:
  149.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  150.     bne.s    wblit2
  151.  
  152.     move.l    #$ffff0000,$44(a5)    ; BLTAFWM = $ffff fa passare tutto
  153.                     ; BLTALWM = $0000 azzera l'ultima word
  154.  
  155.  
  156.     move.w    d0,$40(a5)        ; BLTCON0 (usa A+D)
  157.     move.w    d2,$42(a5)        ; BLTCON1 (nessun modo speciale)
  158.     move.l    #$0022fffe,$60(a5)
  159.     move.l    #$fffe0022,$64(a5)    ; BLTAMOD=$fffe=-2 torna indietro
  160.                     ; all'inizio della riga.
  161.                     ; BLTDMOD=40-6=34=$22 come al solito
  162.     move.l    #Maschera,$50(a5)    ; BLTAPT  (fisso alla maschera)
  163.     move.l    a0,$54(a5)        ; BLTDPT  (schermo)
  164.     move.l    a0,$48(a5)        ; BLTCPT  (schermo)
  165.     move.l    a1,$4c(a5)        ; BLTBPT  (figura bob)
  166.     move.w    #(64*11)+3,$58(a5)    ; BLTSIZE (via al blitter !)
  167.  
  168.     lea    4*11(a1),a1        ; punta al prossimo plane sorgente
  169.                     ; ogni plane e` largo 2 words e alto
  170.                     ; 11 righe
  171.  
  172.     lea    40*256(a0),a0        ; punta al prossimo plane destinazione
  173.     dbra    d7,PlaneLoop
  174.  
  175.     rts
  176.  
  177. ;****************************************************************************
  178. ; Questa routine copia il rettangolo di sfondo che verra` sovrascritto dal
  179. ; BOB in un buffer
  180. ;****************************************************************************
  181.  
  182. SalvaSfondo:
  183.     lea    bitplane,a0    ; destinazione in a0
  184.     move.w    ogg_y(pc),d0    ; coordinata Y
  185.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga e` costituita da
  186.                 ; 40 bytes
  187.     add.w    d0,a0        ; aggiungi all'indirizzo di partenza
  188.  
  189.     move.w    ogg_x(pc),d1    ; coordinata X
  190.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  191.                 ; arrotonda ai multipli di 8 per il puntatore
  192.                 ; allo schermo, ovvero agli indirizzi dispari
  193.                 ; (anche ai byte, quindi)
  194.                 ; x es.: un 16 come coordinata diventa il
  195.                 ; byte 2 
  196.     and.w    #$fffe,d1    ; escludo il bit 0 del
  197.     add.w    d1,a0        ; somma all'indirizzo del bitplane, trovando
  198.                 ; l'indirizzo giusto di destinazione
  199.  
  200.     lea    Buffer,a1    ; indirizzo destinazione
  201.     moveq    #3-1,d7        ; ripeti per ogni plane
  202. PlaneLoop2:
  203.     btst    #6,2(a5) ; dmaconr
  204. WBlit3:
  205.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  206.     bne.s    wblit3
  207.  
  208.     move.l    #$ffffffff,$44(a5)    ; BLTAFWM = $ffff fa passare tutto
  209.                     ; BLTALWM = $ffff fa passare tutto
  210.  
  211.  
  212.     move.l    #$09f00000,$40(a5)    ; BLTCON0 e BLTCON1 copia da A a D
  213.     move.l    #$00220000,$64(a5)    ; BLTAMOD=40-4=36=$24
  214.                     ; BLTDMOD=0 nel buffer
  215.     move.l    a0,$50(a5)        ; BLTAPT - ind. sorgente
  216.     move.l    a1,$54(a5)        ; BLTDPT - buffer
  217.     move.w    #(64*11)+3,$58(a5)    ; BLTSIZE (via al blitter !)
  218.  
  219.     lea    40*256(a0),a0        ; punta al prossimo plane sorgente
  220.     lea    6*11(a1),a1        ; punta al prossimo plane destinazione
  221.                     ; ogni blittata e` larga 3 words e alto
  222.                     ; 11 righe
  223.     dbra    d7,PlaneLoop2
  224.  
  225.     rts
  226.  
  227. ;****************************************************************************
  228. ; Questa routine copia il contenuto del buffer nel rettangolo di schermo
  229. ; che lo conteneva prima del disegno del BOB. In questo modo viene anche
  230. ; cancellato il BOB dalla vecchia posizione.
  231. ;****************************************************************************
  232.  
  233. RipristinaSfondo:
  234.     lea    bitplane,a0    ; destinazione in a0
  235.     move.w    ogg_y(pc),d0    ; coordinata Y
  236.     mulu.w    #40,d0        ; calcola indirizzo: ogni riga e` costituita da
  237.                 ; 40 bytes
  238.     add.w    d0,a0        ; aggiungi all'indirizzo di partenza
  239.  
  240.     move.w    ogg_x(pc),d1    ; coordinata X
  241.     lsr.w    #3,d1        ; (equivalente ad una divisione per 8)
  242.                 ; arrotonda ai multipli di 8 per il puntatore
  243.                 ; allo schermo, ovvero agli indirizzi dispari
  244.                 ; (anche ai byte, quindi)
  245.                 ; x es.: un 16 come coordinata diventa il
  246.                 ; byte 2 
  247.     and.w    #$fffe,d1    ; escludo il bit 0 del
  248.     add.w    d1,a0        ; somma all'indirizzo del bitplane, trovando
  249.                 ; l'indirizzo giusto di destinazione
  250.  
  251.     lea    Buffer,a1    ; indirizzo sorgente
  252.     moveq    #3-1,d7        ; ripeti per ogni plane
  253. PlaneLoop3:
  254.     btst    #6,2(a5)     ; dmaconr
  255. WBlit4:
  256.     btst    #6,2(a5)     ; attendi che il blitter abbia finito
  257.     bne.s    wblit4
  258.  
  259.     move.l    #$ffffffff,$44(a5)    ; BLTAFWM = $ffff fa passare tutto
  260.                     ; BLTALWM = $ffff fa passare tutto
  261.  
  262.  
  263.     move.l    #$09f00000,$40(a5)    ; BLTCON0 e BLTCON1 copia da A a D
  264.     move.l    #$00000022,$64(a5)    ; BLTAMOD=0 (buffer)
  265.                     ; BLTDMOD=40-6=34=$22
  266.     move.l    a1,$50(a5)        ; BLTAPT (buffer)
  267.     move.l    a0,$54(a5)        ; BLTDPT (schermo)
  268.     move.w    #(64*11)+3,$58(a5)    ; BLTSIZE (via al blitter !)
  269.  
  270.     lea    40*256(a0),a0        ; punta al prossimo plane destinazione
  271.     lea    6*11(a1),a1        ; punta al prossimo plane sorgente
  272.                     ; ogni blittata e` larga 3 words e alto
  273.                     ; 11 righe
  274.     dbra    d7,PlaneLoop3
  275.     rts
  276.  
  277. ;****************************************************************************
  278. ; Questa routine legge il mouse e aggiorna i valori contenuti nelle
  279. ; variabili OGG_X e OGG_Y
  280. ;****************************************************************************
  281.  
  282. LeggiMouse:
  283.     move.b    $dff00a,d1    ; JOY0DAT posizione verticale mouse
  284.     move.b    d1,d0        ; copia in d0
  285.     sub.b    mouse_y(PC),d0    ; sottrai vecchia posizione mouse
  286.     beq.s    no_vert        ; se la differenza = 0, il mouse e` fermo
  287.     ext.w    d0        ; trasforma il byte in word
  288.                 ; (vedi alla fine del listato)
  289.     add.w    d0,ogg_y    ; modifica posizione oggetto
  290.  
  291. no_vert:
  292.       move.b    d1,mouse_y    ; salva posizione mouse per la prossima volta
  293.  
  294.     move.b    $dff00b,d1    ; posizione orizzontale mouse
  295.     move.b    d1,d0        ; copia in d0
  296.     sub.b    mouse_x(PC),d0    ; sottrai vecchia posizione
  297.     beq.s    no_oriz        ; se la differenza = 0, il mouse e` fermo
  298.     ext.w    d0        ; trasforma il byte in word
  299.                 ; (vedi alla fine del listato)
  300.     add.w    d0,ogg_x    ; modifica pos. oggetto
  301. no_oriz
  302.       move.b    d1,mouse_x    ; salva posizione mouse per la prossima volta
  303.     RTS
  304.  
  305. OGG_Y:        dc.w    0    ; qui viene memorizzata la Y dell'oggetto
  306. OGG_X:        dc.w    0    ; qui viene memorizzata la X dell'oggetto
  307. MOUSE_Y:    dc.b    0    ; qui viene memorizzata la Y del mouse
  308. MOUSE_X:    dc.b    0    ; qui viene memorizzata la X del mouse
  309.  
  310. ;****************************************************************************
  311.  
  312.     SECTION    GRAPHIC,DATA_C
  313.  
  314. COPPERLIST:
  315.     dc.w    $8E,$2c81    ; DiwStrt
  316.     dc.w    $90,$2cc1    ; DiwStop
  317.     dc.w    $92,$38        ; DdfStart
  318.     dc.w    $94,$d0        ; DdfStop
  319.     dc.w    $102,0        ; BplCon1
  320.     dc.w    $104,0        ; BplCon2
  321.     dc.w    $108,0        ; VALORE MODULO = 0
  322.     dc.w    $10a,0        ; ENTRAMBI I MODULI ALLO STESSO VALORE.
  323.  
  324.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres
  325.  
  326. BPLPOINTERS:
  327.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  328.     dc.w $e4,$0000,$e6,$0000
  329.     dc.w $e8,$0000,$ea,$0000
  330.  
  331.     dc.w    $0180,$000    ; color0
  332.     dc.w    $0182,$475    ; color1
  333.     dc.w    $0184,$fff    ; color2
  334.     dc.w    $0186,$ccc    ; color3
  335.     dc.w    $0188,$999    ; color4
  336.     dc.w    $018a,$232    ; color5
  337.     dc.w    $018c,$777    ; color6
  338.     dc.w    $018e,$444    ; color7
  339.  
  340.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  341.  
  342. ;****************************************************************************
  343.  
  344. ; Questi sono i dati che compongono la figura del bob.
  345. ; Il bob e` in formato normale, largo 32 pixel (2 words)
  346. ; alto 11 righe e formato da 3 bitplanes
  347.  
  348. Figura:    dc.l    $007fc000    ; plane 1
  349.     dc.l    $03fff800
  350.     dc.l    $07fffc00
  351.     dc.l    $0ffffe00
  352.     dc.l    $1fe07f00
  353.     dc.l    $1fe07f00
  354.     dc.l    $1fe07f00
  355.     dc.l    $0ffffe00
  356.     dc.l    $07fffc00
  357.     dc.l    $03fff800
  358.     dc.l    $007fc000
  359.  
  360.     dc.l    $00000000    ; plane 2
  361.     dc.l    $007fc000
  362.     dc.l    $03fff800
  363.     dc.l    $07fffc00
  364.     dc.l    $0fe07e00
  365.     dc.l    $0fe07e00
  366.     dc.l    $0fe07e00
  367.     dc.l    $07fffc00
  368.     dc.l    $03fff800
  369.     dc.l    $007fc000
  370.     dc.l    $00000000
  371.  
  372.     dc.l    $007fc000    ; plane 3
  373.     dc.l    $03803800
  374.     dc.l    $04000400
  375.     dc.l    $081f8200
  376.     dc.l    $10204100
  377.     dc.l    $10204100
  378.     dc.l    $10204100
  379.     dc.l    $081f8200
  380.     dc.l    $04000400
  381.     dc.l    $03803800
  382.     dc.l    $007fc000
  383.  
  384. Maschera:
  385.     dc.l    $007fc000
  386.     dc.l    $03fff800
  387.     dc.l    $07fffc00
  388.     dc.l    $0ffffe00
  389.     dc.l    $1fe07f00
  390.     dc.l    $1fe07f00
  391.     dc.l    $1fe07f00
  392.     dc.l    $0ffffe00
  393.     dc.l    $07fffc00
  394.     dc.l    $03fff800
  395.     dc.l    $007fc000
  396.  
  397.  
  398.  
  399. ;****************************************************************************
  400.  
  401. BITPLANE:
  402.     incbin    "amiga.raw"        ; qua carichiamo la figura
  403.  
  404. ;****************************************************************************
  405.  
  406.     SECTION    BUFFER,BSS_C
  407.  
  408. ; Questo e` il buffer nel quale salviamo di volta in volta lo sfondo.
  409. ; ha le stesse dimensioni di una blittata: altezza 11, larghezza 3 words
  410. ; 3 bitplanes
  411.  
  412. Buffer:
  413.     ds.w    11*3*3
  414.  
  415.     end
  416.  
  417. ;****************************************************************************
  418.  
  419. In questo esempio risolviamo il problema dello sfondo con i BOB.
  420. La struttura del programma e` la stessa di lezione9i3.s.
  421. Le differenze sono tutte nella routine "DisegnaOggetto", che adotta la
  422. procedura di disegno spiegata nella lezione. Come vedete per la blittata
  423. si pone LF=$CA (cookie-cut) e si usano tutti i canali del blitter (A per la 
  424. maschera, B per il BOB e C per lo sfondo).
  425.  
  426.