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

  1.  
  2. ; Listing5c.s    SCROLLEN EINES BILDES NACH OBEN UND UNTEN DURCH MODIFIZIEREN
  3. ;        DER BITPLANEPOINTERS IN DER COPPERLIST
  4.  
  5.     SECTION    CIPundCOP,CODE
  6.  
  7. Anfang:
  8.     move.l    4.w,a6        ; Execbase in a6
  9.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  10.     lea    GfxName(PC),a1    ; Adresse des Namen der zu öffnenden Lib in a1
  11.     jsr    -$198(a6)    ; OpenLibrary, Routine der EXEC, die Libraris
  12.                 ; öffnet, und als Resultat in d0 die Basisadr.
  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.  
  21. ;    POINTEN AUF UNSERE BITPLANES
  22.  
  23.     MOVE.L    #PIC,d0        ; in d0 kommt die Adresse von unserer PIC
  24.                 ; bzw. wo ihr erstes Bitplane beginnt
  25.  
  26.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Bitplane-
  27.                 ; Pointer der Copperlist
  28.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  29.                 ; für den DBRA - Zyklus
  30. POINTBP:
  31.     move.w    d0,6(a1)    ; kopiert das niederwertige Word der Plane-
  32.                 ; Adresse ins richtige Word der Copperlist
  33.     swap    d0        ; vertauscht die 2 Word in d0 (1234 > 3412)
  34.  
  35.     move.w    d0,2(a1)    ; kopiert das hochwertige Word der Adresse des 
  36.                 ; Plane in das richtige Word in der Copperlist
  37.     swap    d0        ; vertauscht erneut die 2 Word von d0
  38.     ADD.L    #40*256,d0    ; Zählen 10240 zu D0 dazu, somit zeigen wir
  39.                 ; auf das zweite Bitplane (befindet sich direkt
  40.                 ; nach dem ersten), wir zählen praktisch Länge
  41.                 ; eines Plane dazu
  42.  
  43.     addq.w    #8,a1        ; a1 enthält nun die Adresse der nächsten
  44.                 ; Bplpointers in der  Copperlist, die es
  45.                 ; einzutragen gilt
  46.     dbra    d1,POINTBP    ; Wiederhole D1 mal POINTBP (D1= bitplanes)
  47.  
  48.  
  49.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  50.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  51.  
  52.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  53.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  54.  
  55. mouse:
  56.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  57.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  58.     
  59.  
  60.     btst    #2,$dff016    ; wenn die rechte Maustaste gedrückt ist,
  61.     beq.s    Warte        ; überspringe die Scrollroutine
  62.  
  63.     bsr.s    BewegeCopper    ; Scrollt Bild rauf und runter
  64.  
  65. Warte:
  66.     cmpi.b    #$ff,$dff006    ; Sind wir noch auf Zeile 255?
  67.     beq.s    Warte        ; Wenn ja, geh nicht weiter
  68.  
  69.  
  70.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  71.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  72.  
  73.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  74.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  75.  
  76.     move.l    4.w,a6
  77.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  78.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  79.                 ; (Libraries werden geöffnet UND geschlossen!)
  80.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  81.     rts
  82.  
  83. ; DATEN
  84.  
  85.  
  86.  
  87. GfxName:
  88.     dc.b    "graphics.library",0,0    
  89.  
  90. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  91.     dc.l    0    ; ab hier werden die Offsets gemacht
  92.  
  93.  
  94.  
  95. OldCop:            ; Hier hinein kommt die Adresse der Orginal-Copperlist
  96.     dc.l    0    ; des Betriebssystemes
  97.  
  98.  
  99. ;    Diese Routine bewegt das Bild nach oben und unten, imdem sie auf
  100. ;    die Bitplanepointer in der Copperlist zugreift (Mit dem Label
  101. ;    BPLPOINTERS).
  102. ;    Die Struktur ist ähnlich mit der in Listing3d.s
  103. ;    Als erstes geben wir die Adresse, die dir BPLPOINTERS gerade anpointen
  104. ;    in d0, dann addieren oder subtrahieren wir 40 Bytes von d0, und
  105. ;    setzen dann diesen neuen Wert in die Copperlist ein. Dafür verwenden
  106. ;    wir wieder die gleiche Routine POINTBP.
  107.  
  108.  
  109.  
  110. BewegeCopper:
  111.     LEA    BPLPOINTERS,A1    ; Mit diesen 4 Anweisungen holen wir aus der
  112.     move.w    2(a1),d0    ; Copperlist die Adresse, wohin das $dff0e0
  113.     swap    d0        ; gerade pointet und geben diesen Wert in d0.
  114.     move.w    6(a1),d0    ; Das Gegenteil der Routine, die die Planes
  115.                 ; anpointet! Hier wird die Adresse geholt
  116.                 ; anstatt hineingegebne!!
  117.  
  118.     TST.B    RaufRunter ; Müßen wir nach oben oder unten? Wenn RaufRunter
  119.                ; auf NULL ist (TST also BEQ verifiziert), dann
  120.                ; überspringen wir GehRunter, wenn es hingegen auf
  121.                ; $FF ist (und TST somit kein BEQ liefern kann),
  122.                ; dann fahren wir nach oben fort (mit den Sub)
  123.     beq.w    GehRunter
  124.     cmp.l    #PIC-(40*30),d0 ; sind wir weit genug OBEN?
  125.     beq.s    SetzRunter    ; wenn ja, sind wir am Ende und müßen runter
  126.     sub.l    #40,d0        ; subtrahieren 40, also 1 Zeile, dadurch
  127.                 ; wandert das Bild nach UNTEN
  128.     bra.s    Ende
  129.  
  130. SetzRunter:
  131.     clr.b    RaufRunter    ; Durch Löschen von RaufRunter wird das TST
  132.     bra.s    Ende        ; danach wieder BEQ ermöglichen ->
  133.                 ; BEQ wird zur Routine GehRunter springen
  134.  
  135. GehRunter:
  136.     cmpi.l    #PIC+(40*30),d0 ; sind wir weit genug UNTEN?
  137.     beq.s    SetzRauf    ; wenn ja, sind wir am unteren Ende und
  138.                 ; müßen wieder rauf
  139.     add.l    #40,d0        ; Addieren 40, also 1 Zeile, somit scrollt
  140.                 ; das Bild nach OBEN
  141.     bra.s    Ende
  142.  
  143. SetzRauf:
  144.     move.b    #$ff,RaufRunter ; Wenn das Label nicht auf NULL steht,
  145.     rts            ; bedeutet das, daß wir rauf müßen
  146.  
  147. Ende:                ; POINTEN DIE BITPLANEPOINTER AN
  148.     LEA    BPLPOINTERS,A1    ; POINTER in der COPPERLIST
  149.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier: 3)
  150. POINTBP2:
  151.     move.w    d0,6(a1)    ; kopiert das niederw. Word der Adress des Pl.
  152.     swap    d0        ; vertauscht die 2 Word von d0 (1234 > 3412)
  153.     move.w    d0,2(a1)    ; kopiert das höherw. Word der Adresse des Pl.
  154.     swap    d0        ; vertauscht die 2 Word von d0 (3412 > 1234)
  155.     ADD.L    #40*256,d0    ; + Länge Bitplane -> nächstes Bitplane
  156.     addq.w    #8,a1        ; zu den nächsten bplpointers in der Cop
  157.     dbra    d1,POINTBP2    ; Wiederhole D1 Mal POINTBP (D1=n. bitplanes)
  158.     rts
  159.  
  160.  
  161. ;    Dieses Byte, vom Label RaufRunter markiert, ist ein FLAG.
  162.  
  163. RaufRunter:
  164.     dc.b    0,0
  165.             
  166.     SECTION GRAPHIC,DATA_C
  167.  
  168. COPPERLIST:
  169.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  170.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  171.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  172.     dc.w    $13e,$0000
  173.  
  174.     dc.w    $8e,$2c81    ; DiwStrt    (Register mit Standartwerten)
  175.     dc.w    $90,$2cc1    ; DiwStop
  176.     dc.w    $92,$0038    ; DdfStart
  177.     dc.w    $94,$00d0    ; DdfStop
  178.     dc.w    $102,0        ; BplCon1
  179.     dc.w    $104,0        ; BplCon2
  180.     dc.w    $108,0        ; Bpl1Mod
  181.     dc.w    $10a,0        ; Bpl2Mod
  182.  
  183.             ; 5432109876543210  ; BPLCON0:
  184.     dc.w    $100,%0011001000000000  ; Bits 13 und 12 an!! (3 = %011)
  185.                     ; 3 Bitplanes Lowres, nicht Lace
  186. BPLPOINTERS:
  187.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane - BPL0PT
  188.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane - BPL1PT
  189.     dc.w $e8,$0000,$ea,$0000    ;drittes Bitplane - BPL2PT
  190.  
  191.     dc.w    $0180,$000    ; Color0
  192.     dc.w    $0182,$475    ; Color1
  193.     dc.w    $0184,$fff    ; Color2
  194.     dc.w    $0186,$ccc    ; Color3
  195.     dc.w    $0188,$999    ; Color4
  196.     dc.w    $018a,$232    ; Color5
  197.     dc.w    $018c,$777    ; Color6
  198.     dc.w    $018e,$444    ; Color7
  199.  
  200. ; Fügt hier das Stück Copperlist ein
  201.  
  202.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  203.  
  204. ;    BILD
  205.  
  206.     dcb.b    40*30,0 ; dieses Stück voller Nullen ist notwendig, da wir
  207.             ; beim Anzeigen weiter über und unter das Pic selbst
  208.             ; gehen und diesen Teil anzeigen. Wären hier keine
  209.             ; Nullen, würden die Byte angezeigt, die sich gerade
  210.             ; in diesem Teil des Speichers befinden. Das Resultat
  211.             ; wäre Chaos am Bildschirm. Aber durch $0000 wird immer
  212.             ; Farbe0 angezeigt, also der Hintergrund.
  213.  
  214.  
  215. PIC:
  216.     incbin  "amiga.320*256*3"    ; hier laden wir das Bild im RAW-
  217.                     ; Format
  218.     dcb.b    40*30,0 ; siehe oben
  219.  
  220.     end
  221.  
  222. Diese  Routine  addiert  bzw. subtrahiert zur Adresse, die die BPLPOINTERS
  223. anpointen, 40. Dafür wird dieser Wert zuerst in d0 geladen, das  geschieht
  224. mit  einer  Routine,  die  genau  das  Gegenteil deren ist, die die Planes
  225. anpointet.
  226. Mit dieser Methode können auch Bilder angezeigt werden, die größer als der
  227. Bildschirm sind, indem man nur einen Teil anzeigt und die Möglichkeit hat,
  228. hin- und herzuscrollen. Als Beispiel  könnte  man  die  Flipperspiele  wie
  229. Pinball  Dreams  anführen,  die  ein  Spielfeld haben, das über den realen
  230. Bildschirm hinausreicht. Es wird immer der Teil angezeigt, indem sich die
  231. Kugel gerade befindet. Einfach die Pointer umschreiben.
  232. In diesem Beispiel zeigen wir auch Zeilen an, die nicht zum Bild  gehören,
  233. da  wir uns ja nach oben und unten bewegen. Das Bild selbst ist 256 Zeilen
  234. lang, aber wir bewegen unser Bild um 30  Zeilen  nach  oben  und  30  nach
  235. unten,    deswegen  müßen  wir  die  "nachrutschenden"  Zeilen  an  der
  236. Ober/Unterseite  mit  etwas  füllen,  wenn  wir  nicht  x-beliebige  Bytes
  237. anzeigen  wollen.  Dafür  haben  wir  die  dcb.b eingefügt, die jeweils 30
  238. Zeilen "simulieren". Sie  schreiben  nur  0  hinein,  das  entspricht  dem
  239. Color0.  Somit  ist  die Zone ober und unter unserem RAW-Bild "sauber" und
  240. präsentierbar. Probiert z.B. das dcb.b auf folgende Weise zu verändern:
  241.  
  242.     dcb.b    40*30,%11001100
  243.  
  244. Bei Ausführen des Listings werdet ihr bemerken, daß die Teile  "außerhalb"
  245. der  Pic  in Streifen erscheinen werden. In der Tat, wir haben ja auch das
  246. Muster
  247.     110011001100110011001100110011
  248.     110011001100110011001100110011
  249.     110011001100110011001100110011
  250.  
  251. produziert. Ein Bit-Streifenmuster...  Ihr  könnt  auch  die  3  Bitplanes
  252. einzeln  scrollen  lassen:  um  das  zu  tun,  müßt  ihr  nur ein Bitplane
  253. anschalten:
  254.  
  255.             ; 5432109876543210
  256.     dc.w    $100,%0001001000000000  ; 1 Bitplane
  257.  
  258.  
  259. Dann noch die maximal erreichbare Scrollposition ändern:
  260.  
  261. GehRunter:
  262.     cmpi.l    #PIC+(40*530),d0 ; sind wir weit genug UNTEN?
  263.     beq.s    SetzRauf     ; wenn ja, sind wir am unteren Ende und
  264.     ...             ; müßen wieder rauf
  265.  
  266. Somit  werdet  ihr  alle  3  Bitplanes separat scrollen sehen, sie sind ja
  267. eines nach dem anderen angeordnet.
  268.  
  269. * Hier eine kleine Verfeinerung für die Copperlist. Was passiert, wenn wir
  270. alle  8  Farben des Bildes alle 2 Zeilen ändern? Kopiert (mit Amiga+b+c+i)
  271. dieses Stück Copperlist und fügt es vor dem Ende derselben ein:
  272.  
  273. ; Fügt hier das Stück Copperlist ein
  274.   
  275. Durch 52 maliges ändern einer Palette von 8 Farben erhalten  wir  8*52=416
  276. Farben.    Aber    geändert  werden  nur  die  7  Farben,  die  Farbe0,  der
  277. Hintergrund, bleibt immer SCHWARZ. Die Reihenfolge,  mit  der  die  Farben
  278. verändert  werden,  ist  egal,  man kann zuerst Color2 ändern, dann Color3
  279. etc. Wir starten z.B. mit Color5 ($dff18a), dann kommt Color7...
  280. Durch 52 Mal ändern von 7 Farben erhalten wir dann  364  effektive  Farben
  281. gleichzeitig  am Bildschirm, und das ist nicht schlecht, wenn man bedenkt,
  282. daß "offiziell" nur 8 Farben angezeigt werden können. (7*52=364)
  283.  
  284. ;2
  285.     dc.w $18a,$102,$18e,$212,$182,$223    ; color5,color7,color2
  286.     dc.w $18c,$323,$188,$323,$186,$334,$184,$434 ; col6,col4,col3,col2
  287.     dc.w $5007,$fffe
  288. ;3
  289.     dc.w $18a,$104,$18e,$214,$182,$225
  290.     dc.w $18c,$324,$188,$324,$186,$335,$184,$435
  291.     dc.w $5207,$fffe
  292. ;4
  293.     dc.w $18a,$203,$18e,$313,$182,$324
  294.     dc.w $18c,$423,$188,$423,$186,$434,$184,$534
  295.     dc.w $5407,$fffe
  296. ;5
  297.     dc.w $18a,$213,$18e,$313,$182,$324
  298.     dc.w $18c,$433,$188,$433,$186,$434,$184,$534
  299.     dc.w $5607,$fffe
  300. ;6
  301.     dc.w $18a,$114,$18e,$214,$182,$224
  302.     dc.w $18c,$323,$188,$323,$186,$334,$184,$434
  303.     dc.w $5807,$fffe
  304. ;7
  305.     dc.w $18a,$101,$18e,$211,$182,$222
  306.     dc.w $18c,$312,$188,$322,$186,$333,$184,$433
  307.     dc.w $5a07,$fffe
  308. ;8
  309.     dc.w $18a,$101,$18e,$211,$182,$222
  310.     dc.w $18c,$312,$188,$312,$186,$323,$184,$423
  311.     dc.w $5c07,$fffe
  312. ;9
  313.     dc.w $18a,$101,$18e,$211,$182,$222
  314.     dc.w $18c,$312,$188,$312,$186,$323,$184,$423
  315.     dc.w $5e07,$fffe
  316. ;10
  317.     dc.w $18a,$101,$18e,$211,$182,$222
  318.     dc.w $18c,$322,$188,$312,$186,$323,$184,$433
  319.     dc.w $6007,$fffe
  320. ;11
  321.     dc.w $18a,$110,$18e,$210,$182,$221
  322.     dc.w $18c,$321,$188,$311,$186,$322,$184,$432
  323.     dc.w $6207,$fffe
  324. ;12
  325.     dc.w $18a,$210,$18e,$310,$182,$321
  326.     dc.w $18c,$421,$188,$411,$186,$422,$184,$532
  327.     dc.w $6407,$fffe
  328. ;13
  329.     dc.w $18a,$210,$18e,$320,$182,$331
  330.     dc.w $18c,$431,$188,$421,$186,$432,$184,$542
  331.     dc.w $6607,$fffe
  332. ;14
  333.     dc.w $18a,$220,$18e,$330,$182,$431
  334.     dc.w $18c,$441,$188,$431,$186,$442,$184,$552
  335.     dc.w $6807,$fffe
  336. ;15
  337.     dc.w $18a,$220,$18e,$330,$182,$431
  338.     dc.w $18c,$440,$188,$430,$186,$441,$184,$551
  339.     dc.w $6a07,$fffe
  340. ;16
  341.     dc.w $18a,$220,$18e,$330,$182,$431
  342.     dc.w $18c,$441,$188,$431,$186,$442,$184,$552
  343.     dc.w $6c07,$fffe
  344. ;17
  345.     dc.w $18a,$120,$18e,$230,$182,$331
  346.     dc.w $18c,$341,$188,$331,$186,$342,$184,$452
  347.     dc.w $6e07,$fffe
  348. ;18
  349.     ... etc.
  350.  
  351.