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

  1.  
  2. ; Listing3c.s    ; BALKEN, DER SINKT, ERSTELLT MIT EINEM MOVE&WAIT DES COPPER
  3.         ; (UM IHN ZUM SINKEN ZU BRINGEN RECHTE MAUSTASTE)
  4.  
  5.     SECTION    ZWEITECOP,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.     btst    #2,$dff016    ; POTINP - Rechte Maustaste gedrückt?
  28.     bne.s    Warte        ; Wenn nicht, führe BEWEGECOPPER nicht aus
  29.  
  30.     bsr.s    BewegeCopper    ; Die erste Bewegung am Bildschirm!!!!
  31.                 ; Diese Subroutine läßt das WAIT sinken!
  32.                 ; Sie wird einmal pro Frame ausgeführt, denn
  33.                 ; das bsr.s BewegeCopper führt die Routine
  34.                 ; BewegeCopper aus, und wenn sie beendet ist
  35.                 ; (mit einem RTS), dann kommt der 68000 hier
  36.                 ; zurück und führt Routine Warte aus, und so
  37.                 ; weiter.
  38.  
  39.  
  40. Warte:                ; Wenn wir uns noch auf Zeile $ff befinden, auf
  41.                 ; die wir vorhin gewartet haben, dann geh nicht
  42.                 ; weiter.
  43.  
  44.     cmpi.b    #$ff,$dff006 ; Sind wir noch auf $FF? Wenn ja, warte auf die
  45.     beq.s    Warte         ; nächste Zeile (00). Ansonsten wird BewegeCopper
  46.               ; wiederausgeführt. Dieses Problem besteht nur
  47.             ; bei sehr kurzen und folglich schnellen Routinen,
  48.             ; die in weniger als einem "Pinselstrich" (Rasterline)
  49.             ; ausgeführt werden können: Der mouse-Zyklus wartet
  50.             ; auf Zeile $FF, danach wird BewegeCopper ausgeführt,
  51.             ; aber wenn es zu schnell geht, dann befinden wir uns
  52.             ; noch auf Zeile $FF und wenn wir zur Maus zurückkehren
  53.             ; sind wir ja auf $ff, und alles wird nochmals
  54.             ; durchlaufen, und das öfter als einmal pro Frame!
  55.             ; Also würde die Routine öfters als einmal pro
  56.             ; FRAME aufgerufen! Vor allem auf A4000ern"
  57.             ; Diese Kontrolle fängt dieses Problem ab, indem
  58.             ; es auf die nächste Zeile wartet, bevor es zu
  59.             ; mouse: zurückkehrt. Um die Zeile $FF abzuwarten ist
  60.             ; die klassische 50stel Sekunde erforderlich.
  61.             ; Bemerkung: Alle Monitor und Fernseher erstellen
  62.             ; das Bild gleichschnell, während ein Computer sich
  63.             ; von einem anderen durch Prozessorgeschwindigkeit
  64.             ; u.ä. unterscheidet. Das ist der Grund, warum Progr.,
  65.             ; die mit dem $dff006 getimet sind, auf einem
  66.             ; A500 gleich schnell laufen wie auf einem A4000.
  67.             ; Das Timing wird später noch genauer behandelt,
  68.             ; im Moment versuchen wir, den Copper zu verstehen.
  69.  
  70.  
  71.  
  72.     btst    #6,$bfe001     ; linke Maustaste gedrückt?
  73.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  74.  
  75.     move.l    OldCop(PC),$dff080  ; COP1LC - "Zeiger" auf die Orginal-COP
  76.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  77.  
  78.     move.l    4.w,a6
  79.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  80.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  81.                 ; (Libraries werden geöffnet UND geschlossen!!)
  82.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  83.     rts    
  84.  
  85. ;
  86. ;    Diese kleine Routine bringt das Wait des Copper zum sinken, indem es
  87. ;    erhöht wird, bei der ersten Ausführung wird das
  88. ;
  89. ;    dc.w    $2007,$FFFE    ; Warte auf Zeile $20
  90. ;
  91. ;    so verändert werden:
  92. ;
  93. ;    dc.w    $2107,$FFFE    ; Warte auf Zeile $21! (Dannn $22,$23 ecc.)
  94. ;
  95. ;    BEmerkung: Hat man einmal den Maximalwert eines Bytes erreicht, also
  96. ;          $FF, dann wird bei einem weiterem ADDQ.B #1,BALKEN alles
  97. ;          wieder bei 0 starten, bis es $FF erreicht usw.
  98.  
  99. BewegeCopper:
  100.     addq.b    #1,BALKEN     ; WAIT 1 verändert, Balken sinkt un eine Zeile
  101.     rts
  102.  
  103. ; Probiert das ADDQ durch ein SUBQ zu ersetzen, und der Balken wir steigen!!!!
  104.  
  105. ; Probiert,das addq/subq #1,BALKEN durch #2 , #3 oder mehr zu ersetzen,
  106. ; ihr werdet somit die Geschwingigkeit verändern, der Balken wird um 2 bzw.
  107. ; 3 oder mehr Zeilen pro Frame rauf oder runtergehen.
  108. ; (Für Zahlen größer als 8 muß statt einem ADDQ.B ein ADD.B verwendet werden)
  109.  
  110.  
  111. ;    DATEN...
  112.  
  113.  
  114. GfxName:
  115.     dc.b    "graphics.library",0,0    ; Bemerkung: um Charakter in den
  116.                     ; Speicher zu geben, verwenden wir
  117.                     ; immer das dc.b und setzen sie
  118.                     ; unter "" oder ´´, Abschluß mit ,0
  119.  
  120.  
  121. GfxBase:       ; Hier hinein kommt die Basisadresse der graphics.library,
  122.     dc.l    0  ; ab hier werden die Offsets gemacht
  123.  
  124.  
  125.  
  126. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  127.     dc.l    0    ; Betriebssystemes
  128.  
  129.  
  130.     SECTION GRAPHIC,DATA_C    ; Dieser Befehl veranlaßt das Betriebssystem,
  131.                 ; das folgende Datensegment in die CHIP-RAM
  132.                 ; zu laden, obligatorisch.
  133.                 ; Die Cpperlist MÜSSEN in die CHIP RAM!
  134.  
  135. COPPERLIST:
  136.     dc.w    $100,$200    ; BPLCON0 - keine Bitplanes, nur Hintergrund
  137.     dc.w    $180,$004    ; COLOR0 - Beginne die COP mit DUNKELBLAU
  138.  
  139. BALKEN:
  140.     dc.w    $7907,$FFFE    ; WAIT - Warte auf Zeile $79
  141.     dc.w    $180,$600    ; COLOR0 - Hier beginnt die rote Zone:
  142.                 ; ROT auf 6
  143.     dc.w    $FFFF,$FFFE    ; ENDE DER COPPERLIST
  144.  
  145.     end
  146.  
  147. Ahh! Ich habe das (PC) beim "lea GfxName,a1"  vergessen,  aber  nun  ist´s
  148. dran. Wem aufgefallen ist, daß es gesetzt werden konnte, der bekommt einen
  149. Pluspunkt.  In  diesem  Programm  wird  eine  mit   dem   Elektronenstrahl
  150. synchronisierte  Bewegung  erzeugt,  und  siehe da, der Balken bewegt sich
  151. flüßig nach unten.
  152.  
  153. Bemerkung1: In diesem Listing kann  einen  die  Struktur  des  Zyklus  des
  154. Maustests,    kombiniert   mit   dem   Test   der   Position   des   Beams
  155. (Elektronenstrahls) ein wenig verwirren. Das, was ihr verstehen müßt, ist,
  156. daß die Routinen, oder Subroutinen, die zwischen Mouse: und Warte: stehen,
  157. ein  mal  Pro  BildschirmFrame  ausgeführt  werden.  Probiert  das   bsr.s
  158. BewegeCopper   durch  die  Routine  selbst  zu  ersetzen,  ohne  dem  RTS,
  159. klarerweise:
  160.  
  161. mouse:     
  162.     cmpi.b    #$ff,$dff006    ; VHPOSR - sind wir bei Zeile 255 angekommen?
  163.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  164.  
  165.  
  166. ;    bsr.s    BewegeCopper    ; Diese Routine wird einmal pro Fotogramm
  167. ;                ; ausgeführt (damit´s flüßig wirkt).
  168.  
  169.     addq.b    #1,BALKEN
  170.  
  171. Warte:                ; Wenn wir uns noch auf Zeile $ff befinden, auf
  172.                 ; die wir vorhin gewartet haben, dann geh nicht
  173.                 ; weiter.
  174.  
  175.     cmpi.b    #$ff,$dff006    ; Sind wir noch auf $FF? Wenn ja, warte auf die
  176.     beq.s    Warte
  177.  
  178. In diesem Fall ändert sich nichts am Resultat, denn  statt  das  addq  als
  179. Subroutine  auszuführen, wird es direkt geschrieben, und vielleicht ist es
  180. in dieser Situation  auch  bequemer;  aber  wenn  die  Subroutinen  länder
  181. werden,  dann  rentiert  sich ein BSR auf jeden Fall, wenn man nicht total
  182. die Übersicht  verlieren  will.  Wenn  ihr  z.B.  das  bsr.s  BewegeCopper
  183. verdoppelt,  dann  wird die Routine zwei Mal pro Frame aufgerufen, und die
  184. Geschwindigkeit verdoppelt sich:
  185.  
  186.     bsr.s    BewegeCopper    ; Routine, die einmal pro Frame ausgeführt wird
  187.     bsr.s    BewegeCopper    ; Routine, die einmal pro Frame ausgeführt wird
  188.  
  189. Der Nutzen der Subroutinen liegt  genau  darin,  das  Programm  klarer  zu
  190. gestalten,  stellt  euch vor, die Routinen, die zwischen Mouse: und Warte:
  191. liegen, seien tausende von Zeilen lang! Man würde  wohl  den  Zusammenhang
  192. verlieren.  Wenn  wir aber jede Routine mit Namen aufrufen, dann gestaltet
  193. sich alles viel leichter.
  194.  
  195. *
  196.  
  197. Um den Balken sinken  zu  lassen,  brauchen  wir  nur  die  Copperlist  zu
  198. verändern,  in diesem spezifischen Beispiel wird das WAIT in seinem ersten
  199. Byte verändert, also dem,  das  die  vertikale  Linie  definiert,  die  es
  200. abzuwarten gilt:
  201.  
  202. BALKEN:
  203.  
  204.     dc.w    $7907,$FFFE    ; WAIT - Warte auf Zeile $79
  205.  
  206.     dc.w    $180,$600    ; COLOR0 - Hier beginnt die rote Zone : ROT auf 6
  207.  
  208. Durch setzen eines  Label  vor  diesem  Byte  kann  auf  das  Byte  selbst
  209. zugegriffen werden, wenn man auf dem Label agiert, in diesem Fall BALKEN.
  210.  
  211. Änderungen:  Versucht  die Farbe zu ändern, anstatt das Wait: ihr müßt nur
  212. ein Label in in der Copperlist setzen, wo ihr wollt, und ihr könnt ändern,
  213. was euch gefällt. Gebt BALKEN zur Farbe, wie hier gezeigt:
  214.  
  215.  
  216. COPPERLIST:
  217.     dc.w    $100,$200    ; BPLCON0 - keine Bitplanes, nur Hintergrund
  218.     dc.w    $180,$004    ; COLOR0 - Beginne die COP mit DUNKELBLAU
  219.  
  220. ;;;;BALKEN:
  221.     dc.w    $7907,$FFFE    ; WAIT - Warte auf Zeile $79
  222.     dc.w    $180        ; COLOR0
  223. BALKEN:             ; *** NEUE LABEL BEIM WERT DER FARBE
  224.     dc.w    $600        ; Beginn der roten Zone : Rot auf 6
  225.     dc.w    $FFFF,$FFFE    ; ENDE DER COPPERLIST
  226.         
  227. Wir werden eine Änderung der  Intensität  des  Rotes  erhalten,  denn  wir
  228. ändern des ersten Bytes links der Farbe: $0RGB, also $0R, also ROT!!!
  229.  
  230. Probiert nun, auf das ganze Word der Farbe zuzugreifen: ändert die Routine
  231. so:
  232.  
  233.     addq.w  #1,BALKEN    ; statt .B setzen wir .W
  234.     rts
  235.  
  236. Testet es, und ihr werdet bemerken, daß  die  Farben  sich  unregelmäßigen
  237. folgen,  denn  es wird die ganze Zahl verändert: $601, $602...$631, $632..
  238. Dadurch werden nicht geordnete Farben generiert.
  239.  
  240. Bemerkung: Der Befehl  dc.b  gibt  Bytes,  Words  oder  Longwords  in  den
  241. Speicher, deswegen erhält man das gleiche Resultat durch:
  242.  
  243.     dc.w    $180,$600    ; COLOR0
  244.  
  245.     oder:
  246.  
  247.     dc.w    $180    ; Register COLOR0
  248.     dc.w    $600    ; Wert von COLOR0
  249.     
  250. Es gibt keine Schwierigkeiten mit der Syntax wie bei einem Move.
  251.  
  252.  
  253.