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

  1.  
  2. ;  Lezione11l3c.s - ondeggiamo con movimento "vivo" una pic.
  3.  
  4.     SECTION    coplanes,CODE
  5.  
  6. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  7.  
  8. *****************************************************************************
  9.     include    "startup2.s" ; Salva Copperlist Etc.
  10. *****************************************************************************
  11.  
  12.         ;5432109876543210
  13. DMASET    EQU    %1000001110000000    ; solo copper e bitplane DMA
  14.  
  15. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  16.  
  17. NumLinee    EQU    53    ; Numero di linee da fare nell'effetto.
  18.  
  19. scr_bytes    = 40    ; Numero di bytes per ogni linea orizzontale.
  20.             ; Da questa si calcola la larghezza dello schermo,
  21.             ; moltiplicando i bytes per 8: schermo norm. 320/8=40
  22.             ; Es. per uno schermo largo 336 pixel, 336/8=42
  23.             ; larghezze esempio:
  24.             ; 264 pixel = 33 / 272 pixel = 34 / 280 pixel = 35
  25.             ; 360 pixel = 45 / 368 pixel = 46 / 376 pixel = 47
  26.             ; ... 640 pixel = 80 / 648 pixel = 81 ...
  27.  
  28. scr_h        = 256    ; Altezza dello schermo in linee
  29. scr_x        = $81    ; Inizio schermo, posizione XX (normale $xx81) (129)
  30. scr_y        = $2c    ; Inizio schermo, posizione YY (normale $2cxx) (44)
  31. scr_res        = 1    ; 2 = HighRes (640*xxx) / 1 = LowRes (320*xxx)
  32. scr_lace    = 0    ; 0 = non interlace (xxx*256) / 1 = interlace (xxx*512)
  33. ham        = 1    ; 0 = non ham / 1 = ham
  34. scr_bpl        = 6    ; Numero Bitplanes
  35.  
  36. ; parametri calcolati automaticamente
  37.  
  38. scr_w        = scr_bytes*8        ; larghezza dello schermo
  39. scr_size    = scr_bytes*scr_h    ; dimensione in bytes dello schermo
  40. BPLC0    = ((scr_res&2)<<14)+(scr_bpl<<12)+$200+(scr_lace<<2)+(ham<<11)
  41. DIWS    = (scr_y<<8)+scr_x
  42. DIWSt    = ((scr_y+scr_h/(scr_lace+1))&255)<<8+(scr_x+scr_w/scr_res)&255
  43. DDFS    = (scr_x-(16/scr_res+1))/2
  44. DDFSt    = DDFS+(8/scr_res)*(scr_bytes/2-scr_res)
  45.  
  46.  
  47. START:
  48.  
  49. ; Puntiamo la PIC
  50.  
  51.     LEA    bplpointers,A0
  52.     MOVE.L    #LOGO+40*40,d0    ; indirizzo logo (un po' ribassato)
  53.     MOVEQ    #6-1,D7        ; 6 bitplanes HAM.
  54. pointloop:
  55.     MOVE.W    D0,6(A0)
  56.     SWAP    D0
  57.     MOVE.W    D0,2(A0)
  58.     SWAP    D0
  59.     ADDQ.w    #8,A0
  60.     ADD.L    #176*40,D0    ; lunghezza plane
  61.     DBRA    D7,pointloop
  62.  
  63.     bsr.s    PreparaCopEff    ; Prepara l'effetto copper
  64.  
  65.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  66.                     ; e sprites.
  67.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  68.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  69.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  70.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  71.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  72.  
  73. mouse:
  74.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  75.     MOVE.L    #$11000,d2    ; linea da aspettare = $110
  76. Waity1:
  77.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  78.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  79.     CMPI.L    D2,D0        ; aspetta la linea $110
  80.     BNE.S    Waity1
  81.  
  82.     BSR.W    LOGOEFF2    ; "allunga" la pic usando i moduli
  83.     bsr.w    sugiu        ; sposta in basso e in alto
  84.     bsr.w    lefrig        ; sposta a destra e a sinistra
  85.  
  86.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  87.     MOVE.L    #$11000,d2    ; linea da aspettare = $110
  88. Aspetta:
  89.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  90.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  91.     CMPI.L    D2,D0        ; aspetta la linea $110
  92.     BEQ.S    Aspetta
  93.  
  94.     btst    #6,$bfe001    ; Mouse premuto?
  95.     bne.s    mouse
  96.     rts            ; esci
  97.  
  98.  
  99. *****************************************************************************
  100. ;        ROUTINE DI PREPARAZIONE DELL'EFFETTO COPPER            *
  101. *****************************************************************************
  102.  
  103. ;    _____________
  104. ;    \         __/____
  105. ;     \______________/
  106. ;      |_''__``_|
  107. ;    __(___)(___)__
  108. ;    \__  (__)  __/
  109. ;      /  ____  \
  110. ;      \ (____) /
  111. ;       \______/ g®m
  112.  
  113. PreparaCopEff:
  114.  
  115. ; Crea la copperlist
  116.  
  117.     LEA    coppyeff1,A0    ; Indirizzo dove creare l'effetto in copperlist
  118.     MOVE.L    #$1080000,D0    ; bpl1mod
  119.     MOVE.L    #$10A0000,D1    ; bpl2mod
  120.     MOVE.L    #$2E07FFFE,D2    ; wait (comincia dalla linea $2e)
  121.     MOVE.L    #$01000000,D3    ; Valore da addare al wait ogni volta
  122.     MOVEQ    #(NumLinee*2)-1,D7    ; 53 linee da fare
  123. makecop1:
  124.     MOVE.L    D2,(A0)+    ; Metti il WAIT
  125.     MOVE.L    D0,(A0)+    ; Metti il bpl1mod
  126.     MOVE.L    D1,(A0)+    ; Metti il bpl2mod
  127.     ADD.L    D3,D2        ; Fai aspettare una linea piu' in basso al wait
  128.     DBRA    D7,makecop1
  129.  
  130. ; Moltiplica per il modulo i valori nella tabella, in modo da poter essere
  131. ; usati come valori da mettere nei BPL1MOD e BPL2MOD.
  132.  
  133.     LEA    tabby2,A0    ; Indirizzo tabella
  134.     MOVE.W    #200-1,D7    ; Numero valori contenuti nella tabella
  135. tab2mul:
  136.     MOVE.W    (A0),D0        ; Prendi il valore dalla tabella
  137.     MULU.W    #40,D0        ; Moltiplicalo per la lungh. di 1 linea (mod.)
  138.     MOVE.W    D0,(A0)+    ; Rimetti il valore moltiplicato e avanza
  139.     DBRA    D7,tab2mul
  140.     rts
  141.  
  142.  
  143. ; Tabella contenente 200 valori .word, che saranno moltiplicati *40
  144.  
  145. tabby2:
  146.     dc.w    0,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0
  147.     dc.w    0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
  148.     dc.w    0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,-1,0,0,0
  149.     dc.w    0,0,-1,0,0,0,-1,0,0,0,-1,0,0,0,-1,0,0
  150.     dc.w    -1,0,0,-1,0,0,0,-1,0,0,-1,0,0,-1,0
  151.     dc.w    0,-1,0,0,0,-1,0,0,-1,0,0,-1,0,0,0
  152.     dc.w    -1,0,0,0,-1,0,0,0,-1,0,0,0,0,0,-1,0,0
  153.     dc.w    0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  154.     dc.w    0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0
  155.     dc.w    0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,0
  156. tab2end:
  157.  
  158. *****************************************************************************
  159. ;            ROUTINE COPPER EFFECT DEL LOGO                *
  160. *****************************************************************************
  161.  
  162. ;             _
  163. ;         .--' `-.
  164. ;         |.  _  |
  165. ;         |___/  |
  166. ;         `------'
  167. ;        ./  _  \.
  168. ;     _  |   | | |
  169. ;    | |_|___| |_|
  170. ;    |     | |_||
  171. ;    |_____| (_)|
  172. ;          |    |
  173. ;         (_____|g®m
  174. ;
  175.  
  176. ; L'effetto in copperlist e' cosi' strutturato:
  177. ;
  178. ;    DC.W    $2e07,$FFFE    ; wait
  179. ;    dc.w    $108        ; registro bpl1mod
  180. ;COPPEREFFY:
  181. ;    DC.w    xxx        ; valore bpl1mod
  182. ;    dc.w    $10A,xxx    ; registro e valore bpl1mod
  183. ;    wait... eccetera.
  184.  
  185. LOGOEFF2:
  186.     LEA    coppyeff1+6,A0        ; Indirizzo copper effect bpl1mod
  187.     LEA    TABBY2POINTER(PC),A4    ; Indirizzo puntatore alla tabella
  188.     LEA    tab2end(PC),A3        ; Indirizzo fine della tabella
  189.     MOVE.L    TABBY2POINTER(PC),A1    ; Dove siamo attualmente in tabella
  190.     MOVEQ    #10,D0
  191.     MOVEQ    #(NumLinee*2)-1,D7    ; numero di linee per l'effetto
  192. LOGOEFFLOOP:
  193.     MOVE.W    (A1),(A0)+    ; Copia il valore bpl1mod dalla tab alla cop
  194.     MOVE.W    (A1)+,2(A0)    ;  "      "      bpl2mod    "    "
  195.     ADDA.L    D0,A0        ; Vai al prossimo $dff108 (bpl1mod) in coplist
  196.     CMPA.L    A3,A1        ; Era l'ultimo valore della tabella?
  197.     BNE.S    norestart    ; Se non ancora, non ripartire
  198.     LEA    tabby2(PC),A1    ; Altrimenti, riparti!
  199. norestart:
  200.     DBRA    D7,LOGOEFFLOOP
  201.     ADDQ.L    #4,(A4)        ; Salta 2 valori in coplist (se si mette #2 si
  202.                 ; "rallenta" l'effetto facendo leggere tutti
  203.                 ; i 200 valori della tabella).
  204.     CMPA.L    (A4),A3        ; Fine della tabella?
  205.     BNE.S    NOTABENDY    ; Se non ancora, ok
  206.     MOVE.L    #tabby2,(A4)    ; Altrimenti ripunta da capo
  207. NOTABENDY:
  208.     RTS
  209.  
  210. ; Puntatore alla tabella usato per leggerne i valori
  211.  
  212. TABBY2POINTER:
  213.     dc.l    tabby2
  214.  
  215. *****************************************************************************
  216. ;    ROUTINE DEL LOGO SU GIU (fa puntare piu' in avanti o piu' indietro
  217. ;                 i bplpointers, niente di eccezionale
  218. *****************************************************************************
  219.  
  220. SuGiuFlag:
  221.     DC.W    0
  222.  
  223. SUGIU:
  224.     LEA    BPLPOINTERS,A1    ; prendi l'indirizzo attualmente puntato nei
  225.     move.w    2(a1),d0    ; bitplanes e mettilo in d0
  226.     swap    d0
  227.     move.w    6(a1),d0
  228.  
  229.     BTST.b    #1,SuGiuFlag        ; devo andare su o giu?
  230.     BEQ.S    GIUT
  231.  
  232. ; VADO SU
  233.  
  234. SUT:
  235.     MOVE.L    SUGIUTABP(PC),A0 ; tabella con multipli di 40 (del modulo)
  236.     SUBQ.L    #2,SUGIUTABP     ; prendo il valore "prima"
  237.     CMPA.L    #SUGIUTAB+4,A0
  238.     BNE.S    NOBSTART
  239.     BCHG.B    #1,SuGiuFlag        ; se ho finito, cambia direzione (vai in basso)
  240.     ADDQ.L    #2,SUGIUTABP    ; per bilanciare
  241. NOBSTART:
  242.     BRA.s    NOBEND
  243.  
  244. ; VADO GIU
  245.  
  246. GIUT:
  247.     MOVE.L    SUGIUTABP(PC),A0 ; tabella con multipli di 40
  248.     ADDQ.L    #2,SUGIUTABP     ; prendo il valore "dopo"
  249.     CMPA.L    #SUGIUTABEND-4,A0
  250.     BNE.S    NOBEND
  251.     BCHG.B    #1,SuGiuFlag        ; se ho finito, cambia direzione
  252. NOBEND:
  253.     moveq    #0,d1
  254.     MOVE.w    (A0),D1        ; valore da tabella in d1
  255.     BTST.b    #1,SuGiuFlag
  256.     BEQ.S    GIU
  257. SU:
  258.     add.l    d1,d0        ; se vado SU lo aggiungo
  259.     BRA.S    MOVLOG
  260. GIU:
  261.     sub.l    d1,d0        ; se vado GIU lo sottraggo
  262. MOVLOG:
  263.     LEA    BPLPOINTERS,A1    ; e ripunto al nuovo indirizzo
  264.     MOVEQ    #6-1,D1        ; num di bitplanes -1 (ham 6 bitplanes)
  265. APOINTB:
  266.     move.w    d0,6(a1)
  267.     swap    d0
  268.     move.w    d0,2(a1)
  269.     swap    d0
  270.     add.l    #176*40,d0    ; lunghrzza di un bitplane
  271.     addq.w    #8,a1
  272.     dbra    d1,APOINTB        ;Rifai D1 volte (D1=num of bitplanes)
  273. NOMOVE:
  274.     rts
  275.  
  276. SUGIUTABP:
  277.     dc.l    SuGiuTab
  278.  
  279. ; tabella col numero di bytes da saltare... naturalmente sono multipli di 40,
  280. ; ossia della lunghezza di una linea.
  281.  
  282. SuGiuTab:
  283.     dc.w    0*40,0*40,0*40,1*40,0*40,0*40,1*40,0*40,1*40
  284.     dc.w    0*40,0*40,1*40,0*40,1*40,0*40,1*40,1*40,0*40
  285.     dc.w    0*40,0*40,1*40,0*40,1*40,0*40,1*40,0*40,0*40
  286.     dc.w    0*40,1*40,1*40,0*40,1*40,0*40,1*40,1*40,1*40
  287.     dc.w    1*40,0*40,1*40,1*40,1*40,1*40,0*40
  288.     dc.w    1*40,0*40,1*40,0*40,1*40,0*40,0*40,1*40,0*40
  289.     dc.w    0*40,1*40,0*40,1*40,0*40,0*40,1*40,0*40,0*40
  290. SuGiuTabEnd:
  291.  
  292. *****************************************************************************
  293. ;    ROUTINE DEL LOGO DEST SINIST (usa il bplcon1, niente di speciale)
  294. *****************************************************************************
  295.  
  296. DestSinFlag:
  297.     DC.W    0
  298.  
  299. LefRig:
  300.     BTST.b    #1,DestSinFlag    ; devo andare a destra o a sinistra?
  301.     BEQ.S    ScrolDestra
  302. ScrolSinitra:
  303.     MOVE.L    LefRigTABP(PC),A0    ; tabella con valori per bplcon1
  304.     SUBQ.L    #2,LefRigTABP        ; vado a sinistra
  305.     CMPA.L    #LefRigTAB+4,A0        ; fine tabella?
  306.     BNE.S    NOBSTART2        ; se non ancora, continua
  307.     BCHG.B    #1,DestSinFlag        ; Altrimenti, cambia direzione
  308.     ADDQ.L    #2,LefRigTABP        ; per bilanciare
  309. NOBSTART2:
  310.     BRA.s    NOBEND2
  311.  
  312. ScrolDestra:
  313.     MOVE.L    LefRigTABP(PC),A0    ; tabella valori per bplcon1
  314.     ADDQ.L    #2,LefRigTABP        ; vado a destra
  315.     CMPA.L    #LefRigEND-4,A0        ; fine tabella?
  316.     BNE.S    NOBEND2            ; Se non ancora, continua
  317.     BCHG.B    #1,DestSinFlag        ; Altrimenti cambia direzione
  318. NOBEND2:
  319.     MOVE.w    (A0),CON1        ; metti il valore nel bplcon1 nella
  320. NOMOVE2:                ; Copperlist
  321.     rts
  322.  
  323. LefRigTABP:
  324.     dc.l    LefRigTab
  325.  
  326. ; Questi sono valori adatti al bplcon1 ($dff102) per scrollare a destra/sin.
  327.  
  328. LefRigTab:
  329.     dc.w    0,0,0,0,0,0,0,$11,$11,$11,$11,$11
  330.     dc.w    $22,$22,$22,$22,$22
  331.     dc.w    $33,$33,$33
  332.     dc.w    $44,$44
  333.     dc.w    $55,$55,$55
  334.     dc.w    $66,$66,$66,$66,$66
  335.     dc.w    $77,$77,$77,$77,$77,$77,$77
  336.     dc.w    $88,$88,$88,$88,$88,$88,$88,$88
  337.     dc.w    $99,$99,$99,$99,$99,$99
  338.     dc.w    $aa,$aa,$aa,$aa,$aa
  339.     dc.w    $bb,$bb,$bb,$bb
  340.     dc.w    $cc,$cc,$cc,$cc
  341.     dc.w    $dd,$dd,$dd,$dd,$dd
  342.     dc.w    $ee,$ee,$ee,$ee,$ee,$ee
  343.     dc.w    $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
  344. LefRigEnd:
  345.  
  346. ******************************************************************************
  347. ;        COPPERLIST:
  348. ******************************************************************************
  349.  
  350.     Section    MioCoppero,data_C    
  351.  
  352. COPPERLIST:
  353.     dc.w    $8e,DIWS    ; DiwStrt
  354.     dc.w    $90,DIWSt    ; DiwStop
  355.     dc.w    $92,DDFS    ; DdfStart
  356.     dc.w    $94,DDFSt    ; DdfStop
  357.     dc.w    $102,0        ; BplCon1
  358.     dc.w    $104,0        ; BplCon2
  359.     dc.w    $108,0        ; Bpl1Mod
  360.     dc.w    $10a,0        ; Bpl2Mod
  361.  
  362. BPLPOINTERS:
  363.     dc.w $e0,0,$e2,0        ;primo      bitplane
  364.     dc.w $e4,0,$e6,0        ;secondo    "
  365.     dc.w $e8,0,$ea,0        ;terzo      "
  366.     dc.w $ec,0,$ee,0        ;quarto     "
  367.     dc.w $f0,0,$f2,0        ;quinto     "
  368.     dc.w $f4,0,$f6,0        ;sesto      "
  369.  
  370.     dc.w    $180,0    ; Color0 nero
  371.  
  372.     dc.w    $100,BPLC0    ; BplCon0 - 320*256 HAM
  373.  
  374.     dc.w $180,$0000,$182,$134,$184,$531,$186,$443
  375.     dc.w $188,$0455,$18a,$664,$18c,$466,$18e,$973
  376.     dc.w $190,$0677,$192,$886,$194,$898,$196,$a96
  377.     dc.w $198,$0ca6,$19a,$9a9,$19c,$bb9,$19e,$dc9
  378.     dc.w $1a0,$0666
  379.  
  380.     dc.w    $102    ; bplcon1
  381. CON1:
  382.     dc.w    0
  383.  
  384. coppyeff1:
  385.     dcb.w    12*NumLinee
  386.  
  387.     dc.w    $9707,$FFFE    ; wait linea $97
  388.     dc.w    $100,$200    ; no bitplanes
  389.     dc.w    $180,$110    ; color0
  390.     dc.w    $9807,$FFFE    ; wait
  391.     dc.w    $180,$120    ; color0
  392.     dc.w    $9a07,$FFFE
  393.     dc.w    $180,$130
  394.     dc.w    $9b07,$FFFE
  395.     dc.w    $180,$240
  396.     dc.w    $9c07,$FFFE
  397.     dc.w    $180,$250
  398.     dc.w    $9d07,$FFFE
  399.     dc.w    $180,$370
  400.     dc.w    $9e07,$FFFE
  401.     dc.w    $180,$390
  402.     dc.w    $9f07,$FFFE
  403.     dc.w    $180,$4b0
  404.     dc.w    $a007,$FFFE
  405.     dc.w    $180,$5d0
  406.     dc.w    $a107,$FFFE
  407.     dc.w    $180,$4a0
  408.     dc.w    $a207,$FFFE
  409.     dc.w    $180,$380
  410.     dc.w    $a307,$FFFE
  411.     dc.w    $180,$360
  412.     dc.w    $a407,$FFFE
  413.     dc.w    $180,$240
  414.     dc.w    $a507,$FFFE
  415.     dc.w    $180,$120
  416.     dc.w    $a607,$FFFE
  417.     dc.w    $180,$110
  418.     DC.W    $A70F,$FFFE
  419.     DC.W    $180,$000
  420.  
  421.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  422.  
  423.  
  424.     SECTION    LOGO,CODE_C
  425.  
  426. LOGO:
  427.     incbin    "amiet.raw"    ; 6 bitplanes * 176 lines * 40 bytes (HAM)
  428.  
  429.     END
  430.  
  431. Questa e' una fusione di Lezione11l3a.s e Lezione11l3b.s, che porta al "noto"
  432. effetto del logo nella intro del disco 1.
  433. Come vedete e' abbastanza semplice, nonostante faccia pensare a chissa' quali
  434. routines.
  435. Da notare che la SuGiuTab deve essere composta di multipli di 40 come la
  436. tabella "tabby2": mentre tabby2 ha valori come 0, 1, -1 che poi sono
  437. moltiplicati per 40 da una routine, SuGiuTab ta i valori gia' moltiplicati
  438. per 40, nella forma 1*40, 2*40 eccetera. Potreste anche in quel caso mettere
  439. solo i valori non moltiplicati, e moltiplicarli per la lunghezza di una linea,
  440. ossia il modulo, tramite una routine. In questo modo potreste agilmente
  441. definire un EQU:
  442.  
  443. LunghLinea    EQU    40
  444.  
  445. Per cui se voleste ondeggiare, ad esempio, una figura in hires, basterebbe
  446. cambiare l'EQU in 80, e i valori nelle tabelle sarebbero opportunamente
  447. moltiplicati.
  448.  
  449.