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

  1.  
  2. ; Listing3g.s    ; BALKEN, DER LINKS-UND RECHTS GEHT, ERSTELLT MIT MOVE & WAIT
  3.         ; DES COPPERS
  4.  
  5.     SECTION CIPundCOP,CODE    ; auch Fast ist    OK
  6.  
  7. Anfang:
  8.     move.l    4.w,a6        ; Execbase in a6
  9.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  10.     lea    GfxName,a1  ; Adresse des Namen der zu öffnenden Library in a1
  11.     jsr    -$198(a6)   ; OpenLibrary, Routine der EXEC, die Libraris
  12.                 ; öffnet, und als Resultat in d0 die Basisadresse
  13.                 ; derselben Bibliothek liefert, ab welcher
  14.                 ; die Offsets (Distanzen) zu machen sind
  15.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  16.     move.l    d0,a6
  17.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  18.                   ; des Betriebssystemes (immer auf $26 nach
  19.                     ; GfxBase)
  20.     move.l    #COPPERLIST,$dff080  ; COP1LC - "Zeiger" auf unsere COP
  21.                      ; (deren Adresse)
  22.     move.w    d0,$dff088         ; COPJMP1 - Starten unsere COP
  23. mouse:
  24.     cmpi.b    #$ff,$dff006    ; VHPOSR - sind wir bei Zeile 255 angekommen?
  25.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  26.  
  27.  
  28.     bsr.w    CopperLinkRech    ; Routine für Links/Rechts Scroll
  29.  
  30. Warte:
  31.     cmpi.b    #$ff,$dff006 ; VHPOSR:
  32.                  ; Sind wir noch auf $FF? Wenn ja, warte auf die
  33.     beq.s    Warte         ; nächste Zeile (00). Ansonsten wird BewegeCopper
  34.  
  35.  
  36.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  37.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  38.  
  39.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  40.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  41.  
  42.     move.l    4.w,a6
  43.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  44.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  45.                 ; (Libraries werden geöffnet UND geschlossen!)
  46.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  47.     rts
  48.  
  49. ; Diese Routine operiert nicht auf dem ersten Byte links des Wait, also
  50. ; dem, das die Y-Position bestimmt, sondern auf dem zweiten, das der
  51. ; X-Position, das eine Verschiebung der Farbe von Links nach Rechts zur
  52. ; Folge hat. Dazu verwendet es zwei Falgs ähnlich dem RAUFRUNTER wie wir
  53. ; es schon gesehen haben, sie heißen GehLinks und GehRechts. Sie beinhalten
  54. ; die Anzahl, wie oft die jeweilige Routine schon aufgerufen wurde, um
  55. ; so die "Verschiebung" zu begrenzen (also um bestimmen zu könne, wie
  56. ; weit man vorwärts gehen muß, bevor man umdreht). Jedesmal, wenn die
  57. ; Routine GehRechts ausgeführt wird, wandert der graue Strich ein Stück
  58. ; nach rechts, wir müßen sie also stoppen, wenn wir den rechten Rand erreicht
  59. ; haben, in unserem Fall nach 85 Zyklen, und weitere 85 Schritte nach links
  60. ; gehen (GehLinks), dann sind wir wieder am Ausgangspunkt. Dieses Spielchen
  61. ; wird solange wiederholt, bis ein Mausklick alles stoppt.
  62. ; ZU BEMERKEN IST, DAß HIER ENTWEDER NACH GEHLINKS ODER GEHRECHTS VERZWEIGT
  63. ; WIRD, ES WERDEN NIE BEIDE ROUTINEN ZUGLEICH AUSGEFÜHRT. WENN GEHRECHTS
  64. ; AUSGEFÜHRT WIRD, DANN WIRD DIESE ROUTINE DURCHLAUFEN UND VON DEREN ENDE
  65. ; AUS ZUM MOUSE-ZYKLUS ZURÜCKGESPRUNGEN. DAS GLEICHE GILT FÜR GEHLINKS.
  66. ; WENN DER GEHLINKS/GEHRECHTS - ZYKLUS BEENDET IST (NACH 2*85 FRAMES)
  67. ; KEHREN WIR ZUM "MOUSE"-ZYKLUS ZURÜCK, DIREKT VOM RTS DER ROUTINE
  68. ; COPPERLINKRECH AUS, NACHDEM WIR DIE BEIDEN FLAGS AUF NULL GESETZT HABEN.
  69.  
  70. CopperLinkRech:
  71.     CMPI.W    #85,FlagRechts    ; GehRechts 85 Mal ausgeführt?
  72.     BNE.S    GehRechts    ; wenn nicht, wiederhole nochmal
  73.                 ; wenn es aber 85 Mal ausgeführt wurde,
  74.                 ; dann geh weiter
  75.  
  76.     CMPI.W    #85,FlagLinks    ; GehLinks 85 Mal ausgeführt?
  77.     BNE.S    GehLinks    ; wenn nicht, wiederhole nochmal
  78.  
  79.     CLR.W    FlagRechts    ; Die Routine GehLinks wurde 85 Mal ausge-
  80.     CLR.W    FlagLinks    ; führt, also ist zu diesem Zeitpunkt der
  81.                 ; graue Balken zurückgekommen und der Rechts-
  82.                 ; Links-Zyklus ist fertig. Wir löschen die
  83.                 ; zwei Falgs und steigen aus: beim nächsten
  84.                 ; FRAME wird GehRechts ausgeführt, nach 85
  85.                 ; Frame GehLinks 85 Mal, etcetera.
  86.     RTS            ; ZURÜCK ZUM MOUSE-LOOP
  87.  
  88.  
  89. GehRechts:             ; Diese Routine verschiebt den Balken nach RECHTS,
  90.     addq.b    #2,CopBar    ; indem es 2 zu der X-Koordinate des Wait addiert.
  91.     addq.w    #1,FlagRechts ; Verzeichnen, daß wir ein weiteres Mal GehRechts
  92.                ; durchlaufen haben: in FlagRechts steht die Anzahl,
  93.                ; wie oft diese Routine aufgerufen wurde.
  94.     RTS           ; Zurück zum Mouse-Loop
  95. GehLinks:            ; Diese Routine verschiebt den Balken nach LINKS,
  96.     subq.b    #2,CopBar    ; indem es 2 von der X-Koordinate des Wait
  97.                  ; subtrahiert.
  98.     addq.w    #1,FlagLinks ; Verzeichnen, daß wir ein weiteres Mal GehLinks
  99.                 ; durchlaufen haben: in FlagLinks steht die Anzahl,
  100.                 ; wie oft diese Routine aufgerufen wurde.
  101.     RTS            ; Zurück zum Mouse-Loop
  102.  
  103.  
  104. FlagRechts:        ; In diesem Word wird die Anzahl festgehalten,
  105.     dc.w    0    ; wie oft GehRechts ausgeführt wurde
  106.  
  107. FlagLinks:        ; In diesem Word wird die Anzahl festgehalten,
  108.     dc.w    0    ; wie oft GehLinks ausgeführt wurde
  109.  
  110.  
  111. GfxName:
  112.     dc.b    "graphics.library",0,0    ; Bemerkung: um Charakter in den
  113.                     ; Speicher zu geben, verwenden wir
  114.                     ; immer das dc.b und setzen sie
  115.                     ; unter "" oder '', Abschluß mit ,0
  116.  
  117.  
  118. GfxBase:       ; Hier hinein kommt die Basisadresse der graphics.library,
  119.     dc.l    0  ; ab hier werden die Offsets gemacht
  120.  
  121.  
  122.  
  123. OldCop:           ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  124.     dc.l    0  ; Betriebssystemes
  125.  
  126.  
  127.     SECTION GRAPHIC,DATA_C    ; Dieser Befehl veranlaßt das Betriebssystem,
  128.                 ; das folgende Datensegment in die CHIP-RAM
  129.                 ; zu laden, obligatorisch.
  130.                 ; Die Cpperlist MÜSSEN in die CHIP RAM!
  131.  
  132.  
  133. COPPERLIST:
  134.     dc.w    $100,$200    ; BPLCON0
  135.     dc.w    $180,$000    ; COLOR0 - Beginne die Cop mit SCHWARZ
  136.  
  137.  
  138.     dc.w    $9007,$fffe    ; Warte Anfang der Zeile $90 ab
  139.     dc.w    $180,$AAA    ; Farbe Grau
  140.  
  141. ; Hier haben wir das erste Word des WAIT $9031 in 2 Bytes "zerrissen", um
  142. ; ein Label (CopBar) dazwischen einfügen zu können, das uns das zweite Byte
  143. ; markiert, also $31 (LA XX)
  144.  
  145.     dc.b    $90        ; POSIZION YY des WAIT (erstes Byte des WAIT)
  146. CopBar:
  147.     dc.b    $31        ; POSITION XX des WAIT (das ändern wir!)
  148.     dc.w    $fffe        ; wait - (wird $9033,$FFFE - $9035,$FFFE....)
  149.  
  150.     dc.w    $180,$700    ; Farbe ROT, das immer weiter rechts starten
  151.                 ; wird, vorangegangen vom Grau, das dement-
  152.                 ; sprechend mitgehen wird
  153.     dc.w    $9107,$fffe ; wait, das nicht geändert wird. (Beginn Zeile $91)
  154.     dc.w    $180,$000   ; wird gebraucht, um die Farbe in Schwarz zu ändern
  155.                 ; (nach dem kleinen Balken).
  156.  
  157. ;    Wie ihr seht, braucht es für die Zeile $90 zwei Wait, eines, das den
  158. ;    Anfang der Zeile abwartet (07), und eines, das modifiziert wird (31),
  159. ;    um definieren zu können, ab wo der Strich Farbe ändert, also vom Grau
  160. ;    ab Position 07 zu Rot.
  161.  
  162.     dc.w    $FFFF,$FFFE    ; ENDE DER COPPERLIST
  163.  
  164.     end
  165.  
  166. Schön, gell? Ein  Effekt  von  diesem  Typ  wird  meistens  verwendet,  um
  167. EquilizerEffekte  bei Musik zu generieren. Das Verschieben in horizontaler
  168. Richtung hat aber ein Limit,  es  können  nur  ungerade  Werte  eingegeben
  169. werden,  das ist auch der Grund, wieso wir immer Zeile $yy07 abwarten, und
  170. nicht z.B. $yy08. Als Konsequenz davon kann man nur  in  Schritten  von  2
  171. Pixel jedesmal gehen: 7, 9, $b, $d, $f, $11, $13... oder in Schritten zu 4
  172. Pixel, 8 Schritten, Hauptsache, man hält sich  an  die  ungeraden  Zahlen,
  173. oder  man  riskiert,  den Amiga zum Explodieren zu bringen! Bemerkung: der
  174. maximale Wert von XX  ist  $e1.  Als  Änderungen  kann  ich  euch  diesmal
  175. eigentlich  nur vorschlagen, in 4er oder 8er Schritten zu gehen, indem ihr
  176. 4 oder 8 an Stelle der 2 dazuzählt. Somit änder sich  natürlich  auch  die
  177. Geschwindigkeit.  Vergesst  nicht,  auch die Anzahl zu ändern, wie oft die
  178. Routinen durchgeführt werden sollen:
  179.  
  180.  
  181.     CMPI.W    #85/2,FlagRechts    ; 85 Mal /2, also "geteilt durch 2"
  182.     BNE.S    GehRechts
  183.     CMPI.W    #85/2,FlagLinks    ; 85/2, also 42 Mal
  184.     BNE.S    GehLinks        ; wenn noch nicht, dann nochmal...
  185.     ....
  186.  
  187.     addq.b    #4,(a0)        ; 4 dazu....
  188.     ....
  189.  
  190. Oder, für ein addq.b #8,a0:
  191.  
  192.     CMPI.W    #85/4,FlagRechts    ; 85 Mal /4, also 21
  193.  
  194.  
  195. Wenn ihr Sadisten seid, könnt ihr versuchen, ein addq.b #1,(a0) zu setzen,
  196. und  somit auch gerade Wait XX erzeugen.... Bestenfalls "verschwindet" der
  197. Bildschirm,  wenn  ein  ungerades  XX  eintritt,  oder,  wenn  auf   einen
  198. exotischen  Wert  gewaitet  wird,  dann  kann schon mal ein totaler Streik
  199. eintreten, eine Art "GURU MEDITATION" des Copper. Seid also  vorsichtig!!!
  200. Ich  kann  euch  einige  "Spezialkoordinaten" verraten, die sich nicht nur
  201. darauf beschränken, den Bildschirm zum Verschwinden  zu  bringen,  sondern
  202. wirklich  den  Copper  ins  Nirwana  schicken,  und euch zum Reset zwingen
  203. (zumindest auf dem A1200, wo ich es ausprobiert habe).
  204.  
  205.     dc.w    $79DC,$FFFE    ; $dc = 220! Gerade uns besonders BÖSE!
  206.                 ; er bringt den Copper um den Verstand,
  207.                 ; blockiert aber nicht das System. Ihr könnt
  208.                 ; weiterarbeiten wenn auch "im Dunkeln",
  209.                 ; ohne was zu sehen
  210.  
  211.     dc.w    $0100,$FFFE    ; das hingegen BLOCKIERT alles, man kann nicht
  212.                 ; mal vom Programm aussteigen, ein Reset ist
  213.                 ; das einzige Heilmittel
  214.  
  215.     dc.w    $0300,$FFFE    ; Weiterer Totalabsturz...
  216.  
  217.  
  218. Diese "Fehler" können von Vorteil sein, wenn ihr Programme schützen wollt,
  219. die  schlecht  kopiert wurden oder ein falsches Password eingegeben wurde.
  220. Einfach eine  Copperlist  mit  diesen  Wait  ansteuern  und  der  Computer
  221. BLOCKIERT  schlimmer als mit einem GURU des 68000, und jedes Action Replay
  222. oder  anderes  Cartridge   sind   nutzlos.   Oder   man   kann   sie   als
  223. SELBSTZERSTÖRUNG   verwenden,  wer  weiß,  ob  der  Computer  PHYSIKALISCH
  224. zerstört wird, wenn man viele solcher Fehler hintereinander schaltet???
  225.  
  226. Bemerkung: Ihr könnt einen Effekt wie diesen auch mit Listing3c.s erzielen,
  227. wenn ihr es folgendermaßern modifiziert:
  228.  
  229.  
  230. BewegeCopper:
  231.     cmpi.b    #$fc,BALKEN    ; Sind wir bei Zeile $fc angekommen?
  232.     beq.s    Ende        ; wenn ja, sind wir unten und stoppen
  233.     addq.b    #1,BALKEN    ; WAIT 1 geändert, der Balken sinkt um 1 Zeile
  234. Ende:
  235.     rts
  236.  
  237. Auf diese Art, indem ihr  ihm  also  Position  XX  anstatt  YY  (BALKEN+1)
  238. ändert,  und ihr ihn um 2 statt um 1 weiterdreht (ungerade Zahl!), ohne zu
  239. vergessen, daß der maximale Wert $e1 ist (auszutauschen mit dem $fc)
  240.  
  241. BewegeCopper:
  242.     cmpi.b    #$e1,BALKEN+1    ; Sind wir bei Zeile $e1 angekommen?
  243.     beq.s    Ende        ; wenn ja, sind wir unten und stoppen
  244.     addq.b    #2,BALKEN+1    ; WAIT 2 geändert, der Balken sinkt um 2 Zeile
  245. Ende:
  246.     rts
  247.  
  248.  
  249. werdet  ihr die erste Zeile nach rechts wandern sehen, anstatt nach unten.
  250. Um diesen Effekt hervorzuheben, könnt ihr die Zeile $79 "isolieren", indem
  251. ihr  ab dort den Bildschirm blau werden laßt, also ab $7a. Fügt diese zwei
  252. Zeilen vor dem Ende der Copperlist dazu:
  253.  
  254.     dc.w    $7a07,$FFFE    ; Warte auf Zeile $79
  255.     dc.w    $180,$004    ; Beginne die blaue Zone : Blau auf 4
  256.  
  257. In Listing3g.s werden die Schwierigkeiten vor allem in der Routine liegen,
  258. die den Balken vor- und zurückwandern läßt, vielmahr als an der  Tatsache,
  259. daß  wir die YY-Positionen ändern, an Stelle der XX. Die letzten Listings,
  260. die ihr gerade bewältigt habt,  beinhalten  68000er  Routinen,  die  nicht
  261. grade ganz banal sind, aber unbedingt notwendig, um Effekte mit dem Copper
  262. erzeugen zu können, und somit den Copper selbst verstehen  zu  lernen.  In
  263. Lektion4  werden  die  Routinen auch noch einfacher sein als die in diesem
  264. Kapitel, da wir nur das Anzeigen von statischen Bildern behandeln  werden.
  265. Wenn  ihr im Moment also noch nicht alles ganz verstanden habt, dann fahrt
  266. ruhig mit Kapitel 4 fort, und kommt später hierauf zurück,  wenn  ihr  mit
  267. den  Routinen  bessert  vertraut sein werdet. Listing3h.s ist ein Ausbauen
  268. des Listings 3g.s
  269.  
  270.