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

  1.  
  2. ; Lezione3h.s    LINKS-RECHTS-SCROLL MIT MOVE&WAIT DES COPPER
  3.  
  4.     SECTION CIPundCOP,CODE    ; auch Fast ist    OK
  5.  
  6. Anfang:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  9.     lea    GfxName,a1  ; Adresse des Namen der zu öffnenden Library in a1
  10.     jsr    -$198(a6)   ; OpenLibrary, Routine der EXEC, die Libraris
  11.                 ; öffnet, und als Resultat in d0 die Basisadresse
  12.                 ; derselben Bibliothek liefert, ab welcher
  13.                 ; die Offsets (Distanzen) zu machen sind
  14.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  15.     move.l    d0,a6
  16.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  17.                   ; des Betriebssystemes (immer auf $26 nach
  18.                     ; GfxBase)
  19.     move.l    #COPPERLIST,$dff080 ; COP1LC - "Zeiger" auf unsere COP
  20.                     ; (deren Adresse)
  21.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  22. mouse:    
  23.     cmpi.b    #$ff,$dff006    ; VHPOSR - sind wir bei Zeile 255 angekommen?
  24.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  25.  
  26.  
  27.     bsr.w    CopperLinkRech    ; Routine für Links/Rechts Scroll
  28.  
  29. Warte:
  30.     cmpi.b    #$ff,$dff006 ; VHPOSR:
  31.                  ; Sind wir noch auf $FF? Wenn ja, warte auf die
  32.     beq.s    Warte         ; nächste Zeile (00). Ansonsten wird BewegeCopper
  33.  
  34.  
  35.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  36.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  37.  
  38.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  39.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  40.  
  41.     move.l    4.w,a6
  42.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  43.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  44.                 ; (Libraries werden geöffnet UND geschlossen!)
  45.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  46.     rts
  47.  
  48. ; Die Routine ist die gleiche wie in Listing3g.s, mit dem einzigen Unterschied,
  49. ; daß 29 Wait statt einem mit einem DBRA-Loop verändert werden, das zu einem
  50. ; Wait springt, es ändert, zum Nächsten, es ändert usw.
  51.     
  52. CopperLinkRech:
  53.     CMPI.W    #85,FlagRechts        ; GehRechts 85 Mal ausgeführt?
  54.     BNE.S    GehRechts        ; wenn nicht, wiederhole nochmal
  55.                     ; wenn es aber 85 Mal ausgeführt wurde,
  56.                     ; dann geh weiter
  57.  
  58.     CMPI.W    #85,FlagLinks    ; GehLinks 85 Mal ausgeführt?
  59.     BNE.S    GehLinks    ; wenn nicht, wiederhole nochmal
  60.  
  61.     CLR.W    FlagRechts ; Die Routine GehLinks wurde 85 Mal ausge-
  62.     CLR.W    FlagLinks  ; führt, also ist zu diesem Zeitpunkt der
  63.                ; graue Balken zurückgekommen und der Rechts-
  64.                ; Links-Zyklus ist fertig. Wir löschen die
  65.                ; zwei Falgs und steigen aus: beim nächsten FRAME
  66.                ; wird GehRechts ausgeführt, nach 85 Frame
  67.                ; GehLinks 85 Mal, etcetera.
  68.     RTS           ; ZURÜCK ZUM MOUSE-LOOP
  69.     
  70. GehRechts:            ; Diese Routine bewegt den Balken nach RECHTS
  71.     lea    CopBar+1,A0    ; Wir geben in A0 die Adresse des ersten XX-
  72.                 ; Wertes des ersten Wait, das sich genau 1 Byte
  73.                 ; nach CopBar befindet
  74.  
  75.     move.w    #29-1,D2    ; wir müßen 29 Wait verändern (verwenden ein DBRA)
  76. RechtsLoop:
  77.     addq.b    #2,(a0)        ; zählen 2 zu der X-Koordinate des Wait dazu
  78.     ADD.W    #16,a0        ; gehen zum nächsten Wait, das zu ändern ist
  79.     dbra    D2,RechtsLoop   ; Zyklus wird d2-Mal durchlaufen
  80.     addq.w    #1,FlagRechts   ; vermerken,daß wir ein weiteres Mal GehRechts 
  81.                  ; ausgeführt haben
  82.                 ; GehRechts: in FlagRechts steht die Anzahl,
  83.                 ; wie oft wir GehRechts ausgeführt haben
  84.     RTS            ; Zurück zum Mouse-Loop
  85.  
  86.  
  87. GehLinks:            ; diese Routine bewegt den Balken nach LINKS
  88.     lea    CopBar+1,A0
  89.     move.w    #29-1,D2    ; wir müßen 29 Wait verändern
  90. LinksLoop:
  91.     subq.b    #2,(a0)       ; ziehen der X-Koordinate des Wait 2 ab
  92.     ADD.W    #16,a0       ; gehen zum nächsten Wait über, das zu verändern ist
  93.     dbra    D2,LinksLoop ; Zyklus wird d2-Mal durchgeführt
  94.     addq.w    #1,FlagLinks ; Zählen 1 zur Anzahl dazu, wie oft diese Routine
  95.                   ; GehLinks ausgeführt wurde
  96.     RTS               ; Zurück zum Mouse-Loop
  97.  
  98. ; Achtet auf etwas: wir ändern nur jedes zweite Wait, nicht alle Wait.
  99. ; Wir ändern hier nur die Hälfte, im Gegensatz zum Balken, der steigt und
  100. ; sinkt, wo ein Wait pro Zeile reicht:
  101. ;
  102. ;    dc.w    $YY07,$FFFE    ; Wait Zeile YY, Anfang der Zeile (07)
  103. ;    dc.w    $180,$0RGB    ; Farbe...
  104. ;    dc.w    $YY07,$FFFE    ; Wait Zeile YY, Anfang der Zeile (07)
  105. ;    ...
  106. ;
  107. ; In diesem Fall müßen wir zwei Wait pro Zeile schreiben,also eins für den
  108. ; Anfang der Zeile, und eins, das in dieser Zeile nach links-rechts läuft:
  109. ;
  110. ;    dc.w    $YY07,$FFFE    ; Wait Zeile YY, Anfang der Zeile (07)
  111. ;    dc.w    $180,$0RGB    ; Farbe GRAU
  112. ;    dc.w    $YYXX,$FFFE    ; Wait Zeile YY, auf horizontaler Position,
  113. ;                ; die wir entscheiden, lassen das GRAU
  114. ;                ; gegenüber dem ROT vorrücken.
  115. ;    dc.w    $180,$0RGB    ; ROT
  116.  
  117.  
  118. FlagRechts:        ; In diesem Word wird die Anzahl festgehalten,
  119.     dc.w    0    ; wie oft GehRechts ausgeführt wurde
  120.  
  121. FlagLinks:        ; In diesem Word wird die Anzahl festgehalten,
  122.     dc.w    0    ; wie oft GehLinks ausgeführt wurde
  123.  
  124.  
  125.  
  126. GfxName:
  127.     dc.b    "graphics.library",0,0  ; Bemerkung: um Charakter in den
  128.                     ; Speicher zu geben, verwenden wir
  129.                     ; immer das dc.b und setzen sie
  130.                     ; unter "" oder '', Abschluß mit ,0
  131.  
  132.  
  133. GfxBase:      ; Hier hinein kommt die Basisadresse der graphics.library,
  134.     dc.l    0 ; ab hier werden die Offsets gemacht
  135.  
  136.  
  137.  
  138. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  139.     dc.l    0    ; Betriebssystemes
  140.  
  141.  
  142.     SECTION GRAPHIC,DATA_C  ; Dieser Befehl veranlaßt das Betriebssystem,
  143.                 ; das folgende Datensegment in die CHIP-RAM
  144.                 ; zu laden, obligatorisch.
  145.                 ; Die Cpperlist MÜSSEN in die CHIP RAM!
  146.  
  147.  
  148. COPPERLIST:
  149.     dc.w    $100,$200    ; BPLCON0
  150.     dc.w    $180,$000    ; COLOR0 - Beginne die Cop mit SCHWARZ
  151.  
  152.     dc.w    $2c07,$FFFE    ; WAIT - ein kleiner, fixer Balken in Grün
  153.     dc.w    $180,$010    ; COLOR0
  154.     dc.w    $2d07,$FFFE    ; WAIT
  155.     dc.w    $180,$020    ; COLOR0
  156.     dc.w    $2e07,$FFFE    ; WAIT
  157.     dc.w    $180,$030    ; COLOR0
  158.     dc.w    $2f07,$FFFE    ; WAIT
  159.     dc.w    $180,$040    ; COLOR0
  160.     dc.w    $3007,$FFFE
  161.     dc.w    $180,$030
  162.     dc.w    $3107,$FFFE
  163.     dc.w    $180,$020
  164.     dc.w    $3207,$FFFE
  165.     dc.w    $180,$010
  166.     dc.w    $3307,$FFFE
  167.     dc.w    $180,$000
  168.  
  169.  
  170.     dc.w    $9007,$fffe    ; Warten auf den Beginn der Zeile
  171.     dc.w    $180,$000    ; Grau auf Minimum, also SCHWARZ!
  172. CopBar:
  173.     dc.w    $9031,$fffe ; Wait, das geändert wird ($9033,$9035,$9037...)
  174.     dc.w    $180,$100   ; Farbe Rot, die immer weiter rechts beginnen
  175.                 ; wird, vorangegangen vom Grau, das dementsprechend
  176.                 ; fortschreiten wird
  177.     dc.w    $9107,$fffe ; Wait, das nicht geändert wird (Beginn der Zeile)
  178.     dc.w    $180,$111   ; Farbe GRAU (startet beim Beginn der Zeile bis
  179.     dc.w    $9131,$fffe ; zu diesem WAIT, das wir nicht ändern werden...
  180.     dc.w    $180,$200   ; danach beginnt das ROT
  181.  
  182. ;    wir fahren fort, aber platzsparend. Beachtet das Schema:
  183.  
  184. ; Bemerke: mit einem "dc.w $1234" geben wir 1 Word in den Speicher, mit
  185. ; "dc.w $1234,$1234"
  186. ; hingegen zwei Word hintereinander, also ein Longword "dc.l $12341234"
  187. ; das auch folgends in den Speicher kommen konnte:
  188. ; "dc.b $12,$34,$12,$34", folglich können wir auch 8 oder mehr Words mit
  189. ;  nur einem dc.w in den Speicher geben!
  190. ; Z.B. die Zeile 3 könnte mit einem dc.l so umgeschrieben werdencon:
  191. ;    dc.l    $9207fffe,$1800222,$9231fffe,$1800300   also:
  192. ;    dc.l    $9207fffe,$01800222,$9231fffe,$01800300 mit den
  193. ;        *anfänglichen* Nullen
  194. ; Paßt auf diese Anfangsnullen auf! Ein  dc.w $0180 schreibe ich als
  195. ; dc.w $180, weil es so einfach bequemer ist, aber die NULL existiert,
  196. ; das muß beachtet werden!
  197. ; Um alles noch klarer zu gestalten, die Zeile 3 würde mitsamt ihren Nullen
  198. ; so aussehen:
  199. ;    dc.w    $9207,$fffe,$0180,$0222,$9231,$fffe,$0180,$0300 (1 Word =$xxxx)
  200. ; Praktisch gesehen, kann man die "unnützen" Nullen des .b, .w, .l als
  201. ; Optional hinschreiben
  202. ;
  203. ;        FIXE WAIT (dann Grau)-VERÄNDERB. WAIT (gefolgt vom Rot)
  204.  
  205.     dc.w    $9207,$fffe,$180,$222,$9231,$fffe,$180,$300 ; Zeile 3
  206.     dc.w    $9307,$fffe,$180,$333,$9331,$fffe,$180,$400 ; Zeile 4
  207.     dc.w    $9407,$fffe,$180,$444,$9431,$fffe,$180,$500 ; Zeile 5
  208.     dc.w    $9507,$fffe,$180,$555,$9531,$fffe,$180,$600 ; ....
  209.     dc.w    $9607,$fffe,$180,$666,$9631,$fffe,$180,$700
  210.     dc.w    $9707,$fffe,$180,$777,$9731,$fffe,$180,$800
  211.     dc.w    $9807,$fffe,$180,$888,$9831,$fffe,$180,$900
  212.     dc.w    $9907,$fffe,$180,$999,$9931,$fffe,$180,$a00
  213.     dc.w    $9a07,$fffe,$180,$aaa,$9a31,$fffe,$180,$b00
  214.     dc.w    $9b07,$fffe,$180,$bbb,$9b31,$fffe,$180,$c00
  215.     dc.w    $9c07,$fffe,$180,$ccc,$9c31,$fffe,$180,$d00
  216.     dc.w    $9d07,$fffe,$180,$ddd,$9d31,$fffe,$180,$e00
  217.     dc.w    $9e07,$fffe,$180,$eee,$9e31,$fffe,$180,$f00
  218.     dc.w    $9f07,$fffe,$180,$fff,$9f31,$fffe,$180,$e00
  219.     dc.w    $a007,$fffe,$180,$eee,$a031,$fffe,$180,$d00
  220.     dc.w    $a107,$fffe,$180,$ddd,$a131,$fffe,$180,$c00
  221.     dc.w    $a207,$fffe,$180,$ccc,$a231,$fffe,$180,$b00
  222.     dc.w    $a307,$fffe,$180,$bbb,$a331,$fffe,$180,$a00
  223.     dc.w    $a407,$fffe,$180,$aaa,$a431,$fffe,$180,$900
  224.     dc.w    $a507,$fffe,$180,$999,$a531,$fffe,$180,$800
  225.     dc.w    $a607,$fffe,$180,$888,$a631,$fffe,$180,$700
  226.     dc.w    $a707,$fffe,$180,$777,$a731,$fffe,$180,$600
  227.     dc.w    $a807,$fffe,$180,$666,$a831,$fffe,$180,$500
  228.     dc.w    $a907,$fffe,$180,$555,$a931,$fffe,$180,$400
  229.     dc.w    $aa07,$fffe,$180,$444,$aa31,$fffe,$180,$300
  230.     dc.w    $ab07,$fffe,$180,$333,$ab31,$fffe,$180,$200
  231.     dc.w    $ac07,$fffe,$180,$222,$ac31,$fffe,$180,$100
  232.     dc.w    $ad07,$fffe,$180,$111,$ad31,$fffe,$180,$000
  233.     dc.w    $ae07,$fffe,$180,$000
  234.  
  235. ;        FIXE WAIT (dann Grau)-VERÄNDERB. WAIT (gefolgt vom Rot)
  236.  
  237. ;    Wie ihr seht, braucht es für jede Zeile zwei Wait, eines, das den
  238. ;    Anfang der Zeile abwartet, und eines, das, das wir dauernd verändern,
  239. ;    um den Punkt zu definieren, bei dem der Farbwechsel Grau/Rot
  240. ;    stattfinden soll, also zwischen dem Grau, das ab Position 07
  241. ;    besteht, und dem Rot, das nach diesem Wait startet.
  242.  
  243.     dc.w    $fd07,$FFFE    ; warte Zeile $FD ab
  244.     dc.w    $180,$00a    ; BLAU Helligkeit 10
  245.     dc.w    $fe07,$FFFE    ; nächste Zeile
  246.     dc.w    $180,$00f    ; Blau maximale Helligkeit (15)
  247.     dc.w    $FFFF,$FFFE    ; ENDE DER COPPERLIST
  248.  
  249.  
  250.     end
  251.  
  252.  
  253. Letzte  Kleinigkeit:  wenn ihr die Sache mit den Anfangs-Nullen noch nicht
  254. ganz  klar  habt,  dann  hier  einige  "richtige"  und  einige   "falsche"
  255. Umrechnungen:
  256.  
  257.  
  258.     dc.b 1,2    = dc.w    $0102   oder   dc.w    $102
  259.  
  260.     dc.b 42,$2    = dc.w    $2a02   (42 dezimal = $2a Hex)
  261.  
  262.     dc.b 12,$2,$12,41 = dc.w $c02,$1229 = dc.l $c021229
  263.  
  264.     dc.b 12,$22,0    = dc.w    $000c,$2200 = dc.w $c,$2200 = dc.l $c2200
  265.  
  266.     dc.w 1,2,3,432    = dc.l    $00010002,$000301b0 = dc.l $10002,$301b0
  267.  
  268.     dc.l $1234567    = dc.b    1,$23,$45,$67
  269.  
  270.     dc.l $2342    = dc.b    0,0,$23,$42
  271.  
  272.     dc.l 4        = dc.b    0,0,0,4
  273.  
  274.     Achtung letztes Beispiel:
  275.  
  276.     ein dc.l 4 wird im Speicher zu $00000004, ein dc.b 4 zu $04,
  277.     wenn ich also 04 in das dc.l gebe, wird es von vier Bytes $00
  278.     vorangegangen, im Falle des dc.b 4 positioniert sich die 4
  279.     an erste Stelle, was in ASSEMBLER etwas komplett anderes ist,
  280.     obwohl man immer von 4 spricht!!!!
  281.  
  282.