home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti7 / lezione11l7.s < prev    next >
Text File  |  1995-09-29  |  11KB  |  365 lines

  1.  
  2. ; Lezione11l7.s        8 sprites attacched (quindi 4 a 16 colori) usati,
  3. ;            anzi "riutilizzati" 128 volte per linea.
  4.  
  5.     SECTION    MegaRiuso,CODE
  6.  
  7. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  8.  
  9. *****************************************************************************
  10.     include    "startup2.s"    ; Salva Copperlist Etc.
  11. *****************************************************************************
  12.  
  13.         ;5432109876543210
  14. DMASET    EQU    %1000001110100000    ; copper,bitplane,sprites
  15. ;         -----a-bcdefghij
  16.  
  17. Waitdisk    EQU    30
  18.  
  19. NumeroLinee    =    128
  20. LungSpr        =    NumeroLinee*8
  21.  
  22. START:
  23.  
  24. ; Punta gli sprites
  25.  
  26.     MOVE.L    #SpritesBuffer,d0
  27.     LEA    SPRITEPOINTERS,A1
  28.     MOVEQ    #8-1,D1            ;num of sprites = 8
  29. POINTB:
  30.     move.w    d0,6(a1)
  31.     swap    d0
  32.     move.w    d0,2(a1)
  33.     swap    d0
  34.     add.l    #LungSpr,d0        ;lenght of sprite
  35.     addq.w    #8,a1
  36.     dbra    d1,POINTB        ;Rifai D1 volte
  37.  
  38. ; Puntiamo il biplane azzerato
  39.  
  40.     MOVE.L    #PLANE,d0
  41.     LEA    BPLPOINTERS,A1
  42.     move.w    d0,6(a1)
  43.     swap    d0
  44.     move.w    d0,2(a1)
  45.  
  46.     bsr.s    CreaSprites    ; routine che crea i 4 sprite attacched,
  47.                 ; ossia tutti e 8 gli sprite, fatti da
  48.                 ; 128 riutilizzi di 1 linea ognuno!
  49.  
  50.     lea    $dff000,a5
  51.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  52.                     ; e sprites.
  53.  
  54.     move.l    #COPPER,$80(a5)        ; Puntiamo la nostra COP
  55.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  56.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  57.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  58.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  59.  
  60. mouse:
  61.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  62.     MOVE.L    #$12c00,d2    ; linea da aspettare = $12c
  63. Waity1:
  64.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  65.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  66.     CMPI.L    D2,D0        ; aspetta la linea $010
  67.     BNE.S    Waity1
  68.  
  69.     btst    #2,$16(A5)    ; Tasto destro premuto?
  70.     beq.s    NonOndegg
  71.  
  72.     bsr.w    OndeggiaSpriteS    ; ondeggia gli 8 sprites riutilizzati
  73.  
  74. NonOndegg:
  75.     btst    #6,$bfe001    ; tasti sin. mouse premuto?
  76.     bne.s    mouse
  77.     rts
  78.  
  79. ; ****************************************************************************
  80. ; Routine che crea gli 8 sprites, (ossia 4 attacched) nello "SpritesBuffer".
  81. ; Da notare che gli sprite attacched sono a sua volta affiancati a 2 a 2,
  82. ; in modo da ottenere 2 barre larghe 16*2=32 pixel, a 16 colori.
  83. ; Innanzitutto occorre ricordare che ogni sprite si puo' "riutilizzare",
  84. ; ossia "sotto" ad uno sprite, dopo la fine dello sprite, si puo'
  85. ; mettere un'altro sprite, a patto pero' che la sua posizione verticale
  86. ; di inizio lasci 1 linea "vuota". Qua usiamo questo fatto in modo massiccio,
  87. ; infatti ogni riuso dello sprite e' di 1 linea, per cui otteniamo una
  88. ; striscia verticale (larga 16 pixel) fatta di tanti "spritini" alti una linea
  89. ; distanziati da una linea "vuota". Per riempire le 256 linee verticali dello
  90. ; schermo, facciamo ben 128 utilizzi per ogni sprite! Ma almeno possiamo
  91. ; "curvare" quella linea di quanto vogliamo, dato che ogni striscia ha un
  92. ; proprio HSTART (posizione orizzontale) indipendente.
  93. ;
  94. ; Ricordiamo la struttura di uno sprite:
  95. ;
  96. ;VSTART:
  97. ;    dc.b xx        ; Pos. verticale (da $2c a $f2)
  98. ;HSTART:
  99. ;    dc.b xx+(xx)    ; Pos. orizzontale (da $40 a $d8)
  100. ;VSTOP:
  101. ;    dc.b xx        ; fine verticale.
  102. ;    dc.b $00    ; byte speciale: bit 7 per ATTACCHED!!
  103. ;    dc.l    XXXXX    ; bitplane dello sprite (disegno!) qua 1 linea
  104. ;    dc.w    0,0    ; 2 word azzerate di FINE SPRITE, che qua mettiamo
  105. ;            ; mai... quindi qua ci saranno gia' i VSTART e il
  106. ;            ; VSTOP del prossimo sprite!
  107. ;
  108. ; 4 bytes -> words di controllo + 4 bytes -> figura (1 striscia)
  109. ; 4*2= 8 -> lunghezza di uno sprite; 8*128 = 1024, lunghezza 1 sprite.
  110. ; facciamo 128 riutilizzi di ogni sprite: 2 linee per sprite = 256 linee!
  111. ;
  112. ; ****************************************************************************
  113.  
  114. ; 1024 bytes (8*128) a sprite
  115.  
  116. CreaSprites:
  117.     lea    SpritesBuffer,A0 ; destinazione
  118.     move.l    #%10000000,D5    ; bit 7 settato - per attacched in sprite+3
  119.     moveq    #$2c,D0        ; VSTART - iniziamo da $2c
  120. CreaLoop:
  121.     move.b    d0,(A0)        ; metti il vstart agli 8 sprite
  122.     move.b    d0,LungSpr(A0)    ; 2 (ogni sprite e' lungo 2400 bytes)
  123.     move.b    d0,LungSpr*2(A0)    ; 3
  124.     move.b    d0,LungSpr*3(A0)    ; 4
  125.     move.b    d0,LungSpr*4(A0)    ; 5
  126.     move.b    d0,LungSpr*5(A0)    ; 6
  127.     move.b    d0,LungSpr*6(A0)    ; 7
  128.     move.b    d0,LungSpr*7(A0)    ; 8
  129.  
  130.     move.l    d0,D1
  131.     addq.w    #1,D1        ; VSTART 1 linea sotto -> usiamolo come VSTOP
  132.  
  133.     move.b    d1,2(A0)        ; metti il vstop agli 8 sprite
  134.     move.b    d1,LungSpr+2(A0)    ; 2 (ogni sprite e' lungo 2400 bytes)
  135.     move.b    d1,(LungSpr*2)+2(A0)    ; 3
  136.     move.b    d1,(LungSpr*3)+2(A0)    ; 4
  137.     move.b    d1,(LungSpr*4)+2(A0)    ; 5
  138.     move.b    d1,(LungSpr*5)+2(A0)    ; 6
  139.     move.b    d1,(LungSpr*6)+2(A0)    ; 7
  140.     move.b    d1,(LungSpr*7)+2(A0)    ; 8
  141.  
  142. ; Settiamo i bit attacched agli 8 sprite
  143.  
  144.     move.b    d5,3(A0)        ; metti il byte spec. agli 8 sprite
  145.     move.b    d5,LungSpr+3(A0)    ; 2 (ogni sprite e' lungo 2400 bytes)
  146.     move.b    d5,(LungSpr*2)+3(A0)    ; 3
  147.     move.b    d5,(LungSpr*3)+3(A0)    ; 4
  148.     move.b    d5,(LungSpr*4)+3(A0)    ; 5
  149.     move.b    d5,(LungSpr*5)+3(A0)    ; 6
  150.     move.b    d5,(LungSpr*6)+3(A0)    ; 7
  151.     move.b    d5,(LungSpr*7)+3(A0)    ; 8
  152.  
  153.     addq.w    #4,A0            ; saltiamo le 2 word di controllo
  154.                     ; e andiamo nei plane degli sprite!
  155.  
  156.     move.l    #$55553333,(A0)        ; 1 \ metti la linea sfumata
  157.     move.l    #$0f0f00ff,LungSpr(A0)    ; 2 / attacched 1!
  158.  
  159.     move.l    #$aaaacccc,LungSpr*2(A0)    ; 3 \ attacched 2!
  160.     move.l    #$f0f0ff00,LungSpr*3(A0)    ; 4 /
  161.  
  162.     move.l    #$55553333,LungSpr*4(A0)    ; 5 \ attacched 3!
  163.     move.l    #$0f0f00ff,LungSpr*5(A0)    ; 6 /
  164.  
  165.     move.l    #$aaaacccc,LungSpr*6(A0)    ; 7 \ attacched 4!
  166.     move.l    #$f0f0ff00,LungSpr*7(A0)    ; 8 /
  167.  
  168.     addq.w    #4,A0            ; saltiamo le 2 word dei plane,
  169.                     ; per andare alle prossime
  170.                     ; 2 word di controllo, dato che
  171.                     ; non ci sono le 2 word azzerate
  172.                     ; di fine sprite.
  173.  
  174.     cmp.b    #%10000110,D5    ; siamo sotto la linea $FF?
  175.     beq.s    SiamoSottoFF
  176.     addq.b    #2,D0        ; vstart 2 linee sotto per il prossimo
  177.                 ; riutilizzo dello sprite. Dato che ogni
  178.                 ; sprite e' alto 1 linea, e che tra un
  179.                 ; utilizzo ed un altro occorre lasciare
  180.                 ; una linea vuota, addiamo 2.
  181.     bne.w    CreaLoop    ; siamo giunti a $fe+2 = $00?
  182.                 ; Se si, occorre settare il bit alto di
  183.                 ; vstart e vstop. Altrimenti continua
  184.  
  185.     move.b    #%10000110,D5    ; %10000110 -> settati i 2 bit alti di vstart
  186.                 ; e vstop per andare sotto la linea $FF
  187.     subq.b    #2,D0        ; ritorniamo "indietro" di 1 passo...
  188.  
  189. SiamoSottoFF:
  190.     addq.b    #2,D0        ; vstart 2 linee sotto...
  191.     cmpi.b    #$2c,D0        ; siamo alla posizione $FF+$2c?
  192.     bne.w    CreaLoop    ; se non ancora, continua!
  193.     rts
  194.  
  195. ; ****************************************************************************
  196.  
  197. ; Parametri per "IS"
  198.  
  199. ; BEG> 0
  200. ; END> 360
  201. ; AMOUNT> 250
  202. ; AMPLITUDE> $20
  203. ; YOFFSET> $20
  204. ; SIZE (B/W/L)> b
  205. ; MULTIPLIER> 1
  206.  
  207. SinTabHstarts:
  208.  dc.B    $20,$21,$22,$23,$24,$24,$25,$26,$27,$28,$28,$29,$2A,$2B,$2B,$2C
  209.  dc.B    $2D,$2E,$2E,$2F,$30,$30,$31,$32,$32,$33,$34,$34,$35,$36,$36,$37
  210.  dc.B    $37,$38,$38,$39,$39,$3A,$3A,$3B,$3B,$3C,$3C,$3C,$3D,$3D,$3D,$3E
  211.  dc.B    $3E,$3E,$3F,$3F,$3F,$3F,$3F,$40,$40,$40,$40,$40,$40,$40,$40,$40
  212.  dc.B    $40,$40,$40,$40,$40,$40,$3F,$3F,$3F,$3F,$3F,$3E,$3E,$3E,$3D,$3D
  213.  dc.B    $3D,$3C,$3C,$3C,$3B,$3B,$3A,$3A,$39,$39,$38,$38,$37,$37,$36,$36
  214.  dc.B    $35,$34,$34,$33,$32,$32,$31,$30,$30,$2F,$2E,$2E,$2D,$2C,$2B,$2B
  215.  dc.B    $2A,$29,$28,$28,$27,$26,$25,$24,$24,$23,$22,$21,$20,$20,$1F,$1E
  216.  dc.B    $1D,$1C,$1C,$1B,$1A,$19,$18,$18,$17,$16,$15,$15,$14,$13,$12,$12
  217.  dc.B    $11,$10,$10,$0F,$0E,$0E,$0D,$0C,$0C,$0B,$0A,$0A,$09,$09,$08,$08
  218.  dc.B    $07,$07,$06,$06,$05,$05,$04,$04,$04,$03,$03,$03,$02,$02,$02,$01
  219.  dc.B    $01,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  220.  dc.B    $00,$00,$00,$01,$01,$01,$01,$01,$02,$02,$02,$03,$03,$03,$04,$04
  221.  dc.B    $04,$05,$05,$06,$06,$07,$07,$08,$08,$09,$09,$0A,$0A,$0B,$0C,$0C
  222.  dc.B    $0D,$0E,$0E,$0F,$10,$10,$11,$12,$12,$13,$14,$15,$15,$16,$17,$18
  223.  dc.B    $18,$19,$1A,$1B,$1C,$1C,$1D,$1E,$1F,$20
  224. FinTab:
  225.  
  226. TabLunghezz    = FinTab-SinTabHstarts
  227.  
  228. OndeggiaSpriteS:
  229.     addq.b    #1,Barra1OffSalv
  230.     moveq    #0,D0
  231.     move.b    Barra1OffSalv(pc),D0
  232.     cmp.w    #TabLunghezz,D0        ; siamo al massimo offset?
  233.     bne.s    NonRipartireO1
  234.     clr.b    Barra1OffSalv        ; riparti da capo
  235. NonRipartireO1:
  236.     addq.b    #2,Barra2OffSalv
  237.     moveq    #0,D0
  238.     move.b    Barra2OffSalv(pc),D0
  239.     cmp.w    #TabLunghezz,D0
  240.     bne.s    NonRipartireO2
  241.     clr.b    Barra2OffSalv        ; riparti da capo
  242. NonRipartireO2:
  243.     moveq    #0,D1
  244.     moveq    #0,D2
  245.     moveq    #0,D3
  246.     moveq    #0,D4
  247.     moveq    #0,D5
  248.     lea    SpritesBuffer,A0    ; indirizzo primo sprite
  249.     lea    SinTabHstarts(PC),A1
  250.     move.b    Barra1OffSalv(pc),D0
  251.     move.b    Barra2OffSalv(pc),D2
  252.     move.b    0(A1,D0.w),D5    ; da sintab secondo Barra1OffSalv
  253. OndeggiaLoop:
  254.     move.b    0(A1,D0.w),D3    ; da sintab - per barra 1
  255.     move.b    0(A1,D2.w),D4    ; da sintab - per barra 2
  256.  
  257. ; modifica tutto
  258.  
  259.     add.b    D4,D3    ; barra 1
  260.     sub.b    D5,D3    ; 
  261.  
  262.     add.b    D5,D4    ; barra 2
  263.  
  264.     add.b    #105,D3    ; centra barra 1
  265.     add.b    #75,D4    ; centra barra 2
  266.  
  267. ; Modifica gli HSTART (posizione orizzontale) degli 8 sprites
  268.  
  269. ; ** Prima Barra
  270.  
  271.     move.b    D3,1(A0)        ; sprite 1
  272.     move.b    D3,LungSpr+1(A0)    ; 2
  273.  
  274. ; ora lo sprite attacched della stessa barra, ma affiancato (16 pixel dopo)
  275.  
  276.     addq.w    #8,D3            ; adda 8, ossia 16 pixel, dato che
  277.                     ; HSTART adda 2 ogni volta.
  278.     move.b    D3,(LungSpr*2)+1(A0)    ; 3
  279.     move.b    D3,(LungSpr*3)+1(A0)    ; 4
  280.  
  281. ; ** Seconda Barra
  282.  
  283.     move.b    D4,(LungSpr*4)+1(A0)    ; 5
  284.     move.b    D4,(LungSpr*5)+1(A0)    ; 6
  285.  
  286.     addq.w    #8,D4            ; adda 8, ossia 16 pixel, dato che
  287.                     ; HSTART adda 2 ogni volta.
  288.     move.b    D4,(LungSpr*6)+1(A0)    ; 7
  289.     move.b    D4,(LungSpr*7)+1(A0)    ; 8
  290.  
  291.     addq.w    #1,D2        ; offset prossimo - bar 2...
  292.     cmpi.w    #TabLunghezz,D2    ; siamo al massimo?
  293.     bne.s    Nonrestart2
  294.     moveq    #0,D2        ; rileggi dal primo valore...
  295. Nonrestart2:
  296.     addq.w    #1,D0        ; offset prossimo - bar 1
  297.     cmp.w    #TabLunghezz,D0    ; siamo al massimo?
  298.     bne.s    Nonrestart1
  299.     moveq    #0,D0        ; rileggi dal primo valore
  300. Nonrestart1:
  301.     addq.w    #8,A0        ; salta al prossimo riutilizzo di sprite
  302.  
  303.     cmpa.l    #SpritesBuffer+LungSpr,a0 ; abbiamo finito?
  304.     bne.s    OndeggiaLoop
  305.     rts
  306.  
  307. Barra1OffSalv:
  308.     dc.w    0
  309. Barra2OffSalv:
  310.     dc.w    0
  311.  
  312.  
  313. ; ****************************************************************************
  314. ;                COPPERLIST
  315. ; ****************************************************************************
  316.  
  317.     section    baucoppe,data_c
  318.  
  319. COPPER:
  320.     dc.w    $8e,$2c81    ; diwstart
  321.     dc.w    $90,$2cc1    ; diwstop
  322.     dc.w    $92,$38        ; ddfstart
  323.     dc.w    $94,$d0        ; ddfstop
  324.  
  325. SPRITEPOINTERS:
  326.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0,$12a,0,$12c,0,$12e,0
  327.     dc.w    $130,0,$132,0,$134,0,$136,0,$138,0,$13a,0,$13c,0,$13e,0
  328.  
  329.     dc.w    $108,0    ; bpl1mod
  330.     dc.w    $10a,0    ; bpl2mod
  331.     dc.w    $102,0    ; bplcon1
  332.     dc.w    $104,0    ; bplcon2
  333.  
  334. BPLPOINTERS:
  335.     dc.w    $e0,0,$e2,0    ; plane 1
  336.  
  337.     dc.w    $100,$1200    ; bplcon0 - 1 plane lowres
  338.  
  339.     dc.w    $180,0        ; color0 - nero
  340.     dc.w    $182,$fff    ; color1 - bianco
  341.  
  342. ; Colori degli sprite (attacched) - da color17 a color31
  343.  
  344.     dc.w    $1a2,$010,$1a4,$020,$1a6,$030
  345.     dc.w    $1a8,$140,$1aa,$250,$1ac,$360,$1ae,$470
  346.     dc.w    $1b0,$580,$1b2,$690,$1b4,$7a0,$1b6,$8b0
  347.     dc.w    $1b8,$9c0,$1ba,$ad0,$1bc,$be0,$1be,$cf0
  348.  
  349.     dc.w    $ffff,$fffe    ; fine copperlist
  350.  
  351. ; ****************************************************************************
  352.  
  353.     section    grafica,bss_C
  354.  
  355. SpritesBuffer:
  356.     DS.B    LungSpr*8    ; 1024 bytes ogni sprite megariutilizzato
  357.  
  358. ; ****************************************************************************
  359.  
  360. plane:
  361.     ds.b    40*256    ; 1 plane lowres "nero" come sfondo.
  362.  
  363.     END
  364.  
  365.