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

  1.  
  2. ; Listing6m.s    "RÜCKPRALLEFFEKT", HERGESTELLT MIT EINER TABELLE
  3.  
  4.  
  5.     SECTION    CIPundCOP,CODE
  6.  
  7. Anfang:
  8.     move.l    4.w,a6        ; Execbase
  9.     jsr    -$78(a6)    ; Disable
  10.     lea    GfxName(PC),a1    ; Namen der Lib
  11.     jsr    -$198(a6)    ; OpenLibrary
  12.     move.l    d0,GfxBase    ;
  13.     move.l    d0,a6
  14.     move.l    $26(a6),OldCop    ; speichern die alte COP
  15.  
  16. ;    POINTEN AUF UNSERE BITPLANES
  17.  
  18.     MOVE.L    #PIC,d0        ; wohin pointen
  19.     LEA    BPLPOINTERS,A1    ; COP - Pointers
  20.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  21.                 ; für den DBRA - Zyklus
  22. POINTBP:
  23.     move.w    d0,6(a1)
  24.     swap    d0        
  25.     move.w    d0,2(a1)    
  26.     swap    d0        ;
  27.     ADD.L    #40*256,d0    ; + Länge Bitplane
  28.  
  29.     addq.w    #8,a1
  30.     dbra    d1,POINTBP
  31.  
  32.     move.l    #COPPERLIST,$dff080    ; COP1LC - unsere COP
  33.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  34.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  35.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  36.  
  37. mouse:
  38.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  39.     bne.s    mouse
  40.     
  41.     bsr.w    BOING        ; Läßt das Bild "springen". Verwenden dazu
  42.                 ; eine Tabelle
  43.  
  44. Warte:
  45.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  46.     beq.s    Warte        
  47.  
  48.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  49.     bne.s    mouse
  50.  
  51.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  52.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  53.  
  54.     move.l    4.w,a6
  55.     jsr    -$7e(a6)    ; Enable
  56.     move.l    GfxBase(PC),a1
  57.     jsr    -$19e(a6)    ; Closelibrary 
  58.     rts
  59.  
  60.  
  61. ; DATEN
  62.  
  63. GfxName:
  64.     dc.b    "graphics.library",0,0
  65.  
  66. GfxBase:
  67.     dc.l    0
  68.  
  69. OldCop:
  70.     dc.l    0
  71.  
  72. ; Diesmal verwenden wir eine Tabelle, die die Werte enthält, die von den
  73. ; Bitplanepointers abgezogen werden sollen. Somit simulieren wird das Springen,
  74. ; das "Federn" eines Bildes, und erhalten nicht eine banale
  75. ; Rauf-Runter-Bewegung mit einer Serie von add.l #40 und sub.l #40.
  76. ; Dafür brauchen wir eben eine Tabelle, die diese Werte enthält. Diese sind
  77. ; klarerweise Vielfache von 40, wobei 2*40 ein Sprung von 2 Zeilen bedeutet,
  78. ; 3*40 3 Zeilen...:
  79. ;
  80. ;    dc.l    40,40,2*40,2*40 ; Beispiel...
  81. ;
  82. ; Um in die Anfangsposition zurückzukommen, wenn wir einmal am Ende des
  83. ; Bildschirmes angekommen sind, müssen wir soviel dazuzählen, wieviel von
  84. ; den Bitplane-Pointern abgezogen wurde. Da in der Routine aber eine
  85. ; Subtraktion vorhanden ist:
  86. ;
  87. ;    sub.l    d1,d0    ; subtrahiere den Wert aus der Tabelle (d1) von der
  88. ;            ; Adresse, auf die BplPointer gerade zeigt
  89. ;
  90. ; wie zum Geier können wir dann mit dieser Subtraktion etwas dazuzählen?
  91. ; Ganz simpel!! Einfach negative Zahlen wegzählen!!! Wieviel ist 10-(-1))
  92. ; Ganz klar, 11! Also stehen in der Tabelle negative Zahlen, nachdem wir
  93. ; das "Ende" erreicht haben:
  94. ;
  95. ;    dc.l    -8*40,-6*40,-5*40        ; gehen wieder rauf
  96. ;
  97. ; ein sub.l #-8*40 ist wie ein add.l #8*40.
  98. ; Erinnert ihr euch aber auch, daß die negativen Zahlen das Vorzeichen mit dem
  99. ; höchstwertigsten Bit speichern? Ein -40 ist also ein $FFFFFFd8, deswegen
  100. ; sind die Werte in der Tabelle auch LongWord und nicht WORD, eben um auch
  101. ; negative Zahlen beinhalten zu können, Word sind nur positiv.
  102. ; Ein
  103. ;
  104. ; dc.w -40
  105. ;
  106. ; wird nicht assembliert, es gibt einen Fehler, ihr müßt ein Long verwenden
  107. ; wenn ihr negative Zahlen braucht.
  108. ;
  109. ; Da wir .L-Werte verwendet haben, müssen wir das auch in der Routine
  110. ; berücksichtigen:
  111. ;
  112. ; ADDQ.L #4,BOINGTABPOINT
  113. ; ENDEBOINGTAB-4
  114. ; dc.l BOINGTAB-4
  115. ;
  116. ; und nicht
  117. ;
  118. ; ADDQ.L #2,BOINGTABPOINT
  119. ; ENDEBOINGTAB-2
  120. ; dc.l BOINGTAB-2
  121. ;
  122. ; Was das Verschieben des Bildes angeht, gibts keine Neuigkeiten: wir holen
  123. ; die Adresse aus den BPLPOINTERS, machen unsere SUB mit dem aus der Tabelle
  124. ; geholten Wert und schreiben die neu errechnete Adresse zurück.
  125.  
  126.  
  127. BOING:
  128.     LEA    BPLPOINTERS,A1    ; Mit diesen 4 Anweisungen holen wir aus der
  129.     move.w    2(a1),d0    ; Copperlist die Adresse, wohin das $dff0e0
  130.     swap    d0        ; gerade pointet und geben diesen Wert
  131.     move.w    6(a1),d0    ; in d0
  132.  
  133.     ADDQ.L    #4,BOINGTABPOINT    ; Pointe auf das nächste Longword
  134.     MOVE.L    BOINGTABPOINT(PC),A0    ; Adresse, die im Long BOINGTABPOINT
  135.                     ; steht wird in a0 kopiert
  136.     CMP.L    #ENDEBOINGTAB-4,A0    ; Sind wir beim letzten .L in der TAB?
  137.     BNE.S    NOBSTART2        ; noch nicht? dann fahr´ fort
  138.     MOVE.L    #BOINGTAB-4,BOINGTABPOINT ; Starte wieder beim ersten Long
  139. NOBSTART2:
  140.     MOVE.l    (A0),d1        ; kopiere das Long aus der Tabelle in d1
  141.  
  142.     sub.l    d1,d0        ; subtrahieren den Wert aud der Tabelle, somit
  143.                 ; scrollt das Bild rauf oder runter
  144.  
  145.     LEA    BPLPOINTERS,A1    ; Pointer in der COPPERLIST
  146.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  147.  
  148.  
  149. POINTBP2:
  150.     move.w    d0,6(a1)   ; kopiert das niederw. Word der Adress des Plane
  151.     swap    d0       ; vertauscht die 2 Word von d0 (z.B.: 1234 > 3412)
  152.     move.w    d0,2(a1)   ; kopiert das höherw. Word der Adresse des Plane
  153.     swap    d0       ; vertauscht die 2 Word von d0 (3412 > 1234)
  154.     ADD.L    #40*256,d0 ; + Länge Bitplane -> nächstes Bitplane
  155.     addq.w    #8,a1       ; zu den nächsten bplpointers in der Cop
  156.     dbra    d1,POINTBP2 ; Wiederhole D1 Mal POINTBP (D1=num of bitplanes)
  157.     rts
  158.  
  159.  
  160. BOINGTABPOINT:           ; Dieses Longword "POINTET" auf BOINGTAB, also
  161.     dc.l    BOINGTAB-4 ; enthält es die Adresse von BOINGTAB. Es wird
  162.                ; die Adresse des letzten gelesenen Long innerhalb
  163.                ; der Tabella beinhalten. (hier beginnt es bei
  164.                ; BOINGTAB-4, weil BOING mit einem  ADDQ.L #4,C..
  165.                ; beginnt es gleicht somit diese Anweisung aus.
  166.  
  167. ;    Die Tabelle mit den "vorgerechneten" Rückprallwerten:
  168.  
  169. BOINGTAB:
  170.     dc.l    0,0,0,0,0,0,40,40,40,40,40,40,40,40,40      ; sinken
  171.     dc.l    40,40,2*40,2*40
  172.     dc.l    2*40,2*40,2*40,2*40,2*40
  173.     dc.l    3*40,3*40,3*40,3*40,3*40,4*40,4*40,4*40,5*40,5*40
  174.     dc.l    6*40,8*40                    ; ganz unten
  175.     dc.l    -8*40,-6*40,-5*40                ; steigen
  176.     dc.l    -5*40,-4*40,-4*40,-4*40,-3*40,-3*40,-3*40,-3*40,-3*40
  177.     dc.l    -2*40,-2*40,-2*40,-2*40,-2*40
  178.     dc.l    -2*40,-2*40,-40,-40
  179.     dc.l    -40,-40,-40,-40,-40,-40,-40,-40,-40,0,0,0,0,0    ; sind ganz
  180. ENDEBOINGTAB:                            ; oben
  181.  
  182.  
  183.  
  184.     SECTION GRAPHIC,DATA_C
  185.  
  186. COPPERLIST:
  187.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  188.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  189.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  190.     dc.w    $13e,$0000
  191.  
  192.     dc.w    $8E,$2c81    ; DiwStrt (Register mit Normalwerten)
  193.     dc.w    $90,$2cc1    ; DiwStop
  194.     dc.w    $92,$0038    ; DdfStart
  195.     dc.w    $94,$00d0    ; DdfStop
  196.     dc.w    $102,0        ; BplCon1
  197.     dc.w    $104,0        ; BplCon2
  198.     dc.w    $108,0        ; Bpl1Mod
  199.     dc.w    $10a,0        ; Bpl2Mod
  200.  
  201.             ; 5432109876543210
  202.     dc.w    $100,%0011001000000000  ; Bits 12 +13 an! (3 = %011)
  203.  
  204. BPLPOINTERS:
  205.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane
  206.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane
  207.     dc.w $e8,$0000,$ea,$0000    ;drittes Bitplane
  208.  
  209.     dc.w    $0180,$000    ; Color0
  210.     dc.w    $0182,$475    ; Color1
  211.     dc.w    $0184,$fff    ; Color2
  212.     dc.w    $0186,$ccc    ; Color3
  213.     dc.w    $0188,$999    ; Color4
  214.     dc.w    $018a,$232    ; Color5
  215.     dc.w    $018c,$777    ; Color6
  216.     dc.w    $018e,$444    ; Color7
  217.  
  218.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  219.  
  220.     dcb.b    80*40,0 ; auf NULL gesetzter Speicher vor dem Bitplane
  221.  
  222. PIC:
  223.     incbin    "amiga.320*256*3"    ; hier laden wir das Bild in RAW
  224.  
  225.  
  226.  
  227.     end
  228.  
  229. Ein  Spiel  oder  ein  Demo  programmieren  bedeutet auch, eine Unzahl von
  230. Tabllen zu erstellen. Die Tabelle in diesem Listing könnte geeignet  sein,
  231. ein  Männchen  in  einem  Platform-Spiel  springen zu lassen. Die schlecht
  232. programmierten Spiele, bzw. mit einer nicht geeigneten  Programmiersprache
  233. auscodierten    Spiele,    unterscheiden    sich  oft  in  den  unnatürlichen
  234. Bewegungen der Figuren, in ihrer Langsamkeit  oder  anderem.  Stellt  euch
  235. vor, euer Held springt nach oben: zuerst geht´s linear mit einer Reihe von
  236. Sub rauf,  dann  mit  einigen  Add  wieder  herunter.  Graußig.  Auch  die
  237. Wellenbewegungen von Außerirdischen in einem Shoot-em-Up sind das Ergebnis
  238. von Tabellen. Die etwas besseren  Programmierer  komplizieren  dann  alles
  239. noch  mal:  sie  machen  eigene Tabellen für den Sprung, abhängig davon wo
  240. sich das Männchen gerade befindet,  jenachdem  wie  lange  der  Feuerknopf
  241. gedrückt  wird,  kommt  eine  andere  Sprungtabelle  zum Einsatz und somit
  242. springt es weiter oder weniger weit. Dann zählen sie noch errechnete Werte
  243. (z.B. Geschwindigkeit des Männchens) dazu und die Bewegungen sind perfekt.
  244. In extremen Beispielen wie  Flipperspielen  muß  der  Rückprall  berechnet
  245. werden,  abhängig von Winkel, Geschwindigkeit und Schwerkraft. Es schließt
  246. aber nicht aus, daß auch sie Tabellen verwenden. In Flipperspielen  bewegt
  247. sich    nur  die  Kugel,  das  Spielfeld  kann  einfach  durch  Ändern  der
  248. BitplanePointers verschoben werden, deswegen kann  man  es  sich  leisten,
  249. Zeit  mit  Berechnungen zu verlieren. Studiert euch also gut die Routinen,
  250. die mit Tabellen arbeiten und modifiziert  vorherige  Beispiele,  um  z.B.
  251. einen  Farbverlaufbalken  mit  dem  Copper  auf  komische Art und Weise zu
  252. bewegen.
  253.  
  254.  
  255. Tauscht die Tabelle mit dieser aus:  sie  produziert  eine  "oszillierende
  256. Fluktuation"  (A.d.Ü.:  "Hört sich ziemlich nach Raumschiff Enterprise an,
  257. was gemeint ist, seht ihr beim Testen!") anstatt dem Rückprall. (verwendet
  258. Amiga+b+c+i)
  259.  
  260.  
  261. BOINGTAB:
  262.     dc.l    0,0,40,40,40,40,40,40,40,40,40        ; oben
  263.     dc.l    40,40,2*40,2*40
  264.     dc.l    2*40,2*40,2*40,2*40,2*40        ; beschleunigen
  265.     dc.l    3*40,3*40,3*40,3*40,3*40
  266.     dc.l    3*40,3*40,3*40,3*40,3*40
  267.     dc.l    2*40,2*40,2*40,2*40,2*40        ; bremsen
  268.     dc.l    2*40,2*40,40,40
  269.     dc.l    40,40,40,40,40,40,40,40,40,0,0,0,0,0,0,0 ; unten
  270.     dc.l    -40,-40,-40,-40,-40,-40,-40,-40,-40
  271.     dc.l    -40,-40,-2*40,-2*40
  272.     dc.l    -2*40,-2*40,-2*40,-2*40,-2*40
  273.     dc.l    -3*40,-3*40,-3*40,-3*40,-3*40        ; beschleunigen
  274.     dc.l    -3*40,-3*40,-3*40,-3*40,-3*40
  275.     dc.l    -2*40,-2*40,-2*40,-2*40,-2*40        ; bremsen
  276.     dc.l    -2*40,-2*40,-40,-40
  277.     dc.l    -40,-40,-40,-40,-40,-40,-40,-40,-40,0,0,0,0,0 ; wieder ganz
  278. ENDEBOINGTAB:                              ; oben
  279.  
  280.  
  281.