home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / assembler-kurs / listings3 / listing7p.s < prev    next >
Text File  |  1977-12-31  |  11KB  |  347 lines

  1.  
  2. ; Listing7p.s - Beispiel einer Anwendung der Universalroutine:
  3. ;        4 SPRITE ZU 4 FARBEN SIND NEBENEINANDER UND ERZEUGEN EIN
  4. ;        64 PIXEL BREITES BILD.
  5. ;        ES WERDEN ZWEI TABELLEN MIT VORAUSBERECHNETEN WERTEN VERWENDET
  6.  
  7.     SECTION CipundCop,CODE
  8.  
  9. Anfang:
  10.     move.l    4.w,a6        ; Execbase
  11.     jsr    -$78(a6)    ; Disable
  12.     lea    GfxName(PC),a1    ; Libname
  13.     jsr    -$198(a6)    ; OpenLibrary
  14.     move.l    d0,GfxBase
  15.     move.l    d0,a6
  16.     move.l    $26(a6),OldCop    ; speichern die alte COP
  17.  
  18. ;    Pointen auf das "leere" PIC
  19.  
  20.     MOVE.L    #BITPLANE,d0    ; wohin pointen
  21.     LEA    BPLPOINTERS,A1    ; COP-Pointer
  22.     move.w    d0,6(a1)
  23.     swap    d0
  24.     move.w    d0,2(a1)
  25.  
  26. ;    Pointen auf den Sprite
  27.  
  28.     MOVE.L    #MEINSPRITE,d0        ; Adresse des Sprite in d0
  29.     LEA    SpritePointers,a1    ; Pointer in der Copperlist
  30.     move.w    d0,6(a1)
  31.     swap    d0
  32.     move.w    d0,2(a1)
  33.  
  34.     
  35.     MOVE.L    #MEINSPRITE1,d0     ; Adresse des Sprite in d0
  36.     addq.w    #8,a1
  37.     move.w    d0,6(a1)
  38.     swap    d0
  39.     move.w    d0,2(a1)
  40.  
  41.     MOVE.L    #MEINSPRITE2,d0     ; Adresse des Sprite in d0
  42.     addq.w    #8,a1
  43.     move.w    d0,6(a1)
  44.     swap    d0
  45.     move.w    d0,2(a1)
  46.  
  47.  
  48.     MOVE.L    #MEINSPRITE3,d0     ; Adresse des Sprite in d0
  49.     addq.w    #8,a1
  50.     move.w    d0,6(a1)
  51.     swap    d0
  52.     move.w    d0,2(a1)
  53.  
  54.     move.l    #COPPERLIST,$dff080    ; nostra COP
  55.     move.w    d0,$dff088        ; START COP
  56.     move.w    #0,$dff1fc        ; NO AGA!
  57.     move.w    #$c00,$dff106        ; NO AGA!
  58.  
  59.  
  60. Mouse1:
  61.     cmpi.b    #$ff,$dff006    ; Zeile    255?
  62.     bne.s    Mouse1
  63.  
  64.     bsr.w    BewegeSprite    ; bewegt alle Sprites
  65.     
  66. Warte:
  67.     cmpi.b    #$ff,$dff006    ; Zeile $ff?
  68.     beq.s    Warte
  69.  
  70.     btst    #6,$bfe001    ; Mouse gedrückt?
  71.     bne.s    mouse1
  72.  
  73.  
  74.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  75.     move.w    d0,$dff088        ; Starten die alte SystemCOP
  76.  
  77.     move.l    4.w,a6
  78.     jsr    -$7e(a6)    ; Enable
  79.     move.l    gfxbase(PC),a1
  80.     jsr    -$19e(a6)    ; Closelibrary
  81.     rts
  82.  
  83. ;    Daten
  84. GfxName:
  85.     dc.b    "graphics.library",0,0
  86.  
  87. GfxBase:
  88.     dc.l    0
  89.  
  90. OldCop:
  91.     dc.l    0
  92.  
  93.  
  94. ; Diese Routine liest aus der Tabelle die Koordinaten des Sprite 0, bewegt
  95. ; ihn mit der Universalroutine, die wir in Listing7m.s gesehen haben, und
  96. ; dann bewegt sie auch die anderen Sprites. Diese anderen werden die gleichen
  97. ; vertikalen Koordinaten haben und nur jeweils um 16 Pixel horizontal
  98. ; verschoben:
  99. ; Die horizontale Position des Sprite 1 ist 16 Pixel weiter rechts als Sprite0
  100. ; Die horizontale Position des Sprite 2 ist 16 Pixel weiter rechts als Sprite1
  101. ; Die horizontale Position des Sprite 2 ist 16 Pixel weiter rechts als Sprite2
  102.  
  103. Bewegesprite:
  104.     ADDQ.L    #1,TABYPOINT     ; Point auf das nächste Byte
  105.     MOVE.L    TABYPOINT(PC),A0 ; Adresse aus Long TABXPOINT
  106.                  ; wird in a0 kopiert
  107.     CMP.L    #ENDETABY-1,A0     ; Sind wir beim letzten Longword der TAB?
  108.     BNE.S    NOBSTARTY     ; noch nicht? dann weiter
  109.     MOVE.L    #TABY-1,TABYPOINT ; Starte wieder beim ersten Byte (-1)
  110. NOBSTARTY:
  111.     moveq    #0,d4        ; Lösche d0
  112.     MOVE.b    (A0),d4
  113.  
  114.     ADDQ.L    #1,TABXPOINT     ; Pointe auf das nächste Word
  115.     MOVE.L    TABXPOINT(PC),A0 ; Adresse aus Long TABXPOINT
  116.                  ; wird in a0 kopiert
  117.     CMP.L    #ENDETABX-1,A0     ; sind wir beim letzten Word der TAB?
  118.     BNE.S    NOBSTARTX     ; noch nicht? dann weiter
  119.     MOVE.L    #TABX-1,TABXPOINT ; beginne beim ersten Word-2
  120. NOBSTARTX:
  121.     moveq    #0,d3        ; löscht d1
  122.     MOVE.b    (A0),d3        ; setzen den Wert der Tabelle in d1
  123.  
  124.     moveq    #15,d2        ; Höhe des Sprite in d2
  125.  
  126.  
  127.     
  128.     lea    MEINSPRITE,A1    ; Adresse Sprite 0
  129.     move.w    d4,d0        ; geben die Koordinaten in die Register
  130.     move.w    d3,d1
  131.     bsr.w    UniMoveSprite    ; führt die Universalrout aus, die den Sprite
  132.                 ; positioniert
  133.  
  134.     lea    MEINSPRITE1,A1    ; Adresse Sprite 1
  135.     add.w    #16,d3        ; sprite 1 16 pixel piu` a destra di sprite 0
  136.     move.w    d4,d0        ; geben die Koordinaten in die Register
  137.     move.w    d3,d1
  138.     bsr.w    UniMoveSprite    ; führt die Universalrout aus, die den Sprite
  139.                 ; positioniert
  140.  
  141.     lea    MEINSPRITE2,A1    ; Adresse Sprite 2
  142.     add.w    #16,d3        ; sprite 2 16 pixel piu` a destra di sprite 1
  143.     move.w    d4,d0        ; geben die Koordinaten in die Register
  144.     move.w    d3,d1
  145.     bsr.w    UniMoveSprite    ; führt die Universalrout aus, die den Sprite
  146.                 ; positioniert
  147.  
  148.     lea    MEINSPRITE3,A1    ; Adresse Sprite 3
  149.     add.w    #16,d3        ; sprite 3 16 pixel piu` a destra di sprite 2
  150.     move.w    d4,d0        ; geben die Koordinaten in die Register
  151.     move.w    d3,d1
  152.     bsr.w    UniMoveSprite    ; führt die Universalrout aus, die den Sprite
  153.                 ; positioniert
  154.     rts
  155.  
  156. TABYPOINT:
  157.     dc.l    TABY-1        ; BEMERKE: Die Werte in der Tabelle sind hier
  158.                 ; Bytes, wir arbeiten also mit einem ADDQ.L #1,
  159.                 ; TABYPOINT, und nicht #2 wie bei den Words
  160.                 ; oder #4 bei den Longwords.
  161.  
  162. TABXPOINT:
  163.     dc.l    TABX-2    ; Bemerke: die Werte in der Tabelle sind hier Word
  164.  
  165. ; Tabelle mit vorausberechneten Y-Koordinaten.
  166. ; Zu Bemerken, daß die Y-Position des Sprites zwischen $2c und $f2 liegen muß,
  167. ; wenn wir ihn in das Videofenster bekommen wollen. In der Tabelle sind alles
  168. ; Werte enthalten, die innerhalb dieses Limits liegen.
  169.  
  170.  
  171. TABY:
  172.     incbin    "ycoordinatok.tab"    ; 200 .B Werte
  173. ENDETABY:
  174.  
  175. ; Tabelle mit X-Koordinaten für den linken Sprite. Diese Tabelle enthält
  176. ; reale Werte, ohne den Offsets, die werden von der UniversalRoutine
  177. ; automatisch dazugezählt.
  178. ; Da die vier Sprites zusammen ein Bild ergeben, das 64 Pixel breit ist,
  179. ; kann der linke Sprite seine Position nur bis maximal 319-64=255 ausdehnen.
  180. ; Das hat zur Folge, daß wir auch für diese Tabelle Bytes statt Words
  181. ; verwenden können.
  182. ; Die Tabelle wird immer so gemacht:
  183. ;
  184. ; IS
  185. ; beg>0
  186. ; end>360
  187. ; amount>300
  188. ; amp>255/2
  189. ; y_offset>255/2
  190. ; multiplier>1
  191.  
  192. TABX:
  193.     DC.B    $80,$83,$86,$88,$8B,$8E,$90,$93,$95,$98,$9B,$9D,$A0,$A2,$A5,$A8
  194.     DC.B    $AA,$AD,$AF,$B1,$B4,$B6,$B9,$BB,$BD,$C0,$C2,$C4,$C6,$C9,$CB,$CD
  195.     DC.B    $CF,$D1,$D3,$D5,$D7,$D9,$DB,$DC,$DE,$E0,$E2,$E3,$E5,$E7,$E8,$EA
  196.     DC.B    $EB,$EC,$EE,$EF,$F0,$F1,$F2,$F4,$F5,$F6,$F6,$F7,$F8,$F9,$FA,$FA
  197.     DC.B    $FB,$FB,$FC,$FC,$FD,$FD,$FD,$FE,$FE,$FE,$FE,$FE,$FE,$FE,$FE,$FD
  198.     DC.B    $FD,$FD,$FC,$FC,$FB,$FB,$FA,$FA,$F9,$F8,$F7,$F6,$F6,$F5,$F4,$F2
  199.     DC.B    $F1,$F0,$EF,$EE,$EC,$EB,$EA,$E8,$E7,$E5,$E3,$E2,$E0,$DE,$DC,$DB
  200.     DC.B    $D9,$D7,$D5,$D3,$D1,$CF,$CD,$CB,$C9,$C6,$C4,$C2,$C0,$BD,$BB,$B9
  201.     DC.B    $B6,$B4,$B1,$AF,$AD,$AA,$A8,$A5,$A2,$A0,$9D,$9B,$98,$95,$93,$90
  202.     DC.B    $8E,$8B,$88,$86,$83,$80,$7E,$7B,$78,$76,$73,$70,$6E,$6B,$69,$66
  203.     DC.B    $63,$61,$5E,$5C,$59,$56,$54,$51,$4F,$4D,$4A,$48,$45,$43,$41,$3E
  204.     DC.B    $3C,$3A,$38,$35,$33,$31,$2F,$2D,$2B,$29,$27,$25,$23,$22,$20,$1E
  205.     DC.B    $1C,$1B,$19,$17,$16,$14,$13,$12,$10,$0F,$0E,$0D,$0C,$0A,$09,$08
  206.     DC.B    $08,$07,$06,$05,$04,$04,$03,$03,$02,$02,$01,$01,$01,$00,$00,$00
  207.     DC.B    $00,$00,$00,$00,$00,$01,$01,$01,$02,$02,$03,$03,$04,$04,$05,$06
  208.     DC.B    $07,$08,$08,$09,$0A,$0C,$0D,$0E,$0F,$10,$12,$13,$14,$16,$17,$19
  209.     DC.B    $1B,$1C,$1E,$20,$22,$23,$25,$27,$29,$2B,$2D,$2F,$31,$33,$35,$38
  210.     DC.B    $3A,$3C,$3E,$41,$43,$45,$48,$4A,$4D,$4F,$51,$54,$56,$59,$5C,$5E
  211.     DC.B    $61,$63,$66,$69,$6B,$6E,$70,$73,$76,$78,$7B,$7E
  212. ENDETABX:
  213.  
  214. ; Universelle Routine zum Positionieren der Sprites
  215.  
  216. ;    Eingangsparameter von UniMoveSprite:
  217. ;
  218. ;    a1 = Adresse des Sprite
  219. ;    d0 = Vertikale Position des Sprite auf dem Screen (0-255)
  220. ;    d1 = Horizontale Position des Sprite auf dem Screen (0-320)
  221. ;    d2 = Höhe des Sprite
  222. ;
  223. UniMoveSprite:
  224. ; Vertikale Positionierung
  225.  
  226.     ADD.W    #$2c,d0     ; zähle den Offset vom Anfang des Screens dazu
  227.  
  228. ; a1 enthält die Adresse des Sprite
  229.  
  230.     MOVE.b    d0,(a1)        ; kopiert das Byte in VSTART
  231.     btst.l    #8,d0
  232.     beq.s    NichtVSTARTSET
  233.     bset.b    #2,3(a1)    ; Setzt das Bit 8 von VSTART (Zahl > $FF)
  234.     bra.s    ToVSTOP
  235. NichtVSTARTSET:
  236.     bclr.b    #2,3(a1)    ; Löscht das Bit 8 von VSTART (Zahl < $FF)
  237. ToVSTOP:
  238.     ADD.w    D2,D0        ; Zähle die Höhe des Sprite dazu, um
  239.                 ; die Endposition zu errechnen (VSTOP)
  240.     move.b    d0,2(a1)    ; Setze den richtigen Wert in VSTOP
  241.     btst.l    #8,d0
  242.     beq.s    NichtVSTOPSET
  243.     bset.b    #1,3(a1)    ; Setzt Bit 8 von VSTOP (Zahl > $FF)
  244.     bra.w    VVSTOPENDE
  245. NichtVSTOPSET:
  246.     bclr.b    #1,3(a1)    ; Löscht Bit 8 von VSTOP (Zahl < $FF)
  247. VVSTOPENDE:
  248.  
  249. ; horizontale Positionierung
  250.  
  251.     add.w    #128,D1        ; 128 - um den Sprite zu zentrieren
  252.     btst    #0,D1        ; niederwert. Bit der X-Koordinate auf 0?
  253.     beq.s    NiederBitNull
  254.     bset    #0,3(a1)    ; Setzen das niederw. Bit von HSTART
  255.     bra.s    PlaceCoords
  256.  
  257. NiederBitNull:
  258.     bclr    #0,3(a1)    ; Löschen das niederw. Bit von HSTART
  259. PlaceCoords:
  260.     lsr.w    #1,D1        ; SHIFTEN, verschieben den Wert von HSTART um
  261.                 ; 1 Bit nach Rechts, um es in den Wert zu
  262.                 ; "verwandeln", der dann in HSTART kommt, also
  263.                 ; ohne dem niederwertigen Bit.
  264.     move.b    D1,1(a1)    ; geben den Wert XX ins Byte HSTART
  265.     rts
  266.  
  267.  
  268.  
  269.     SECTION GRAPHIC,DATA_C
  270.  
  271. COPPERLIST:
  272. SpritePointers:
  273.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  274.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  275.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  276.     dc.w    $13e,0
  277.  
  278.     dc.w    $8E,$2c81    ; DiwStrt
  279.     dc.w    $90,$2cc1    ; DiwStop
  280.     dc.w    $92,$38        ; DdfStart
  281.     dc.w    $94,$d0        ; DdfStop
  282.     dc.w    $102,0        ; BplCon1
  283.     dc.w    $104,0        ; BplCon2
  284.     dc.w    $108,0        ; Bpl1Mod
  285.     dc.w    $10a,0        ; Bpl2Mod
  286.  
  287.             ; 5432109876543210
  288.     dc.w    $100,%0001001000000000    ; Bit 12 an!! 1 Bitplane Lowres
  289.  
  290. BPLPOINTERS:
  291.     dc.w $e0,0,$e2,0    ;erstes    Bitplane
  292.  
  293.     dc.w    $180,$000    ; Color0    ; Hintergrund Schwarz
  294.     dc.w    $182,$123    ; Color1    ; Farbe 1 des Bitplane, die
  295.                         ; in diesem Fall leer ist,
  296.                         ; und deswegen nicht erscheint
  297.  
  298.     dc.w    $1A2,$800    ; Color17, oder COLOR1 des Sprite0 - ROT
  299.     dc.w    $1A4,$d00    ; Color18, oder COLOR2 des Sprite0 - GRÜN
  300.     dc.w    $1A6,$CC0    ; Color19, oder COLOR3 des Sprite0 - GELB
  301.  
  302. ; die Farben der Sprite 2 und 3 sind die gleichen, wie bei Sprite 0 und 1
  303.  
  304.     dc.w    $1AA,$800    ; Color21
  305.     dc.w    $1AC,$d00    ; Color22
  306.     dc.w    $1AE,$cc0    ; Color23
  307.  
  308.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  309.  
  310.  
  311. ; ************ Hier sind die Sprites:NATÜRLIHC in CHIP RAM! **********
  312.  
  313. MEINSPRITE:                ; Länge 15 Zeilen
  314.     incbin    "Largesprite0.raw"
  315.  
  316. MEINSPRITE1:                ; Länge 15 Zeilen
  317.     incbin    "Largesprite1.raw"
  318.  
  319. MEINSPRITE2:                ; Länge 15 Zeilen
  320.     incbin    "Largesprite2.raw"
  321.  
  322. MEINSPRITE3:                ; Länge 15 Zeilen
  323.     incbin    "Largesprite3.raw"
  324.  
  325.     SECTION LEERESPLANE,BSS_C ; Ein auf 0 gesetztes Bitplane, wir
  326.                   ; müssen es verwenden, denn ohne Bitplane
  327.                   ; ist es nicht möglich, die Sprites
  328.                   ; zu aktivieren
  329. BITPLANE:
  330.     ds.b    40*256        ; Bitplane auf 0 Lowres
  331.  
  332.     end
  333.  
  334. In  diesem  Listing  verwenden  wir  4 Sprites zu 4 Farben, um ein Bild zu
  335. schaffen,  das  64  Pixel  breit  ist.  Die  Sprites  sind  horizontal
  336. nebeneinander  angereiht. Sie haben alle die gleiche Vertikalposition, nur
  337. horizontal sind sie alle um 16 Pixel vom Vorgänger verschoben.  Wir  lesen
  338. aus  der  Tabelle  die  Koordinaten des ersten Sprite, während die anderen
  339. diese übernehmen außer die der X-Koordinate, da wird immer 16 dazugezählt.
  340. Bemerkt ihr die Bequemlichkeit der Universalroutine:  um  die  Sprites  zu
  341. bewegen  verwenden  wir  immer  die  gleiche  Routine,  nur  daß wir in a1
  342. jedesmal eine andere Adresse geben und in d0 und  d1  andere  Koordinaten.
  343. Die  Höhe  ist immer die gleiche, deswegen wird d2 nicht modifiziert. Wenn
  344. das aber der Fall wäre,  dann  würde  es  auch  kein  Problem  darstellen,
  345. einfach den Wert in d2 anpassen und alles läuft.
  346.  
  347.