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

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