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

  1.  
  2. ; Listing3d2.s    ; BALKEN, DER RAUF-UND RUNTERGEHT, ERSTELLT MIT MOVE & WAIT
  3.         ; DES COPPERS
  4.  
  5.  
  6. ;    Routine wird einmal alle drei Frames ausgeführt
  7.  
  8.     
  9.     SECTION CIPundCOP,CODE    ; auch Fast ist    OK
  10.  
  11. Anfang:
  12.     move.l    4.w,a6        ; Execbase in a6
  13.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  14.     lea    GfxName,a1  ; Adresse des Namen der zu öffnenden Library in a1
  15.     jsr    -$198(a6)   ; OpenLibrary, Routine der EXEC, die Libraris
  16.                 ; öffnet, und als Resultat in d0 die Basisadresse
  17.                 ; derselben Bibliothek liefert, ab welcher
  18.                 ; die Offsets (Distanzen) zu machen sind
  19.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  20.     move.l    d0,a6
  21.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  22.                   ; des Betriebssystemes (immer auf $26 nach
  23.                    ; GfxBase)
  24.     move.l    #COPPERLIST,$dff080  ; COP1LC - "Zeiger" auf unsere COP
  25.                      ; (deren Adresse)
  26.     move.w    d0,$dff088         ; COPJMP1 - Starten unsere COP
  27. mouse:    
  28.     cmpi.b    #$ff,$dff006    ; VHPOSR - sind wir bei Zeile 255 angekommen?
  29.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  30.  
  31. frame:
  32.     cmpi.b    #$fe,$dff006 ; Sind wir auf Zeile 254? (muß die Runde nochmal
  33.     bne.s    frame         ; drehen!) Wenn nicht, geh nicht weiter
  34.  
  35.  
  36. frame2:
  37.     cmpi.b    #$fd,$dff006  ; Sind wir auf Zeile 253? (muß die Runde nochmal
  38.     bne.s    frame2          ; drehen!) Wenn nicht, geh nicht weiter
  39.  
  40.  
  41.     bsr.s    BewegeCopper    ; Eine Routine, die den Balken bewegt
  42.  
  43.  
  44.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  45.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  46.  
  47.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  48.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  49.  
  50.     move.l    4.w,a6
  51.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  52.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  53.                 ; (Libraries werden geöffnet UND geschlossen!)
  54.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  55.     rts
  56.  
  57. ;    Routine mit dem ZOOM-Effekt verändert, wie wir ihn schon kennen
  58.  
  59.  
  60. BewegeCopper:
  61.     LEA    BALKEN,a0   ; in a0 kommt die Adresse von Balken
  62.     TST.B    RAUFRUNTER  ; Müßen wir steigen oder sinken? Wenn RaufRunter
  63.                 ; auf 0 steht (wenn TST also BEQ liefert), dann
  64.                 ; springen wir auf GEHRUNTER, wenn es hingegen
  65.                 ; auf $FF ist (TST also nicht eintrifft), fahren
  66.     beq.w    GEHRUNTER   ; wir fort und führen somit den "steigenden" Teil
  67.                 ; aus
  68.  
  69.     cmpi.b    #$82,8*9(a0)    ; sind wir bei Zeile $82 angekommen?
  70.     beq.s    SetzRunter    ; wenn ja, sind wir oben angekommen und
  71.     subq.b    #1,(a0)         ; müßen runter
  72.     subq.b    #1,8(a0)
  73.     subq.b    #1,8*2(a0) ; nun ändern wir die anderen Wait: der
  74.     subq.b    #1,8*3(a0) ; Abstand zwischen einem und dem anderen beträgt
  75.     subq.b    #1,8*4(a0) ; 8 Byte
  76.     subq.b    #1,8*5(a0)
  77.     subq.b    #1,8*6(a0)
  78.     subq.b    #1,8*7(a0) ; hier müßen wir alle 9 Wait des roten Balken
  79.     subq.b    #1,8*8(a0) ; ändern, wenn wir ihn steigen und sinken lassen
  80.     subq.b    #1,8*9(a0) ; wollen.
  81.     rts
  82.  
  83.  
  84. SetzRunter:
  85.     clr.b    RAUFRUNTER    ; Setzt RAUFRUNTER auf 0, beim TST.B RAUFRUNTER
  86.     rts            ; wird das BEQ zu Routine GEHRUNTER verzweigen,
  87.                 ; und der Balken wird sinken
  88.  
  89.  
  90. GEHRUNTER:
  91.     cmpi.b    #$fa,8*9(a0)    ; sind wir bei Zeile $fa angekommen?
  92.     beq.s    SetzRauf    ; wenn ja, sind wir untern und müßen wieder
  93.     addq.b    #1,(a0)        ; steigen
  94.     addq.b    #1,8(a0)
  95.     addq.b    #1,8*2(a0) ; nun ändern wir die anderen Wait: der
  96.     addq.b    #1,8*3(a0) ; Abstand zwischen einem und dem anderen beträgt
  97.     addq.b    #1,8*4(a0) ; 8 Byte
  98.     addq.b    #1,8*5(a0)
  99.     addq.b    #1,8*6(a0)
  100.     addq.b    #1,8*7(a0) ; hier müßen wir alle 9 Wait des roten Balken
  101.     addq.b    #1,8*8(a0) ; ändern, wenn wir ihn steigen und sinken lassen
  102.     addq.b    #1,8*9(a0) ; wollen.
  103.     rts
  104.  
  105. SetzRauf:
  106.     move.b    #$ff,RAUFRUNTER ; Wenn das Label nicht auf NULL ist,
  107.     rts            ; bedeutet es, daß wir steigen müßen
  108.  
  109.  
  110. RAUFRUNTER:
  111.     dc.b    0,0
  112.  
  113. GfxName:
  114.     dc.b    "graphics.library",0,0    ; Bemerkung: um Charakter in den
  115.                     ; Speicher zu geben, verwenden wir
  116.                     ; immer das dc.b und setzen sie
  117.                     ; unter "" oder ´´, Abschluß mit ,0
  118.  
  119. GfxBase:       ; Hier hinein kommt die Basisadresse der graphics.library,
  120.     dc.l    0  ; ab hier werden die Offsets gemacht
  121.  
  122.  
  123.  
  124. OldCop:            ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  125.     dc.l    0   ; Betriebssystemes
  126.  
  127.  
  128.     SECTION GRAPHIC,DATA_C    ; Dieser Befehl veranlaßt das Betriebssystem,
  129.                 ; das folgende Datensegment in die CHIP-RAM
  130.                 ; zu laden, obligatorisch.
  131.                 ; Die Cpperlist MÜSSEN in die CHIP RAM!
  132. COPPERLIST:
  133.     dc.w    $100,$200    ; BPLCON0
  134.     dc.w    $180,$000    ; COLOR0 - Beginne die COP mit SCHWARZ
  135.     dc.w    $4907,$FFFE    ; WAIT - Warte auf Zeile $49 (73)
  136.     dc.w    $180,$001    ; COLOR0 - sehr dunkles Blau
  137.     dc.w    $4a07,$FFFE    ; WAIT - Zeile 74 ($4a)
  138.     dc.w    $180,$002    ; ein bißchen helleres Blau
  139.     dc.w    $4b07,$FFFE    ; Zeile 75 ($4b)
  140.     dc.w    $180,$003    ; helleres    Blau
  141.     dc.w    $4c07,$FFFE    ; nächste Zeile
  142.     dc.w    $180,$004    ; helleres  Blau
  143.     dc.w    $4d07,$FFFE    ; nächste Zeile
  144.     dc.w    $180,$005    ; helleres  Blau
  145.     dc.w    $4e07,$FFFE    ; nächste Zeile
  146.     dc.w    $180,$006    ; Blau auf 6
  147.     dc.w    $5007,$FFFE    ; überspringe 2 Zeilen:
  148.                 ; von $4e bis $50, also von 78 bis 80
  149.     dc.w    $180,$007    ; Blau auf 7
  150.     dc.w    $5207,$FFFE    ; überspringe 2 Zeilen
  151.     dc.w    $180,$008    ; Blau auf 8
  152.     dc.w    $5507,$FFFE    ; überspringe 3 Zeilen
  153.     dc.w    $180,$009    ; Blau auf 9
  154.     dc.w    $5807,$FFFE    ; überspringe 3 Zeilen
  155.     dc.w    $180,$00a    ; Blau auf 10
  156.     dc.w    $5b07,$FFFE    ; überspringe 3 Zeilen
  157.     dc.w    $180,$00b    ; Blau auf 11
  158.     dc.w    $5e07,$FFFE    ; überspringe 3 Zeilen
  159.     dc.w    $180,$00c    ; Blau auf 12
  160.     dc.w    $6207,$FFFE    ; überspringe 4 Zeilen
  161.     dc.w    $180,$00d    ; Blau auf 13
  162.     dc.w    $6707,$FFFE    ; überspringe 5 Zeilen
  163.     dc.w    $180,$00e    ; Blau auf 14
  164.     dc.w    $6d07,$FFFE    ; überspringe 6 Zeilen
  165.     dc.w    $180,$00f    ; Blau auf 15
  166.     dc.w    $780f,$FFFE    ; Zeile $78
  167.     dc.w    $180,$000    ; Farbe SCHWARZ
  168.  
  169. BALKEN:
  170.     dc.w    $7907,$FFFE    ; Warte auf Zeile $79
  171.     dc.w    $180,$300    ; Beginne den roten Balken: Rot auf 3
  172.     dc.w    $7a07,$FFFE    ; nächste Zeile
  173.     dc.w    $180,$600    ; Rot auf 6
  174.     dc.w    $7b07,$FFFE
  175.     dc.w    $180,$900    ; Rot auf 9
  176.     dc.w    $7c07,$FFFE
  177.     dc.w    $180,$c00    ; Rot auf 12
  178.     dc.w    $7d07,$FFFE
  179.     dc.w    $180,$f00    ; Rot auf 15 (Maximum)
  180.     dc.w    $7e07,$FFFE
  181.     dc.w    $180,$c00    ; Rot auf 12
  182.     dc.w    $7f07,$FFFE
  183.     dc.w    $180,$900    ; Rot auf 9
  184.     dc.w    $8007,$FFFE
  185.     dc.w    $180,$600    ; Rot auf 6
  186.     dc.w    $8107,$FFFE
  187.     dc.w    $180,$300    ; Rot auf 3
  188.     dc.w    $8207,$FFFE
  189.     dc.w    $180,$000    ; Farbe SCHWARZ
  190.  
  191.     dc.w    $fd07,$FFFE    ; Warte auf Zeile $FD
  192.     dc.w    $180,$00a    ; Blau Intensität 10
  193.     dc.w    $fe07,$FFFE    ; nächste Zeile
  194.     dc.w    $180,$00f    ; Blau maximale Helligkeit (15)
  195.     dc.w    $FFFF,$FFFE    ; ENDE DER COPPERLIST
  196.  
  197.  
  198.     end
  199.  
  200. In diesem Beispiel wird die Routine BewegeCopper einmal  alle  drei  Frame
  201. ausgeführt,   also   einmal   alle   3   fünfzigstel   Sekunden,   um  die
  202. Geschwindigkeit  zu  reduzieren.  Verwendet  wurde   die   Strategie   der
  203. verschiedenen  Cmp  mit dem $dff006. Andererseits wirkt die Bewegung nicht
  204. mehr so flüßig, wie man an dem unteren Teil des Balkens an seinem  Ruckeln
  205. bemerkt.
  206.  
  207. Nun  ist  die Zeit gekommen, euch einige Tricks des Gewerbes beizubringen.
  208. Wenn lange Copperlist verändert  werden  müßen,  z.B.  alle  07  durch  87
  209. ersetzt  werden  müßen, dann kann der REPLACE-Befehl des Editors verwendet
  210. werden. Er ermöglicht uns, gewisse Strings  (Wörter,  Teile  von  Wörtern,
  211. Buchstabenreihen)  durch  andere  zu  ersetzen.  Um  die genannte Änderung
  212. vornehmen zu können, positioniert euch mit dem Cursor an  den  Anfang  der
  213. Copperlist,  dann  drückt zugleich die Tasten "AMIGA-SHIFT-R", und oben am
  214. Bildschirm  erscheint  die  Schrift  "Search  for:".  Hier  ist  der  Text
  215. einzugeben,   der   zu  ersetzten  ist,  danach  RETURN  In  unserem  FAll
  216. "07,$fffe". Nun erscheint "Replace with:". Hier kommt der  Text  hinein  ,
  217. der  an  Stelle  des vorher eingegebenen kommen soll, bei unserem Beispiel
  218. "87,$FFFE". Nun wird der Cursor zum ersten 70,$fffe springen, und es  wird
  219. die  Schrift  "Replace: (Y/N/L/G)" auftauchen. Nun muß entschieden werden,
  220. ob das 07 durch das 08 ersetzt werden soll. Wenn ja, drückt Y, wenn nicht,
  221. N.  Dieses beendet, wird der Cursor zum nächsten 07,$fffe springen und die
  222. Frage wiederholen. Ändert ruhig alle bis zum Ende der  Copperlist,  steigt
  223. dann aber mit ESC aus, um nicht auch die im darunterstehenden Text (diesem
  224. Text!) in Mitleidenschaft zu  ziehen.  Wenn  ihr  G  drückt,  werden  alle
  225. 07,$fffe im Text ausgetauscht, bis zum Ende. Denkt gut darüber nach, bevor
  226. ihr das G (GLOBAL) verwendet, ihr könntet etwas ändern, was ihr gar  nicht
  227. wolltet, einfach weil es aus dem Blickfeld war. Es ist besser, mit dem Y /
  228. N fortzufahren, bis man das Ende der interessierten Zone erreicht hat, und
  229. dann  mit  ESC  aussteigen,  oder  L  bei der letzten Änderung drücken, es
  230. bedeutet LOCALE, also LETZTE Änderung.
  231.  
  232. Einmal die Änderung vollbracht,  startet  das  Listing:  nun  werden  alle
  233. Farbüberläufe  in  der  Mitte  des  Balkens stattfinden, er wird irgendwie
  234. "Stufen" bekommen. Das ist die Folge dessen, weil wir die  Farbe  eben  in
  235. der Mitte des Bildschirmes ändern ($87) anstatt am Anfang (07).
  236.  
  237. Probiert  nun,  alles  nochmal  zu  verändern, indem ihr als Orginalstring
  238. "87,$ff" eingebt, und als zu ersetzender String "$67,$ff". Nun werden sich
  239. die  Stufen  weiter rechts befinden. Zum Schluß, macht noch diesen Effekt:
  240. Zur Zeit habt ihr alle Wait zu $67 verändert, gut. Versucht  nun,  sie  in
  241. $67  zu  verwandeln, aber bei der Abfrage, gebt einmal Y und einmal N ein,
  242. bis zum Ende. Jetzt wird eine Zeile bei $67 Farbe ändern, die  andere  bei
  243. $69, usw, es wird eine Art Ziegelmauer-Effekt geben:
  244.  
  245.     ooooooo+++++
  246.     oooo++++++++
  247.     oooooo++++++
  248.     oooo++++++++
  249.     oooooo++++++
  250.  
  251.  
  252.