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

  1.  
  2. ; Listing7o.s - Beispiel einer Anwendung der Universalroutine:
  3. ;        zwei Sprites werden von der selben Routine bewegt
  4.  
  5.  
  6.     SECTION CipundCop,CODE
  7.  
  8. Anfang:
  9.     move.l    4.w,a6        ; Execbase
  10.     jsr    -$78(a6)    ; Disable
  11.     lea    GfxName(PC),a1    ; Libname
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,GfxBase
  14.     move.l    d0,a6
  15.     move.l    $26(a6),OldCop    ; speichern die alte COP
  16.  
  17. ;    Pointen auf das "leere" PIC
  18.  
  19.     MOVE.L    #BITPLANE,d0    ; wohin pointen
  20.     LEA    BPLPOINTERS,A1    ; COP-Pointer
  21.     move.w    d0,6(a1)
  22.     swap    d0
  23.     move.w    d0,2(a1)
  24.  
  25. ;    Pointen auf den Sprite
  26.  
  27.     MOVE.L    #MEINSPRITE,d0        ; Adresse des Sprite in d0
  28.     LEA    SpritePointers,a1    ; Pointer in der Copperlist
  29.     move.w    d0,6(a1)
  30.     swap    d0
  31.     move.w    d0,2(a1)
  32.  
  33.     addq.l    #8,a1
  34.     MOVE.L    #MEINSPRITE2,d0     ; Adresse des Sprite in d0
  35.     move.w    d0,6(a1)
  36.     swap    d0
  37.     move.w    d0,2(a1)
  38.  
  39.     move.l    #COPPERLIST,$dff080    ; unsere COP
  40.     move.w    d0,$dff088        ; START COP
  41.     move.w    #0,$dff1fc        ; NO AGA!
  42.     move.w    #$c00,$dff106
  43.  
  44. mouse:
  45.     cmpi.b    #$aa,$dff006    ; Zeile $aa?
  46.     bne.s    mouse
  47.  
  48.  
  49.     btst    #2,$dff016
  50.     beq.s    Warte
  51.     bsr.w    BewegeSprite    ; Bewege Sprite
  52.  
  53. Warte:
  54.     cmpi.b    #$aa,$dff006    ; Zeile $aa?
  55.     beq.s    Warte
  56.  
  57.     btst    #6,$bfe001    ; Mouse gedrückt?
  58.     bne.s    mouse
  59.  
  60.  
  61.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  62.     move.w    d0,$dff088        ; Starten die alte SystemCOP
  63.  
  64.     move.l    4.w,a6
  65.     jsr    -$7e(a6)    ; Enable
  66.     move.l    gfxbase(PC),a1
  67.     jsr    -$19e(a6)    ; Closelibrary
  68.     rts
  69.  
  70. ;    Daten
  71.     
  72.  
  73. GfxName:
  74.     dc.b    "graphics.library",0,0
  75.  
  76. GfxBase:
  77.     dc.l    0
  78.  
  79. OldCop:
  80.     dc.l    0
  81.  
  82. ; Diese Routine liest aus den zwei Tabellen die realen Koordinaten der Sprite.
  83. ; Also die X-Koordinate, die von 0 bis 320 geht, und die Y, von 0 bis 256
  84. ; (ohne Overscan). Da wir in diesem Beispiel kein Overscan verwenden ist die
  85. ; Koordinatentabelle für die Y-Positionen aus Byte erstellt. Die Tabelle für
  86. ; die X-Koordinaten hingegen besteht aus Word, da sie Werte größer als 256
  87. ; enthaltne muß.
  88. ; Diese Routine positioniert den Sprite aber nicht direkt. Sie limitiert sich
  89. ; darauf, es die Universalroutine tun zu lassen, sie übermittelt ihr nur
  90. ; die Koordinaten über die Register d0 und d1.
  91.  
  92.  
  93. BewegeSprite:
  94.     ADDQ.L    #1,TABYPOINT     ; Point auf das nächste Byte
  95.     MOVE.L    TABYPOINT(PC),A0 ; Adresse aus Long TABXPOINT
  96.                  ; wird in a0 kopiert
  97.     CMP.L    #ENDETABY-1,A0     ; Sind wir beim letzten Longword der TAB?
  98.     BNE.S    NOBSTARTY     ; noch nicht? dann weiter
  99.     MOVE.L    #TABY-1,TABYPOINT ; Starte wieder beim ersten Byte (-1)
  100. NOBSTARTY:
  101.     moveq    #0,d0        ; Lösche d0
  102.     MOVE.b    (A0),d0
  103.  
  104.     ADDQ.L    #2,TABXPOINT     ; Pointe auf das nächste Word
  105.     MOVE.L    TABXPOINT(PC),A0 ; Adresse aus Long TABXPOINT
  106.                  ; wird in a0 kopiert
  107.     CMP.L    #ENDETABX-2,A0     ; sind wir beim letzten Word der TAB?
  108.     BNE.S    NOBSTARTX     ; noch nicht? dann weiter
  109.     MOVE.L    #TABX-2,TABXPOINT ; beginne beim ersten Word-2
  110. NOBSTARTX:
  111.     moveq    #0,d1        ; löscht d1
  112.     MOVE.w    (A0),d1        ; setzen den Wert der Tabelle in d1
  113.  
  114.     lea    MEINSPRITE,a1    ; Adresse des Sprite in a1
  115.     moveq    #13,d2        ; Höhe des Sprite in d2
  116.  
  117.     bsr.w    UniMoveSprite    ; führt die Universalroutine zum
  118.                 ; Positionieren eines Sprites aus
  119. ; zweiter Sprite
  120.     ADDQ.L    #1,TABYPOINT2     ; Point auf das nächste Byte
  121.     MOVE.L    TABYPOINT2(PC),A0; Adresse aus Long TABXPOINT
  122.                  ; wird in a0 kopiert
  123.     CMP.L    #ENDETABY-1,A0     ; Sind wir beim letzten Longword der TAB?
  124.     BNE.S    NOBSTARTY2     ; noch nicht? dann weiter
  125.     MOVE.L    #TABY-1,TABYPOINT2 ; Starte wieder beim ersten Byte (-1)
  126. NOBSTARTY2:
  127.     moveq    #0,d0        ; Lösche d0
  128.     MOVE.b    (A0),d0
  129.  
  130.     ADDQ.L    #2,TABXPOINT2     ; Pointe auf das nächste Word
  131.     MOVE.L    TABXPOINT2(PC),A0; Adresse aus Long TABXPOINT
  132.                  ; wird in a0 kopiert
  133.     CMP.L    #ENDETABX-2,A0     ; sind wir beim letzten Word der TAB?
  134.     BNE.S    NOBSTARTX2     ; noch nicht? dann weiter
  135.     MOVE.L    #TABX-2,TABXPOINT2 ; beginne beim ersten Word-2
  136. NOBSTARTX2:
  137.     moveq    #0,d1        ; löscht d1
  138.     MOVE.w    (A0),d1        ; setzen den Wert der Tabelle in d1
  139.  
  140.     lea    MEINSPRITE2,a1    ; Adresse des Sprite in a1
  141.     moveq    #8,d2        ; Höhe des Sprite in d2
  142.  
  143.     bsr.w    UniMoveSprite    ; führt die Universalroutine zum
  144.                 ; Positionieren eines Sprites aus
  145.     rts
  146.  
  147. ; Pointer auf die Tabellen des ersten Sprite
  148.  
  149. TABYPOINT:
  150.     dc.l    TABY-1
  151. TABXPOINT:
  152.     dc.l    TABX-2
  153.  
  154. ; Pointer auf die Tabellen des zweiten Sprite
  155.  
  156. TABYPOINT2:
  157.     dc.l    TABY+40-1
  158. TABXPOINT2:
  159.     dc.l    TABX+96-2
  160.  
  161. ; Tabelle mit vorausberechneten Y-Koordinaten
  162. TABY:
  163.     incbin    "ycoordinatok.tab"    ; 200 .B Werte
  164. ENDETABY:
  165.  
  166. ; Tabelle mit vorausberechneten X-Koordinaten
  167. TABX:
  168.     incbin    "xcoordinatok.tab"    ; 150 .W Werte
  169. ENDETABX:
  170.  
  171. ; Universelle Routine zum Positionieren der Sprites
  172.  
  173. ;    Eingangsparameter von UniMoveSprite:
  174. ;
  175. ;    a1 = Adresse des Sprite
  176. ;    d0 = Vertikale Position des Sprite auf dem Screen (0-255)
  177. ;    d1 = Horizontale Position des Sprite auf dem Screen (0-320)
  178. ;    d2 = Höhe des Sprite
  179. ;
  180. UniMoveSprite:
  181. ; Vertikale Positionierung
  182.  
  183.     ADD.W    #$2c,d0     ; zähle den Offset vom Anfang des Screens dazu
  184.  
  185. ; a1 enthält die Adresse des Sprite
  186.  
  187.     MOVE.b    d0,(a1)        ; kopiert das Byte in VSTART
  188.     btst.l    #8,d0
  189.     beq.s    NichtVSTARTSET
  190.     bset.b    #2,3(a1)    ; Setzt das Bit 8 von VSTART (Zahl > $FF)
  191.     bra.s    ToVSTOP
  192. NichtVSTARTSET:
  193.     bclr.b    #2,3(a1)    ; Löscht das Bit 8 von VSTART (Zahl < $FF)
  194. ToVSTOP:
  195.     ADD.w    D2,D0        ; Zähle die Höhe des Sprite dazu, um
  196.                 ; die Endposition zu errechnen (VSTOP)
  197.     move.b    d0,2(a1)    ; Setze den richtigen Wert in VSTOP
  198.     btst.l    #8,d0
  199.     beq.s    NichtVSTOPSET
  200.     bset.b    #1,3(a1)    ; Setzt Bit 8 von VSTOP (Zahl > $FF)
  201.     bra.w    VVSTOPENDE
  202. NichtVSTOPSET:
  203.     bclr.b    #1,3(a1)    ; Löscht Bit 8 von VSTOP (Zahl < $FF)
  204. VVSTOPENDE:
  205.  
  206. ; horizontale Positionierung
  207.  
  208.     add.w    #128,D1        ; 128 - um den Sprite zu zentrieren
  209.     btst    #0,D1        ; niederwert. Bit der X-Koordinate auf 0?
  210.     beq.s    NiederBitNull
  211.     bset    #0,3(a1)    ; Setzen das niederw. Bit von HSTART
  212.     bra.s    PlaceCoords
  213.  
  214. NiederBitNull:
  215.     bclr    #0,3(a1)    ; Löschen das niederw. Bit von HSTART
  216. PlaceCoords:
  217.     lsr.w    #1,D1        ; SHIFTEN, verschieben den Wert von HSTART um
  218.                 ; 1 Bit nach Rechts, um es in den Wert zu
  219.                 ; "verwandeln", der dann in HSTART kommt, also
  220.                 ; ohne dem niederwertigen Bit.
  221.     move.b    D1,1(a1)    ; geben den Wert XX ins Byte HSTART
  222.     rts
  223.  
  224.  
  225.     SECTION GRAPHIC,DATA_C
  226.  
  227. COPPERLIST:
  228. SpritePointers:
  229.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  230.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  231.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  232.     dc.w    $13e,0
  233.  
  234.     dc.w    $8E,$2c81    ; DiwStrt
  235.     dc.w    $90,$2cc1    ; DiwStop
  236.     dc.w    $92,$38        ; DdfStart
  237.     dc.w    $94,$d0        ; DdfStop
  238.     dc.w    $102,0        ; BplCon1
  239.     dc.w    $104,0        ; BplCon2
  240.     dc.w    $108,0        ; Bpl1Mod
  241.     dc.w    $10a,0        ; Bpl2Mod
  242.  
  243.             ; 5432109876543210
  244.     dc.w    $100,%0001001000000000    ; Bit 12 an!! 1 Bitplane Lowres
  245.  
  246. BPLPOINTERS:
  247.     dc.w $e0,0,$e2,0    ;erstes    Bitplane
  248.  
  249.     dc.w    $180,$000    ; Color0    ; Hintergrund Schwarz
  250.     dc.w    $182,$123    ; Color1    ; Farbe 1 des Bitplane, die
  251.                         ; in diesem Fall leer ist,
  252.                         ; und deswegen nicht erscheint
  253.  
  254.     dc.w    $1A2,$F00    ; Color17, oder COLOR1 des Sprite0 - ROT
  255.     dc.w    $1A4,$0F0    ; Color18, oder COLOR2 des Sprite0 - GRÜN
  256.     dc.w    $1A6,$FF0    ; Color19, oder COLOR3 des Sprite0 - GELB
  257.  
  258.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  259.  
  260.  
  261. ; ************ Hier ist der Sprite: NATÜRLICH muß er in CHIP RAM sein! ********
  262.  
  263. MEINSPRITE:      ; Länge 13 Zeilen
  264.     dc.b $50  ; Vertikale Anfangsposition des Sprite (von $2c bis $f2)
  265.     dc.b $90  ; Horizontale Anfangsposition des Sprite (von $40 bis $d8)
  266.     dc.b $5d  ; $50+13=$5d    ; Vertikale Endposition des Sprite
  267.     dc.b $00
  268.  dc.w    %0000000000000000,%0000110000110000 ; Binäres Format für ev. Änderungen
  269.  dc.w    %0000000000000000,%0000011001100000
  270.  dc.w    %0000000000000000,%0000001001000000
  271.  dc.w    %0000000110000000,%0011000110001100 ;BINÄR 00=COLOR 0 (DURCHSICHTIG)
  272.  dc.w    %0000011111100000,%0110011111100110 ;BINÄR 10=COLOR 1 (ROT)
  273.  dc.w    %0000011111100000,%1100100110010011 ;BINÄR 01=COLOR 2 (GRÜN)
  274.  dc.w    %0000110110110000,%1111100110011111 ;BINÄR 11=COLOR 3 (GELB)
  275.  dc.w    %0000011111100000,%0000011111100000
  276.  dc.w    %0000011111100000,%0001111001111000
  277.  dc.w    %0000001111000000,%0011101111011100
  278.  dc.w    %0000000110000000,%0011000110001100
  279.  dc.w    %0000000000000000,%1111000000001111
  280.  dc.w    %0000000000000000,%1111000000001111
  281.  dc.w    0,0    ; 2 word auf NULL definieren das Ende des Sprite.
  282.  
  283.  
  284.  
  285. MEINSPRITE2:        ; Länge 8 Zeilen
  286. VSTART2:
  287.     dc.b $60    ; Vertikale Position (von $2c bis $f2)
  288. HSTART2:
  289.     dc.b $60+(14*2) ; Horizontale Position (von $40 bis $d8)
  290. VSTOP2:
  291.     dc.b $68    ; $60+8=$68    ; Ende Vertikal
  292.     dc.b $00
  293.  dc.w    %0000001111000000,%0111110000111110
  294.  dc.w    %0000111111110000,%1111000111001111
  295.  dc.w    %0011111111111100,%1100001000100011
  296.  dc.w    %0111111111111110,%1000000000100001
  297.  dc.w    %0111111111111110,%1000000111000001
  298.  dc.w    %0011111111111100,%1100001000000011
  299.  dc.w    %0000111111110000,%1111001111101111
  300.  dc.w    %0000001111000000,%0111110000111110
  301.  dc.w    0,0    ; fine sprite
  302.  
  303.  
  304.     SECTION LEERESPLANE,BSS_C ; Ein auf 0 gesetztes Bitplane, wir
  305.                   ; müssen es verwenden, denn ohne Bitplane
  306.                   ; ist es nicht möglich, die Sprites
  307.                   ; zu aktivieren
  308. BITPLANE:
  309.     ds.b    40*256        ; Bitplane auf 0 Lowres
  310.  
  311.     end
  312.  
  313. In  diesem  Beispiel  zeigen  wir  die  Vielfältigkeit  der  Routine
  314. UniMoveSprite.  Wir  haben  zwei  Sprites  mit  unterschiedlicher Form und
  315. Größe, und beide werden von der Routine auf den Bildschirm  gebracht.  Die
  316. Routine  BewegeSprite  liest aus den Tabellen die Koordinaten der Sprites,
  317. und dann ruft sie für jeden Sprite die Routine UniMoveSprite  auf.  Achtet
  318. darauf,  wie  die Routine BewegeSprite jedesmal in Register a1 die Adresse
  319. des jeweiligen Sprites gibt (die natürlich verschieden sind). Da auch  die
  320. Höhen anders sind, wird auch in d2 jedesmal ein anderer Wert gegeben, also
  321. der eines jeden Sprite.
  322.  
  323.