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

  1.  
  2. ; Lezione7e.s    UNO SPRITE MOSSO SIA VERTICALMENTE CHE ORIZZONTALMENTE
  3. ;         USANDO DUE TABELLE DI VALORI (ossia di coordinate verticali
  4. ;        e orizzontali) PRESTABILITI.
  5. ;        Nella nota finale viene spiegato come farsi proprie tabelle.
  6.  
  7.  
  8.     SECTION    CiriCop,CODE
  9.  
  10. Inizio:
  11.     move.l    4.w,a6        ; Execbase
  12.     jsr    -$78(a6)    ; Disable
  13.     lea    GfxName(PC),a1    ; Nome lib
  14.     jsr    -$198(a6)    ; OpenLibrary
  15.     move.l    d0,GfxBase
  16.     move.l    d0,a6
  17.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  18.  
  19. ;    Puntiamo la PIC "vuota"
  20.  
  21.     MOVE.L    #BITPLANE,d0    ; dove puntare
  22.     LEA    BPLPOINTERS,A1    ; puntatori COP
  23.     move.w    d0,6(a1)
  24.     swap    d0
  25.     move.w    d0,2(a1)
  26.  
  27. ;    Puntiamo lo sprite
  28.  
  29.     MOVE.L    #MIOSPRITE,d0        ; indirizzo dello sprite in d0
  30.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  31.     move.w    d0,6(a1)
  32.     swap    d0
  33.     move.w    d0,2(a1)
  34.  
  35.     move.l    #COPPERLIST,$dff080    ; nostra COP
  36.     move.w    d0,$dff088        ; START COP
  37.     move.w    #0,$dff1fc        ; NO AGA!
  38.     move.w    #$c00,$dff106        ; NO AGA!
  39.  
  40. mouse:
  41.     cmpi.b    #$ff,$dff006    ; Linea 255?
  42.     bne.s    mouse
  43.  
  44.     bsr.s    MuoviSpriteX    ; Muovi lo sprite 0 orizzontalmente
  45.     bsr.w    MuoviSpriteY    ; Muovi lo sprite 0 verticalmente
  46.  
  47. Aspetta:
  48.     cmpi.b    #$ff,$dff006    ; linea 255?
  49.     beq.s    Aspetta
  50.  
  51.     btst    #6,$bfe001    ; mouse premuto?
  52.     bne.s    mouse
  53.  
  54.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  55.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  56.  
  57.     move.l    4.w,a6
  58.     jsr    -$7e(a6)    ; Enable
  59.     move.l    gfxbase(PC),a1
  60.     jsr    -$19e(a6)    ; Closelibrary
  61.     rts
  62.  
  63. ;    Dati
  64.  
  65. GfxName:
  66.     dc.b    "graphics.library",0,0
  67.  
  68. GfxBase:
  69.     dc.l    0
  70.  
  71. OldCop:
  72.     dc.l    0
  73.  
  74. ; In questo esempio sono state incluse le routine e le tabelle dei due esempi
  75. ; precedenti, dunque agiamo sia sulla x che sulla y dello sprite.
  76. ; Essendo le due tabelle X ed Y entrambe formate da 200 coordinate, si
  77. ; verifica sempre la stessa "accoppiata" di coordinate:
  78. ; valore 1 della tabella X + valore 1 della tabella Y
  79. ; valore 2 della tabella X + valore 2 della tabella Y
  80. ; valore 3 della tabella X + valore 3 della tabella Y
  81. ; ....
  82. ; Dunque il risultato e' che lo sprite ondeggia in diagonale, come abbiamo gia'
  83. ; visto mettendo insieme addq.b #1,HSTART e addq.b #1,VSTART/VSTOP.
  84.  
  85.  
  86. ; Questa routine sposta  lo sprite agendo sul suo byte HSTART, ossia
  87. ; il byte della sua posizione X, immettendoci delle coordinate gia' stabilite
  88. ; nella tabella TABX. (scatti di 2 pixel minimo e non 1 pixel)
  89.  
  90. MuoviSpriteX:
  91.     ADDQ.L    #1,TABXPOINT     ; Fai puntare al byte successivo
  92.     MOVE.L    TABXPOINT(PC),A0 ; indirizzo contenuto in long TABXPOINT
  93.                  ; copiato in a0
  94.     CMP.L    #FINETABX-1,A0  ; Siamo all'ultima longword della TAB?
  95.     BNE.S    NOBSTARTX    ; non ancora? allora continua
  96.     MOVE.L    #TABX-1,TABXPOINT ; Riparti a puntare dal primo byte-1
  97. NOBSTARTX:
  98.     MOVE.b    (A0),HSTART    ; copia il byte dalla tabella ad HSTART
  99.     rts
  100.  
  101. TABXPOINT:
  102.     dc.l    TABX-1        ; NOTA: i valori della tabella qua sono bytes,
  103.                 ; dunque lavoriamo con un ADDQ.L #1,TABXPOINT
  104.                 ; e non #2 come per quando sono word o con #4
  105.                 ; come quando sono longword.
  106.  
  107. ; Tabella con coordinate X dello sprite precalcolate.
  108. ; Da notare che la posizione X per far entrare lo sprite nella finestra video
  109. ; deve essere compresa tra $40 e $d8, infatti nella tabella ci sono byte non
  110. ; piu' grandi di $d8 e non piu' piccoli di $40.
  111.  
  112. TABX:
  113.     dc.b    $91,$93,$96,$98,$9A,$9C,$9F,$A1,$A3,$A5,$A7,$A9 ; 200 valori
  114.     dc.b    $AC,$AE,$B0,$B2,$B4,$B6,$B8,$B9,$BB,$BD,$BF,$C0
  115.     dc.b    $C2,$C4,$C5,$C7,$C8,$CA,$CB,$CC,$CD,$CF,$D0,$D1
  116.     dc.b    $D2,$D3,$D3,$D4,$D5,$D5,$D6,$D7,$D7,$D7,$D8,$D8
  117.     dc.b    $D8,$D8,$D8,$D8,$D8,$D8,$D7,$D7,$D7,$D6,$D5,$D5
  118.     dc.b    $D4,$D3,$D3,$D2,$D1,$D0,$CF,$CD,$CC,$CB,$CA,$C8
  119.     dc.b    $C7,$C5,$C4,$C2,$C0,$BF,$BD,$BB,$B9,$B8,$B6,$B4
  120.     dc.b    $B2,$B0,$AE,$AC,$A9,$A7,$A5,$A3,$A1,$9F,$9C,$9A
  121.     dc.b    $98,$96,$93,$91,$8F,$8D,$8A,$88,$86,$84,$81,$7F
  122.     dc.b    $7D,$7B,$79,$77,$74,$72,$70,$6E,$6C,$6A,$68,$67
  123.     dc.b    $65,$63,$61,$60,$5E,$5C,$5B,$59,$58,$56,$55,$54
  124.     dc.b    $53,$51,$50,$4F,$4E,$4D,$4D,$4C,$4B,$4B,$4A,$49
  125.     dc.b    $49,$49,$48,$48,$48,$48,$48,$48,$48,$48,$49,$49
  126.     dc.b    $49,$4A,$4B,$4B,$4C,$4D,$4D,$4E,$4F,$50,$51,$53
  127.     dc.b    $54,$55,$56,$58,$59,$5B,$5C,$5E,$60,$61,$63,$65
  128.     dc.b    $67,$68,$6A,$6C,$6E,$70,$72,$74,$77,$79,$7B,$7D
  129.     dc.b    $7F,$81,$84,$86,$88,$8A,$8D,$8F
  130. FINETABX:
  131.  
  132.  
  133.     even    ; pareggia l'indirizzo seguente
  134.  
  135.  
  136. ; Questa routine sposta in alto e in basso lo sprite agendo sui suoi byte
  137. ; VSTART e VSTOP, ossia i byte della sua posizione Y di inizio e fine,
  138. ; immettendoci delle coordinate gia' stabilite nella tabella TABY
  139.  
  140. MuoviSpriteY:
  141.     ADDQ.L    #1,TABYPOINT     ; Fai puntare al byte successivo
  142.     MOVE.L    TABYPOINT(PC),A0 ; indirizzo contenuto in long TABXPOINT
  143.                  ; copiato in a0
  144.     CMP.L    #FINETABY-1,A0  ; Siamo all'ultima longword della TAB?
  145.     BNE.S    NOBSTARTY    ; non ancora? allora continua
  146.     MOVE.L    #TABY-1,TABYPOINT ; Riparti a puntare dal primo byte (-1)
  147. NOBSTARTY:
  148.     moveq    #0,d0        ; Pulisci d0
  149.     MOVE.b    (A0),d0        ; copia il byte dalla tabella in d0
  150.     MOVE.b    d0,VSTART    ; copia il byte in VSTART
  151.     ADD.B    #13,D0        ; Aggiungi la lunghezza dello sprite per
  152.                 ; determinare la posizione finale (VSTOP)
  153.     move.b    d0,VSTOP    ; Muovi il valore giusto in VSTOP
  154.     rts
  155.  
  156. TABYPOINT:
  157.     dc.l    TABY-1        ; NOTA: i valori della tabella qua sono bytes,
  158.                 ; dunque lavoriamo con un ADDQ.L #1,TABYPOINT
  159.                 ; e non #2 come per quando sono word o con #4
  160.                 ; come quando sono longword.
  161.  
  162. ; Tabella con coordinate Y dello sprite precalcolate.
  163. ; Da notare che la posizione Y per far entrare lo sprite nella finestra video
  164. ; deve essere compresa tra $2c e $f2, infatti nella tabella ci sono byte non
  165. ; piu' grandi di $f2 e non piu' piccoli di $2c.
  166.  
  167. TABY:
  168.     dc.b    $8E,$91,$94,$97,$9A,$9D,$A0,$A3,$A6,$A9,$AC,$AF ; ondeggio
  169.     dc.b    $B2,$B4,$B7,$BA,$BD,$BF,$C2,$C5,$C7,$CA,$CC,$CE ; 200 valori
  170.     dc.b    $D1,$D3,$D5,$D7,$D9,$DB,$DD,$DF,$E0,$E2,$E3,$E5
  171.     dc.b    $E6,$E7,$E9,$EA,$EB,$EC,$EC,$ED,$EE,$EE,$EF,$EF
  172.     dc.b    $EF,$EF,$F0,$EF,$EF,$EF,$EF,$EE,$EE,$ED,$EC,$EC
  173.     dc.b    $EB,$EA,$E9,$E7,$E6,$E5,$E3,$E2,$E0,$DF,$DD,$DB
  174.     dc.b    $D9,$D7,$D5,$D3,$D1,$CE,$CC,$CA,$C7,$C5,$C2,$BF
  175.     dc.b    $BD,$BA,$B7,$B4,$B2,$AF,$AC,$A9,$A6,$A3,$A0,$9D
  176.     dc.b    $9A,$97,$94,$91,$8E,$8B,$88,$85,$82,$7F,$7C,$79
  177.     dc.b    $76,$73,$70,$6D,$6A,$68,$65,$62,$5F,$5D,$5A,$57
  178.     dc.b    $55,$52,$50,$4E,$4B,$49,$47,$45,$43,$41,$3F,$3D
  179.     dc.b    $3C,$3A,$39,$37,$36,$35,$33,$32,$31,$30,$30,$2F
  180.     dc.b    $2E,$2E,$2D,$2D,$2D,$2D,$2C,$2D,$2D,$2D,$2D,$2E
  181.     dc.b    $2E,$2F,$30,$30,$31,$32,$33,$35,$36,$37,$39,$3A
  182.     dc.b    $3C,$3D,$3F,$41,$43,$45,$47,$49,$4B,$4E,$50,$52
  183.     dc.b    $55,$57,$5A,$5D,$5F,$62,$65,$68,$6A,$6D,$70,$73
  184.     dc.b    $76,$79,$7C,$7F,$82,$85,$88,$8b
  185. FINETABY:
  186.  
  187.  
  188.     SECTION    GRAPHIC,DATA_C
  189.  
  190. COPPERLIST:
  191. SpritePointers:
  192.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  193.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  194.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  195.     dc.w    $13e,0
  196.  
  197.     dc.w    $8E,$2c81    ; DiwStrt
  198.     dc.w    $90,$2cc1    ; DiwStop
  199.     dc.w    $92,$38        ; DdfStart
  200.     dc.w    $94,$d0        ; DdfStop
  201.     dc.w    $102,0        ; BplCon1
  202.     dc.w    $104,0        ; BplCon2
  203.     dc.w    $108,0        ; Bpl1Mod
  204.     dc.w    $10a,0        ; Bpl2Mod
  205.  
  206.             ; 5432109876543210
  207.     dc.w    $100,%0001001000000000    ; bit 12 acceso!! 1 bitplane lowres
  208.  
  209. BPLPOINTERS:
  210.     dc.w $e0,0,$e2,0    ;primo     bitplane
  211.  
  212.     dc.w    $180,$000    ; color0    ; sfondo nero
  213.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  214.                         ; in questo caso e' vuoto,
  215.                         ; per cui non compare.
  216.  
  217.     dc.w    $1A2,$F00    ; color17, ossia COLOR1 dello sprite0 - ROSSO
  218.     dc.w    $1A4,$0F0    ; color18, ossia COLOR2 dello sprite0 - VERDE
  219.     dc.w    $1A6,$FF0    ; color19, ossia COLOR3 dello sprite0 - GIALLO
  220.  
  221.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  222.  
  223.  
  224. ; ************ Ecco lo sprite: OVVIAMENTE deve essere in CHIP RAM! ************
  225.  
  226. MIOSPRITE:        ; lunghezza 13 linee
  227. VSTART:
  228.     dc.b $50    ; Posizione verticale di inizio sprite (da $2c a $f2)
  229. HSTART:
  230.     dc.b $90    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  231. VSTOP:
  232.     dc.b $5d    ; $50+13=$5d    ; posizione verticale di fine sprite
  233.     dc.b $00
  234.  dc.w    %0000000000000000,%0000110000110000 ; Formato binario per modifiche
  235.  dc.w    %0000000000000000,%0000011001100000
  236.  dc.w    %0000000000000000,%0000001001000000
  237.  dc.w    %0000000110000000,%0011000110001100 ;BINARIO 00=COLORE 0 (TRASPARENTE)
  238.  dc.w    %0000011111100000,%0110011111100110 ;BINARIO 10=COLORE 1 (ROSSO)
  239.  dc.w    %0000011111100000,%1100100110010011 ;BINARIO 01=COLORE 2 (VERDE)
  240.  dc.w    %0000110110110000,%1111100110011111 ;BINARIO 11=COLORE 3 (GIALLO)
  241.  dc.w    %0000011111100000,%0000011111100000
  242.  dc.w    %0000011111100000,%0001111001111000
  243.  dc.w    %0000001111000000,%0011101111011100
  244.  dc.w    %0000000110000000,%0011000110001100
  245.  dc.w    %0000000000000000,%1111000000001111
  246.  dc.w    %0000000000000000,%1111000000001111
  247.  dc.w    0,0    ; 2 word azzerate definiscono la fine dello sprite.
  248.  
  249.  
  250.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  251.                     ; perche' per vedere gli sprite
  252.                     ; e' necessario che ci siano bitplanes
  253.                     ; abilitati
  254. BITPLANE:
  255.     ds.b    40*256        ; bitplane azzerato lowres
  256.  
  257.     end
  258.  
  259. Fino ad adesso abbiamo fatto andare lo sprite in orizzontale, in verticale, e
  260. in diagonale, ma mai gli abbiamo fatto fare curve. Ebbene basta modificare
  261. questo listato per fargli fare tutte le curve possibili, infatti possiamo
  262. variare le sue coordinate X ed Y tramite due tabelle. In questo listato sono
  263. riportate due tabelle di uguale lunghezza (200 valori) per cui ogni volta
  264. avvengono sempre le stesse "accoppiate" di coordinate X ed Y:
  265.  
  266.  valore 1 della tabella X + valore 1 della tabella Y
  267.  valore 2 della tabella X + valore 2 della tabella Y
  268.  valore 3 della tabella X + valore 3 della tabella Y
  269.  ....
  270.  
  271. Dunque il risultato e' sempre la stessa oscillazione in diagonale.
  272. Se pero' una delle due tabelle fosse piu' corta, questa ripartirebbe prima da
  273. capo dell'altra creando nuove oscillazioni, e ogni volta le due tabelle
  274. farebbero delle accoppiate XX ed YY diverse, ad esempio:
  275.  
  276.  valore 23 della tabella X + valore 56 della tabella Y
  277.  valore 24 della tabella X + valore 57 della tabella Y
  278.  valore 25 della tabella X + valore 58 della tabella Y
  279.  ....
  280.  
  281. Queste accoppiate si tradurrebbero in oscillazioni curvilinee dello sprite
  282.  
  283. Provate a sostituire la tabella corrente delle coordinate XX con questa:
  284. (Amiga+b+c+i per copiare), (amiga+b+x per cancellare un pezzo)
  285.  
  286.  
  287. TABX:
  288.     dc.b    $8A,$8D,$90,$93,$95,$98,$9B,$9E,$A1,$A4,$A7,$A9 ; 150 valori
  289.     dc.b    $AC,$AF,$B1,$B4,$B6,$B8,$BA,$BC,$BF,$C0,$C2,$C4
  290.     dc.b    $C6,$C7,$C8,$CA,$CB,$CC,$CD,$CE,$CE,$CF,$CF,$D0
  291.     dc.b    $D0,$D0,$D0,$D0,$CF,$CF,$CE,$CE,$CD,$CC,$CB,$CA
  292.     dc.b    $C8,$C7,$C6,$C4,$C2,$C0,$BF,$BC,$BA,$B8,$B6,$B4
  293.     dc.b    $B1,$AF,$AC,$A9,$A7,$A4,$A1,$9E,$9B,$98,$95,$93
  294.     dc.b    $90,$8D,$8A,$86,$83,$80,$7D,$7B,$78,$75,$72,$6F
  295.     dc.b    $6C,$69,$67,$64,$61,$5F,$5C,$5A,$58,$56,$54,$51
  296.     dc.b    $50,$4E,$4C,$4A,$49,$48,$46,$45,$44,$43,$42,$42
  297.     dc.b    $41,$41,$40,$40,$40,$40,$40,$41,$41,$42,$42,$43
  298.     dc.b    $44,$45,$46,$48,$49,$4A,$4C,$4E,$50,$51,$54,$56
  299.     dc.b    $58,$5A,$5C,$5F,$61,$64,$67,$69,$6C,$6F,$72,$75
  300.     dc.b    $78,$7B,$7D,$80,$83,$86
  301. FINETABX:
  302.  
  303.  
  304. Ora potete ammirare lo sprite ondeggiare per lo schermo realisticamente e con
  305. un movimento variabile, a causa della differenza di lunghezza delle due tabelle
  306.  
  307. Con due tabelle, una per la posizione XX ed una per la posizione YY, vanno
  308. definiti i vari movimenti curvilinei dei giochi e delle dimostrazioni grafiche,
  309. ad esempio il lancio di una bomba:
  310.  
  311.         .  .
  312.          .         .
  313.         .          .
  314.      o /          .
  315.     /||         
  316.      /\       BOOM!!
  317.  
  318.  
  319. La curva percorsa dalla bomba lanciata dal protagonista del nostro gioco e'
  320. stata simulata tramite il precalcolamento di essa in termini di XX ed YY.
  321. Dato che il personaggio al momento del lancio poteva trovarsi in posizioni
  322. diverse dello schermo, tutto spostato a destra o a sinistra, bastera'
  323. aggiungere la posizione del protagonista lanciatore alle coordinate della
  324. curva e la bomba partira' e cadra' nel posto giusto.
  325. Oppure i movimenti di una squadriglia di astronavi nemiche:
  326.  
  327.  
  328.                  @  @  @  @  @  @  @  @ <--
  329.               @      @
  330.             @        @
  331.         
  332.             @          @
  333.               @       @ 
  334.        <--  @  @  @  @  @  @
  335.  
  336.  
  337. Gli utilizzi delle coordinate nelle tabelle sono infiniti.
  338.  
  339. Vi starete chiedendo: ma le tabelle si fanno a mano calcolandosi ad occhio
  340. l'onda?? Ebbene NO, esiste un comando dell'ASMONE, il "CS" (oppure "IS"), che
  341. puo' bastare per fare le tabelle presenti in questo listato (infatti le ho
  342. fatte proprio con questo comando!). Oppure se serve qualche tabella "speciale"
  343. ci si puo' fare un programmino che la faccia.
  344.  
  345. Anticipiamo l'argomento "come farsi una tabella":
  346. Il comando CS significa "CREATE SINUS", che per chi conosce la trigonometria
  347. significa "TUTTO LI'?", mentre per chi non la conosce significa "COSA E'?".
  348. Dato che questo deve essere solo un accenno, spieghero' soltanto come dare i
  349. parametri al comando "CS" o "IS".
  350.  
  351. Il comando "CS" crea i valori in memoria dall'indirizzo o dalla label che viene
  352. specificata, ad esempio se e' gia' presente una tab di 200 bytes alla label
  353. TABX, se si crea all'indirizzo "TABX", dopo aver assemblato, un'altra tabella
  354. di 200 bytes, questa sara' "sovrapposta" a quella precedente in memoria, ed
  355. eseguendo il listato si vedra' l'effetto dell'ultima tabella creata.
  356. Ma assemblando nuovamente viene riassemblata la tabella precedente, in quanto
  357. non abbiamo cambiato il testo (dc.b $xx,$xx..).
  358. Per salvare la tabella allora si puo' creare sopra un'altra di uguale grandezza
  359. oppure si puo' fare un "buffer", ossia una zona di memoria dedicata alla
  360. creazione e al salvataggio su disco della tabella.
  361. Facciamo un esempio pratico: vogliamo fare una tabella particolare lunga 512
  362. bytes, e la vogliamo salvare su disco per poterla ricaricare col comando
  363. incbin cosi':
  364.  
  365. TABX:
  366.     incbin    "TABELLA1"
  367.  
  368. Per fare la TABELLA1 da salvare dobbiamo prima crearci uno spazio vuoto di 512
  369. byte dove crearla col comando "CS":
  370.  
  371. SPAZIO:
  372.     dcb.b    512,0    ; 512 byte azzerati dove sara' creata la tabella
  373. FINESPAZIO:
  374.  
  375. Una volta assemblato, creeremo la tabella definendo come destinazione "SPAZIO":
  376.  
  377.  DEST> SPAZIO
  378.  
  379. E naturalmente 512 valori da generare, di grandezza BYTE:
  380.  
  381.  AMOUNT> 512
  382.  SIZE (B/W/L)> B
  383.  
  384. A questo punto avremo la tabella generata nei 512 bytes che vanno da SPAZIO:
  385. a FINESPAZIO: , dunque dobbiamo salvare quel pezzo di memoria in un file.
  386. Per questo esisite un comando dell'ASMONE, il "WB" (ossia Write Binary, cioe'
  387. SCRIVI UN PEZZO DI MEMORIA). Per salvare la nostra tabella bastera' eseguire
  388. queste operazioni:
  389.  
  390. 1) Scrivere "WB" e definire il nome che si vuole dare al file, es "TABELLA1"
  391. 2) alla domanda BEG> (begin ossia da dove partire) scrivere SPAZIO
  392. 3) alla domanda END> (ossia FINE) scrivere FINESPAZIO
  393.  
  394. Otterremo in questo modo un file TABELLA1 lungo naturalmente 512 bytes che
  395. conterra' la tabella, ricaricabile con l'INCBIN.
  396.  
  397. Il comando WB puo' essere applicato per salvare qualsiasi pezzo di memoria!
  398. Potete provare a salvare uno sprite sprite e ricaricarlo con l'incbin.
  399.  
  400. L'altro sistema e' il comando "IS", ossia INSERT SINUS, inserisci il sinus
  401. nel testo. In questo caso la tabella viene creata direttamente nel listato in
  402. formato dc.b. Puo' essere comodo per piccole tabelle.
  403. Basta posizionarsi col cursore dove si vuole che venga scritta la tabella, ad
  404. esempio sotto la label "TABX:"; a questo punto di deve premere ESC per passare
  405. alla linea di comandi e fare la tabella col comando "IS" anziche' "CS", la
  406. procedura e i parametri da passare sono gli stessi.
  407. Premendo nuovamente ESC troveremo la tabella fatta di dc.b sotto TABX:.
  408.  
  409. ma vediamo come CREARE una SONTAB usando il comando CS o IS dell'ASMONE:
  410.  
  411.  
  412.  DEST> indirizzo o label di destinazione, esempio: DEST>tabx
  413.  BEG> angolo di inizio (0-360) (si possono dare anche valori superiori a 360)
  414.  END> angolo di fine (0-360)
  415.  AMOUNT> numero di valori da generare (esempio: 200 come in questo listato)
  416.  AMPLITUDE> ampiezza, ossia valore piu' alto da raggiungere
  417.  YOFFSET> offset (numero aggiunto a tutti i valori per spostare in "alto")
  418.  SIZE (B/W/L)> dimensione dei valori (byte,word,long)
  419.  MULTIPLIER> "moltiplicatore" (moltiplica l'ampiezza)
  420.  HALF CORRECTION>Y/N        \ questi si occupano di "lisciare" l'onda
  421.  ROUND CORRECTION>Y/N        / per "correggere" eventuali sbalzi.
  422.  
  423.  
  424. Chi sa cosa sono il SENO ed il COSENO capira' al volo come fare, per chi non
  425. lo sa posso dire che con BEG> ed END> si definisce l'angolo inizio e l'angolo
  426. fine dell'onda, ossia la forma dell'onda, se questa comincera' calando e poi
  427. risalendo, oppure se comincera' salendo e poi ricalando. Qua di seguito ci
  428. sono degli esempi con il disegno della curva a fianco.
  429.  
  430. - Con AMOUNT> si decide quanti valori debba avere la tabella.
  431. - Con AMPLITUDE si definisce l'ampiezza dell'onda, ossia il valore massimo che
  432.   raggiungera' in alto, o in negativo, se e' presente la parte di curva
  433.   negativa.
  434. - Con YOFFSET si decide di quanto "alzare" l'intera curva, ossia quanto si deve
  435.   aggiungere ad ogni valore della tabella. Se per esempio una tabella fosse
  436.   composta da 0,1,2,3,4,5,4,3,2,1,0 con un YOFFSET di 0, mettendo un YOFFSET di
  437.   10 otterremmo 10,11,12,13,14,15,14,13,12,11,10. Nel caso delle posizioni
  438.   dello sprite, sappiamo che la X parte da $40 ed arriva a $d8, dunque
  439.   l'YOFFSET sara' di $40, per traformare gli eventuali $00 in $40, gli $01 in
  440.   $41 eccetera.
  441. - Con "SIZE" definiamo se i valori della tabella saranno byte, word o longword.
  442.   Nel caso delle coordinate dello sprite sono BYTE.
  443. - Il MULTIPLIER> e' un moltiplicatore dell'ampiezza, se non si vuole
  444.   moltiplicare basta definirlo come 1.
  445.  
  446.  
  447. Ora rimane da chiarire come definire la "forma dell'onda", ossia la cosa piu'
  448. importante, e per questo possiamo usare solo BEG> ed END> che si riferiscono
  449. all'angolo inizio e all'angolo di fine di tale curva dal punto di vista
  450. trigonometrico. Per chi non conosce la trigonometria consiglio di studiarla
  451. un poco, anche perche' e' importante per le routines tridimensionali.
  452. Brevemente posso sintetizzare cosi': immaginatevi una circonferenza con un
  453. centro O e raggio come vi pare (per motivi tecnici il cerchio non e' tondo..)
  454. inserito negli assi cartesiani X ed Y, per cui il centro O si trova alla
  455. posizione 0,0: (ridisegnate su carta questi passaggi)
  456.  
  457.  
  458.                |
  459.                | y
  460.                |
  461.               _L_
  462.              / | \    asse x
  463.         --------|--o--|---------»
  464.              \_L_/
  465.                |
  466.                |
  467.  
  468. Supponiamo ora che sia per un momento un orologio ad una sola lancetta che
  469. vada all'indietro (che esempio contorto!) partendo da questa posizione:
  470.  
  471.  
  472.                   90 gradi
  473.                 _____
  474.                /     \
  475.               /      \
  476.              /       \
  477.         180 gradi    (     O---» ) 0 gradi
  478.              \       /
  479.               \      /
  480.                \_____/
  481.  
  482.              270 gradi
  483.  
  484. (fate finta che sia un cerchio!!!) In pratica segna le 3. Al posto delle ore
  485. qua abbiamo i gradi formati dalla lancetta rispetto all'asse X, infatti quando
  486. segna le 12 e' a 90 gradi rispetto all'asse X:
  487.  
  488.                   90 gradi
  489.                 _____
  490.                /  ^  \
  491.               /   |   \
  492.              /    |    \
  493.         180 gradi    (     O     ) 0 gradi
  494.              \       /
  495.               \      /
  496.                \_____/
  497.  
  498.              270 gradi
  499.  
  500.  
  501. Allo stesso modo, questi sono 45 gradi:
  502.  
  503.                   90 gradi
  504.                 _____
  505.                /     \
  506.               /     / \
  507.              /     /   \
  508.         180 gradi    (     O     ) 0 gradi (o anche 360, il giro completo)
  509.              \       /
  510.               \      /
  511.                \_____/
  512.  
  513.              270 gradi
  514.  
  515. Ci siamo con questo balordo orologio che va al contrario e che ha i gradi al
  516. posto delle ore?? Ora veniamo al nesso con i BEG> ed END> del comando "CS".
  517. Disponendo di questo orologio, si puo' fare lo studio dell'andamento della
  518. funzione SENO (e COSENO, perche' no). Immaginiamo di far fare un giro completo
  519. alla lancetta, partendo da 0 gradi a 360, ossia la stessa posizione dopo un
  520. giro completo: se registriamo in un grafico accanto all'orologio i movimenti
  521. della punta della lancetta rispetto all'asse Y noteremo che parte da zero,
  522. poi sale fino alla massima altezza raggiunta ai 90 gradi, dopodiche' scende
  523. nuovamente ritornando a zero una volta giunto a 180 gradi, e continua a
  524. scendere sotto lo zero fino al minimo dei 270 gradi, per poi risalire fino
  525. allo zero iniziale dei 360 gradi (stessa posizione della partenza):
  526.  
  527.  
  528.           90 gradi
  529.         _____
  530.        /     \
  531.       /      \
  532.      /       \
  533.  180 g.    (     O---» ) 0 gradi    *-----------------------------------
  534.      \       /        0    90    180    270    360 (gradi)
  535.       \      /
  536.        \_____/
  537.      270 gradi
  538.  
  539.  
  540.           90 gradi
  541.         _____
  542.        /     \     45 gradi
  543.       /    / \- - - - - - - - *
  544.      /     /   \         *
  545.  180 g.    (     O     ) 0 gradi    *-------------------------------------
  546.      \       /        0    90    180    270    360 (gradi)
  547.       \      /
  548.        \_____/
  549.      270 gradi
  550.  
  551.  
  552.           90 gradi
  553.         _____ _ _ _ _ _ _ _ _ _ _ _ *
  554.        /  ^  \              * 
  555.       /   |   \            *
  556.      /    |    \         *
  557.  180 g.    (     O     ) 0 gradi    *-----------------------------------
  558.      \       /        0    90    180    270    360 (gradi)
  559.       \      /
  560.        \_____/
  561.      270 gradi
  562.  
  563.  
  564.           90 gradi
  565.         _____                * *
  566.        /     \     135 gradi    *     *
  567.       / \     \- - - - - - - - * - - - - *
  568.      /   \     \         *
  569.  180 g.    (     O     ) 0 gradi    *-----------------------------------
  570.      \       /        0    90    180    270    360 (gradi)
  571.       \      /
  572.        \_____/
  573.      270 gradi
  574.  
  575.  
  576.           90 gradi
  577.         _____                * *
  578.        /     \              *     *
  579.       /      \           *         *
  580.      /       \         *           *
  581.  180 g.    ( <---O     ) 0 gradi    *---------------*---------------------
  582.      \       /        0    90    180    270    360 (gradi)
  583.       \      /
  584.        \_____/
  585.      270 gradi
  586.  
  587.  
  588.           90 gradi
  589.         _____                * *
  590.        /     \              *     *
  591.       /      \           *         *
  592.      /       \         *           *
  593.  180 g.    (     O     ) 0 gradi    *---------------*---------------------
  594.      \   /       /        0    90    180    270    360 (gradi)
  595.       \ /      /- - - - - - - - - - - - - - - - -*
  596.        \_____/        225 gradi
  597.      270 gradi
  598.  
  599.  
  600.           90 gradi
  601.         _____                * *
  602.        /     \              *     *
  603.       /      \           *         *
  604.      /       \         *           *
  605.  180 g.    (     O     ) 0 gradi    *---------------*---------------------
  606.      \    |       /        0    90    180    270    360 (gradi)
  607.       \   |      /                   *
  608.        \__L__/                     *
  609.      270 gradi - - - - - - - - - - - - - - - - - - *
  610.  
  611.  
  612.           90 gradi
  613.         _____                * *
  614.        /     \              *     *
  615.       /      \           *         *
  616.      /       \         *           *
  617.  180 g.    (     O     ) 0 gradi    *---------------*---------------------
  618.      \     \   /        0    90    180    270    360 (gradi)
  619.       \    \ /- - - - - - - - - - - - - - - - * - - - - *
  620.        \_____/        315 gradi         *       *
  621.      270 gradi                       * *
  622.  
  623.  
  624.           90 gradi
  625.         _____                * *
  626.        /     \              *     *
  627.       /      \           *         *
  628.      /       \         *           *
  629.  180 g.    (     O---> ) 0 gradi    *---------------*----------------*----
  630.      \        /        0    90    180    270    *360 (gradi)
  631.       \      /                   *         *
  632.        \_____/        360 gradi         *       *
  633.      270 gradi                       * *
  634.  
  635.  
  636. Spero di essere stato abbastanza chiaro per chi e' a digiuno di matematica:
  637. per fare una curva che sale e scende basta dare come angolo inizio 0 e come
  638. angolo di fine 180!!! Per fare una curva che scende e risale basta dare
  639. come angolo inizio BEG> 180 e come angolo fine END> 360, cosi' per tutte le
  640. altre curve. Cambiando AMPLITUDE, YOFFSET e MULTIPLIER farete curve piu'
  641. lunghe e strette o piu' o meno lunghe. Si possono usare anche valori superiori
  642. a 360 per utilizzare la curva del secondo "giro d'orologio", dato che la
  643. funzione e' continua: /\/\/\/\/\/\/\/\/\/\/\.....
  644.  
  645. Facciamo degli esempi:  (sotto il disegno viene dato un accenno sulla tabella
  646.             (effettiva: 0,1,2,3...999,1000.. ossia il suo contenuto
  647.  
  648.   UN ESEMPIO DI SINUS:
  649.                +     __
  650.   DEST>cosintabx       _ _ _/_ \_ _ _ _ _ _  = 512 words:
  651.   BEG>0                    \__/
  652.   END>360           -    0      360
  653.   AMOUNT>512    0,1,2,3...999,1000,999..3,2,0,-1,-2,-3..-1000,-999,...-2,-1,0
  654.   AMPLITUDE>1000
  655.   YOFFSET>0
  656.   SIZE (B/W/L)>W
  657.   MULTIPLIER>1
  658.  
  659.  
  660.   UN ESEMPIO DI COSINUS:
  661.                  +      _     _
  662.   DEST>cosintabx        _ _ _ _\_ _ /_ _ _ _  = 512 words:
  663.   BEG>90                \__/
  664.   END>360+90           -    90      450
  665.   AMOUNT>512    1000,999..3,2,0,-1,-2,-3..-1000,-999,...-2,-1,0,1,2...999,1000
  666.   AMPLITUDE>1000
  667.   YOFFSET>0
  668.   SIZE (B/W/L)>W
  669.   MULTIPLIER>1
  670.  
  671.  
  672. UN ALTRO ESEMPIO:
  673.                 +     ___
  674.   DEST>cosintabx       _ _ _/_ _\_ _ _ _  = 800 words:
  675.   BEG>0                    
  676.   END>180           -    0  180
  677.   AMOUNT>800        0,1,2,3,4,5...999,1000,999..3,2,1,0 (800 valori)
  678.   AMPLITUDE>1000
  679.   YOFFSET>0
  680.   SIZE (B/W/L)>W
  681.   MULTIPLIER>1
  682.  
  683.  
  684. UN ALTRO ESEMPIO:          _
  685.                 +     / \
  686.   DEST>cosintabx       _ _ _/_ _\_ _ _ _  = 800 words:
  687.   BEG>0                    
  688.   END>180           -    0  180
  689.   AMOUNT>800        0,1,2,3,4,5...1999,2000,1999..3,2,1,0 (800 valori)
  690.   AMPLITUDE>1000
  691.   YOFFSET>0
  692.   SIZE (B/W/L)>W
  693.   MULTIPLIER>2    <--
  694.  
  695.  
  696. UN ALTRO ESEMPIO:         _    _
  697.                 +      \    /
  698.   DEST>cosintabx        _ _ _ _\__/_ _ _ _  = 512 words:
  699.   BEG>90               
  700.   END>360+90           -    90      450
  701.   AMOUNT>512         2000,1999..3,2,0,1,2...1999,2000
  702.   AMPLITUDE>1000
  703.   YOFFSET>1000
  704.   SIZE (B/W/L)>W
  705.   MULTIPLIER>1
  706.  
  707.  
  708.  ULTIMO ESEMPIO:         _    _
  709.                 +      \    /
  710.   DEST>cosintabx        _ _ _ _\__/_ _ _ _  = 360 words:
  711.   BEG>90               
  712.   END>360+90           -    90      450
  713.   AMOUNT>360         304,303..3,2,0,1,2...303,304
  714.   AMPLITUDE>152
  715.   YOFFSET>152
  716.   SIZE (B/W/L)>W
  717.   MULTIPLIER>1
  718.   HALF CORRECTION>Y
  719.   ROUND CORRECTION>N
  720.  
  721. Ecco a voi come rifarsi le tabelle delle coordinate XX ed YY usate negli esempi
  722. precedenti sugli sprite: (parametri per il CS e tabella finale)
  723.  
  724. Per le coordinate X, che devono andare da $40 a $d8 al massimo
  725.  
  726. ; DEST> tabx
  727. ; BEG> 0         ___ $d0
  728. ; END> 180        /   \40
  729. ; AMOUNT> 200
  730. ; AMPLITUDE> $d0-$40    ; $40,$41,$42...$ce,$cf,d0,$cf,$ce...$43,$41....
  731. ; YOFFSET> $40     ; lo zero va trasformato in $40
  732. ; SIZE (B/W/L)> b
  733. ; MULTIPLIER> 1
  734.  
  735.     dc.b    $41,$43,$46,$48,$4A,$4C,$4F,$51,$53,$55,$58,$5A
  736.     dc.b    $5C,$5E,$61,$63,$65,$67,$69,$6B,$6E,$70,$72,$74
  737.     dc.b    $76,$78,$7A,$7C,$7E,$80,$82,$84,$86,$88,$8A,$8C
  738.     dc.b    $8E,$90,$92,$94,$96,$97,$99,$9B,$9D,$9E,$A0,$A2
  739.     dc.b    $A3,$A5,$A7,$A8,$AA,$AB,$AD,$AE,$B0,$B1,$B2,$B4
  740.     dc.b    $B5,$B6,$B8,$B9,$BA,$BB,$BD,$BE,$BF,$C0,$C1,$C2
  741.     dc.b    $C3,$C4,$C5,$C5,$C6,$C7,$C8,$C9,$C9,$CA,$CB,$CB
  742.     dc.b    $CC,$CC,$CD,$CD,$CE,$CE,$CE,$CF,$CF,$CF,$CF,$D0
  743.     dc.b    $D0,$D0,$D0,$D0,$D0,$D0,$D0,$D0,$D0,$CF,$CF,$CF
  744.     dc.b    $CF,$CE,$CE,$CE,$CD,$CD,$CC,$CC,$CB,$CB,$CA,$C9
  745.     dc.b    $C9,$C8,$C7,$C6,$C5,$C5,$C4,$C3,$C2,$C1,$C0,$BF
  746.     dc.b    $BE,$BD,$BB,$BA,$B9,$B8,$B6,$B5,$B4,$B2,$B1,$B0
  747.     dc.b    $AE,$AD,$AB,$AA,$A8,$A7,$A5,$A3,$A2,$A0,$9E,$9D
  748.     dc.b    $9B,$99,$97,$96,$94,$92,$90,$8E,$8C,$8A,$88,$86
  749.     dc.b    $84,$82,$80,$7E,$7C,$7A,$78,$76,$74,$72,$70,$6E
  750.     dc.b    $6B,$69,$67,$65,$63,$61,$5E,$5C,$5A,$58,$55,$53
  751.     dc.b    $51,$4F,$4C,$4A,$48,$46,$43,$41
  752.  
  753. --    --    --    --    --    --    --    --    --    --
  754.  
  755. ; DEST> tabx            $d0
  756. ; BEG> 180        \____/  $40
  757. ; END> 360
  758. ; AMOUNT> 200
  759. ; AMPLITUDE> $d0-$40    ; $cf,$cd,$ca...$42,$41,$40,$41,$42...$ca,$cd,$cf
  760. ; YOFFSET> $d0     ; curva sotto zero! allora bisogna aggiungere $d0
  761. ; SIZE (B/W/L)> b
  762. ; MULTIPLIER> 1
  763.  
  764.     dc.b    $CF,$CD,$CA,$C8,$C6,$C4,$C1,$BF,$BD,$BB,$B8,$B6
  765.     dc.b    $B4,$B2,$AF,$AD,$AB,$A9,$A7,$A5,$A2,$A0,$9E,$9C
  766.     dc.b    $9A,$98,$96,$94,$92,$90,$8E,$8C,$8A,$88,$86,$84
  767.     dc.b    $82,$80,$7E,$7C,$7A,$79,$77,$75,$73,$72,$70,$6E
  768.     dc.b    $6D,$6B,$69,$68,$66,$65,$63,$62,$60,$5F,$5E,$5C
  769.     dc.b    $5B,$5A,$58,$57,$56,$55,$53,$52,$51,$50,$4F,$4E
  770.     dc.b    $4D,$4C,$4B,$4B,$4A,$49,$48,$47,$47,$46,$45,$45
  771.     dc.b    $44,$44,$43,$43,$42,$42,$42,$41,$41,$41,$41,$40
  772.     dc.b    $40,$40,$40,$40,$40,$40,$40,$40,$40,$41,$41,$41
  773.     dc.b    $41,$42,$42,$42,$43,$43,$44,$44,$45,$45,$46,$47
  774.     dc.b    $47,$48,$49,$4A,$4B,$4B,$4C,$4D,$4E,$4F,$50,$51
  775.     dc.b    $52,$53,$55,$56,$57,$58,$5A,$5B,$5C,$5E,$5F,$60
  776.     dc.b    $62,$63,$65,$66,$68,$69,$6B,$6D,$6E,$70,$72,$73
  777.     dc.b    $75,$77,$79,$7A,$7C,$7E,$80,$82,$84,$86,$88,$8A
  778.     dc.b    $8C,$8E,$90,$92,$94,$96,$98,$9A,$9C,$9E,$A0,$A2
  779.     dc.b    $A5,$A7,$A9,$AB,$AD,$AF,$B2,$B4,$B6,$B8,$BB,$BD
  780.     dc.b    $BF,$C1,$C4,$C6,$C8,$CA,$CD,$CF
  781.  
  782. --    --    --    --    --    --    --    --    --    --
  783.  
  784. ;                        ___$d8
  785. ; DEST> tabx                       /   \ $d0-$40 ($90)
  786. ; BEG> 0              \___/     $48
  787. ; END> 360
  788. ; AMOUNT> 200
  789. ; AMPLITUDE> ($d0-$40)/2 ; ampiezza sia sopra zero che sotto zero, allora
  790.              ; bisogna che faccia meta' sopra zero e meta' sotto,
  791.              ; ossia dividiamo per 2 l'AMPIEZZA
  792. ; YOFFSET> $90        ; e spostiamo tutto sopra per trasformare -72 in $48
  793. ; SIZE (B/W/L)> b
  794. ; MULTIPLIER> 1
  795.  
  796.     dc.b    $91,$93,$96,$98,$9A,$9C,$9F,$A1,$A3,$A5,$A7,$A9
  797.     dc.b    $AC,$AE,$B0,$B2,$B4,$B6,$B8,$B9,$BB,$BD,$BF,$C0
  798.     dc.b    $C2,$C4,$C5,$C7,$C8,$CA,$CB,$CC,$CD,$CF,$D0,$D1
  799.     dc.b    $D2,$D3,$D3,$D4,$D5,$D5,$D6,$D7,$D7,$D7,$D8,$D8
  800.     dc.b    $D8,$D8,$D8,$D8,$D8,$D8,$D7,$D7,$D7,$D6,$D5,$D5
  801.     dc.b    $D4,$D3,$D3,$D2,$D1,$D0,$CF,$CD,$CC,$CB,$CA,$C8
  802.     dc.b    $C7,$C5,$C4,$C2,$C0,$BF,$BD,$BB,$B9,$B8,$B6,$B4
  803.     dc.b    $B2,$B0,$AE,$AC,$A9,$A7,$A5,$A3,$A1,$9F,$9C,$9A
  804.     dc.b    $98,$96,$93,$91,$8F,$8D,$8A,$88,$86,$84,$81,$7F
  805.     dc.b    $7D,$7B,$79,$77,$74,$72,$70,$6E,$6C,$6A,$68,$67
  806.     dc.b    $65,$63,$61,$60,$5E,$5C,$5B,$59,$58,$56,$55,$54
  807.     dc.b    $53,$51,$50,$4F,$4E,$4D,$4D,$4C,$4B,$4B,$4A,$49
  808.     dc.b    $49,$49,$48,$48,$48,$48,$48,$48,$48,$48,$49,$49
  809.     dc.b    $49,$4A,$4B,$4B,$4C,$4D,$4D,$4E,$4F,$50,$51,$53
  810.     dc.b    $54,$55,$56,$58,$59,$5B,$5C,$5E,$60,$61,$63,$65
  811.     dc.b    $67,$68,$6A,$6C,$6E,$70,$72,$74,$77,$79,$7B,$7D
  812.     dc.b    $7F,$81,$84,$86,$88,$8A,$8D,$8F
  813.  
  814. --    --    --    --    --    --    --    --    --    --
  815.  
  816.  TABELLA DELLE Y:
  817. ; Da notare che la posizione Y per far entrare lo sprite nella finestra video
  818. ; deve essere compresa tra $2c e $f2, infatti nella tabella ci sono byte non
  819. ; piu' grandi di $f2 e non piu' piccoli di $2c.
  820.  
  821. ; DEST> taby            $f0 (d0)
  822. ; BEG> 180        \____/  $2c (40)
  823. ; END> 360
  824. ; AMOUNT> 200
  825. ; AMPLITUDE> $f0-$2c    ; $ef,$ed,$ea...$2c...$ea,$ed,$ef
  826. ; YOFFSET> $f0
  827. ; SIZE (B/W/L)> b
  828. ; MULTIPLIER> 1
  829.  
  830.     dc.b    $EE,$EB,$E8,$E5,$E2,$DF,$DC,$D9,$D6,$D3,$D0,$CD ; salto in
  831.     dc.b    $CA,$C7,$C4,$C1,$BE,$BB,$B8,$B5,$B2,$AF,$AC,$A9 ; alto da
  832.     dc.b    $A6,$A4,$A1,$9E,$9B,$98,$96,$93,$90,$8E,$8B,$88 ; record!
  833.     dc.b    $86,$83,$81,$7E,$7C,$79,$77,$74,$72,$70,$6D,$6B
  834.     dc.b    $69,$66,$64,$62,$60,$5E,$5C,$5A,$58,$56,$54,$52
  835.     dc.b    $51,$4F,$4D,$4B,$4A,$48,$47,$45,$44,$42,$41,$3F
  836.     dc.b    $3E,$3D,$3C,$3A,$39,$38,$37,$36,$35,$34,$33,$33
  837.     dc.b    $32,$31,$30,$30,$2F,$2F,$2E,$2E,$2D,$2D,$2D,$2C
  838.     dc.b    $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C,$2D,$2D,$2D
  839.     dc.b    $2E,$2E,$2F,$2F,$30,$30,$31,$32,$33,$33,$34,$35
  840.     dc.b    $36,$37,$38,$39,$3A,$3C,$3D,$3E,$3F,$41,$42,$44
  841.     dc.b    $45,$47,$48,$4A,$4B,$4D,$4F,$51,$52,$54,$56,$58
  842.     dc.b    $5A,$5C,$5E,$60,$62,$64,$66,$69,$6B,$6D,$70,$72
  843.     dc.b    $74,$77,$79,$7C,$7E,$81,$83,$86,$88,$8B,$8E,$90
  844.     dc.b    $93,$96,$98,$9B,$9E,$A1,$A4,$A6,$A9,$AC,$AF,$B2
  845.     dc.b    $B5,$B8,$BB,$BE,$C1,$C4,$C7,$CA,$CD,$D0,$D3,$D6
  846.     dc.b    $D9,$DC,$DF,$E2,$E5,$E8,$EB,$EE
  847.  
  848.  
  849. --    --    --    --    --    --    --    --    --    --
  850.  
  851.  
  852. ;                        ___ ($f0) $d8
  853. ; DEST> taby                       /   \ ($f0-$2c) $d0-$40 ($90)
  854. ; BEG> 0              \___/      ($2c) $48
  855. ; END> 360
  856. ; AMOUNT> 200
  857. ; AMPLITUDE> ($f0-$2c)/2 ;
  858. ; YOFFSET> $8e        ; sarebbe $f0-(($f0-$2c)/2)
  859. ; SIZE (B/W/L)> b
  860. ; MULTIPLIER> 1
  861.  
  862.     dc.b    $8E,$91,$94,$97,$9A,$9D,$A0,$A3,$A6,$A9,$AC,$AF
  863.     dc.b    $B2,$B4,$B7,$BA,$BD,$BF,$C2,$C5,$C7,$CA,$CC,$CE
  864.     dc.b    $D1,$D3,$D5,$D7,$D9,$DB,$DD,$DF,$E0,$E2,$E3,$E5
  865.     dc.b    $E6,$E7,$E9,$EA,$EB,$EC,$EC,$ED,$EE,$EE,$EF,$EF
  866.     dc.b    $EF,$EF,$F0,$EF,$EF,$EF,$EF,$EE,$EE,$ED,$EC,$EC
  867.     dc.b    $EB,$EA,$E9,$E7,$E6,$E5,$E3,$E2,$E0,$DF,$DD,$DB
  868.     dc.b    $D9,$D7,$D5,$D3,$D1,$CE,$CC,$CA,$C7,$C5,$C2,$BF
  869.     dc.b    $BD,$BA,$B7,$B4,$B2,$AF,$AC,$A9,$A6,$A3,$A0,$9D
  870.     dc.b    $9A,$97,$94,$91,$8E,$8B,$88,$85,$82,$7F,$7C,$79
  871.     dc.b    $76,$73,$70,$6D,$6A,$68,$65,$62,$5F,$5D,$5A,$57
  872.     dc.b    $55,$52,$50,$4E,$4B,$49,$47,$45,$43,$41,$3F,$3D
  873.     dc.b    $3C,$3A,$39,$37,$36,$35,$33,$32,$31,$30,$30,$2F
  874.     dc.b    $2E,$2E,$2D,$2D,$2D,$2D,$2C,$2D,$2D,$2D,$2D,$2E
  875.     dc.b    $2E,$2F,$30,$30,$31,$32,$33,$35,$36,$37,$39,$3A
  876.     dc.b    $3C,$3D,$3F,$41,$43,$45,$47,$49,$4B,$4E,$50,$52
  877.     dc.b    $55,$57,$5A,$5D,$5F,$62,$65,$68,$6A,$6D,$70,$73
  878.     dc.b    $76,$79,$7C,$7F,$82,$85,$88,$8B,$8d
  879.  
  880. --    --    --    --    --    --    --    --    --    --
  881.  
  882. Dato che avete tutte queste tabelle XX ed YY pronte provate a sostituirle a
  883. quelle del listato, per creare molti effetti diversi, e provate a farne altre
  884. con 100, 120, 300 valori anziche' 200 ( AMOUNT> 100), per creare infinite
  885. traiettorie dello sprite.
  886.  
  887.