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

  1.  
  2. ; Listing5g.s    AUF- UND ABSCROLLEN EINES BILDES DURCH ÄNDERN DER BITPLANEPTERS
  3. ;        KOMBINIERT MIT DEM SPIEGELEFFEKT, HERGESTELLT MIT DEN MODULO
  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
  12.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  13.     move.l    d0,a6
  14.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  15.                 ; des Betriebssystemes
  16.  
  17. ;    POINTEN AUF UNSERE BITPLANES
  18.  
  19.     MOVE.L    #PIC,d0        ; in d0 kommt die Adresse unserer PIC
  20.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Bitplane-
  21.                 ; Pointer der Copperlist
  22.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  23.                 ; für den DBRA - Zyklus
  24. POINTBP:
  25.     move.w    d0,6(a1)    ; kopiert das niederwertige Word der Plane-
  26.                 ; Adresse ins richtige Word der Copperlist
  27.     swap    d0        ; vertauscht die 2 Word in d0 (1234 > 3412)
  28.  
  29.     move.w    d0,2(a1)    ; kopiert das hochwertige Word der Adresse des 
  30.                 ; Plane in das richtige Word in der Copperlist
  31.     swap    d0        ; vertauscht erneut die 2 Word von d0
  32.     ADD.L    #40*256,d0    ; Zählen 10240 zu D0 dazu, -> nächstes Plane
  33.  
  34.     addq.w    #8,a1        ; zu den nächsten Bplpointers in der Cop
  35.     dbra    d1,POINTBP    ; Wiederhole D1 mal POINTBP (D1=n. bitplanes)
  36.  
  37.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  38.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  39.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  40.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  41.  
  42. mouse:
  43.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  44.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  45.  
  46.     btst    #2,$dff016    ; wenn die rechte Maustaste gedrückt ist,
  47.     beq.s    Warte        ; überspringe die Routine
  48.  
  49.     bsr.s    BewegeCopper    ; Läßt Bild rauf und runter gehen durch
  50.                 ; Modifizieren der BitplanePointers
  51.  
  52. Warte:
  53.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  54.     beq.s    Warte        ; Wenn nicht, geh nicht weiter
  55.  
  56.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  57.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  58.  
  59.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  60.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  61.  
  62.     move.l    4.w,a6
  63.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  64.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  65.                 ; (Libraries werden geöffnet UND geschlossen!)
  66.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  67.     rts
  68.  
  69. ; DATEN
  70.  
  71. GfxName:
  72.     dc.b    "graphics.library",0,0    
  73.  
  74. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  75.     dc.l    0    ; ab hier werden die Offsets gemacht
  76.  
  77. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  78.     dc.l    0    ; Betriebssystemes
  79.  
  80. ;    Diese Routine bewegt das Bild nach oben und unten, imdem sie auf
  81. ;    die Bitplanepointer in der Copperlist zugreift (Mit dem Label
  82. ;    BPLPOINTERS).
  83. ;
  84.  
  85. BewegeCopper:
  86.     LEA    BPLPOINTERS,A1    ; Mit diesen 4 Anweisungen holen wir aus der
  87.     move.w    2(a1),d0    ; Copperlist die Adresse, wohin das $dff0e0
  88.     swap    d0        ; gerade pointet und geben diesen Wert
  89.     move.w    6(a1),d0    ; in d0
  90.  
  91.     TST.B    RaufRunter    ; Müßen wir nach oben oder unten?
  92.  
  93.     beq.w    GehRunter
  94.     cmp.l    #PIC-(40*18),d0 ; sind wir weit genug OBEN?
  95.     beq.s    SetzRunter    ; wenn ja, sind wir am Ende und müßen runter
  96.     sub.l    #40,d0        ; subtrahieren 40, also 1 Zeile, dadurch
  97.                 ; wandert das Bild nach UNTEN
  98.     bra.s    Ende
  99.  
  100.  
  101. SetzRunter:
  102.     clr.b    RaufRunter    ; Durch Löschen von RaufRunter wird das TST
  103.     bra.s    Ende
  104.  
  105. GehRunter:
  106.  
  107.     cmpi.l    #PIC+(40*130),d0; sind wir weit genug UNTEN?
  108.     beq.s    SetzRauf    ; wenn ja, sind wir am unteren Ende und
  109.                 ; müßen wieder rauf            
  110.     add.l    #40,d0        ; Addieren 40, also 1 Zeile, somit scrollt
  111.                 ; das Bild nach OBEN
  112.     bra.s    Ende
  113.  
  114. SetzRauf:
  115.     move.b    #$ff,RaufRunter ; Wenn das Label nicht auf NULL steht,
  116.     rts            ; bedeutet das, daß wir rauf müßen
  117.  
  118. Ende:                ; POINTEN DIE BITPLANEPOINTER AN
  119.     LEA    BPLPOINTERS,A1    ; POINTER in der COPPERLIST
  120.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier: 3) 
  121.  
  122. POINTBP2:
  123.     move.w    d0,6(a1)    ; kopiert das niederw. Word der Adress des Pl.
  124.     swap    d0        ; vertauscht die 2 Word von d0 (1234 > 3412)
  125.     move.w    d0,2(a1)    ; kopiert das höherw. Word der Adresse des Pl.
  126.     swap    d0        ; vertauscht die 2 Word von d0 (3412 > 1234)
  127.     ADD.L    #40*256,d0    ; + Länge Bitplane -> nächstes Bitplane
  128.     addq.w    #8,a1        ; zu den nächsten bplpointers in der Cop
  129.     dbra    d1,POINTBP2    ; Wiederhole D1 Mal POINTBP (D1=n. bitplanes)
  130.     rts
  131.  
  132.  
  133. ;    Dieses Byte, vom Label RaufRunter markiert, ist ein FLAG.
  134.  
  135. RaufRunter:
  136.     dc.b    0,0
  137.  
  138.  
  139.     SECTION GRAPHIC,DATA_C
  140.  
  141.  
  142. COPPERLIST:
  143.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  144.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  145.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  146.     dc.w    $13e,$0000
  147.  
  148.     dc.w    $8e,$2c81    ; DiwStrt    (Register mit Standartwerten)
  149.     dc.w    $90,$2cc1    ; DiwStop
  150.     dc.w    $92,$0038    ; DdfStart
  151.     dc.w    $94,$00d0    ; DdfStop
  152.     dc.w    $102,0        ; BplCon1
  153.     dc.w    $104,0        ; BplCon2
  154.     dc.w    $108,0        ; Bpl1Mod
  155.     dc.w    $10a,0        ; Bpl2Mod
  156.  
  157.             ; 5432109876543210  ; BPLCON0:
  158.     dc.w    $100,%0011001000000000  ; Bits 13 und 12 an!! (3 = %011)
  159.                     ; 3 Bitplanes Lowres, nicht Lace
  160. BPLPOINTERS:
  161.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane - BPL0PT
  162.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane - BPL1PT
  163.     dc.w $e8,$0000,$ea,$0000    ;drittes Bitplane - BPL2PT
  164.  
  165.     dc.w    $0180,$000    ; Color0
  166.     dc.w    $0182,$475    ; Color1
  167.     dc.w    $0184,$fff    ; Color2
  168.     dc.w    $0186,$ccc    ; Color3
  169.     dc.w    $0188,$999    ; Color4
  170.     dc.w    $018a,$232    ; Color5
  171.     dc.w    $018c,$777    ; Color6
  172.     dc.w    $018e,$444    ; Color7
  173.  
  174. ;    SPIEGELEFFEKT (könnte man als "TextureMap-Effekt" verkaufen)
  175.  
  176.     dc.w    $b007,$fffe
  177.     dc.w    $180,$004    ; Color0
  178.     dc.w    $108,-40*7    ; Bpl1Mod - Spiegel 5 Mal halbiert
  179.     dc.w    $10a,-40*7    ; Bpl2Mod
  180.     dc.w    $b307,$fffe
  181.     dc.w    $180,$006    ; Color0
  182.     dc.w    $108,-40*6    ; Bpl1Mod - Spiegel 4 Mal halbiert
  183.     dc.w    $10a,-40*6    ; Bpl2Mod
  184.     dc.w    $b607,$fffe
  185.     dc.w    $180,$008    ; Color0
  186.     dc.w    $108,-40*5    ; Bpl1Mod - Spiegel um  3 Mal halbiert
  187.     dc.w    $10a,-40*5    ; Bpl2Mod
  188.     dc.w    $bb07,$fffe
  189.     dc.w    $180,$00a    ; Color0
  190.     dc.w    $108,-40*4    ; Bpl1Mod - Spiegel 2 Mal halbiert
  191.     dc.w    $10a,-40*4    ; Bpl2Mod
  192.     dc.w    $c307,$fffe
  193.     dc.w    $180,$00c    ; Color0
  194.     dc.w    $108,-40*3    ; Bpl1Mod - Spiegel 
  195.     dc.w    $10a,-40*3    ; Bpl2Mod
  196.     dc.w    $d007,$fffe
  197.     dc.w    $180,$00e    ; Color0
  198.     dc.w    $108,-40*2    ; Bpl1Mod - normaler Spiegel
  199.     dc.w    $10a,-40*2    ; Bpl2Mod
  200.     dc.w    $d607,$fffe
  201.     dc.w    $180,$00f    ; Color0
  202.     dc.w    $108,-40    ; Bpl1Mod - FLOOD, wiederholte Zeilen für den
  203.     dc.w    $10a,-40    ; Bpl2Mod - Vergrößerungseffekt in der Mitte
  204.     dc.w    $da07,$fffe
  205.     dc.w    $180,$00e    ; Color0
  206.     dc.w    $108,-40*2    ; Bpl1Mod - normaler Spiegel
  207.     dc.w    $10a,-40*2    ; Bpl2Mod
  208.     dc.w    $e007,$fffe
  209.     dc.w    $180,$00c    ; Color0
  210.     dc.w    $108,-40*3    ; Bpl1Mod - Spiegel
  211.     dc.w    $10a,-40*3    ; Bpl2Mod
  212.     dc.w    $ed07,$fffe
  213.     dc.w    $180,$00a    ; Color0
  214.     dc.w    $108,-40*4    ; Bpl1Mod - Spiegel 2 Mal halbiert
  215.     dc.w    $10a,-40*4    ; Bpl2Mod
  216.     dc.w    $f507,$fffe
  217.     dc.w    $180,$008    ; Color0
  218.     dc.w    $108,-40*5    ; Bpl1Mod - Spiegel 3 Mal halbiert
  219.     dc.w    $10a,-40*5    ; Bpl2Mod
  220.     dc.w    $fa07,$fffe
  221.     dc.w    $180,$006    ; Color0
  222.     dc.w    $108,-40*6    ; Bpl1Mod - Spiegel 4 Mal halbiert
  223.     dc.w    $10a,-40*6    ; Bpl2Mod
  224.     dc.w    $fd07,$fffe
  225.     dc.w    $180,$004    ; Color0
  226.     dc.w    $108,-40*7    ; Bpl1Mod - Spiegel 5 Mal halbiert
  227.     dc.w    $10a,-40*7    ; Bpl2Mod
  228.     dc.w    $ff07,$fffe
  229.     dc.w    $180,$002    ; Color0
  230.     dc.w    $108,-40    ; stoppt das Bild, um nicht die Bytes vor dem
  231.     dc.w    $10a,-40    ; RAW anzuzeigen
  232.  
  233.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  234.  
  235. ;    BILD
  236.  
  237.     dcb.b    40*98,0     ; oben freimachen
  238. PIC:    
  239.     incbin    "amiga.320*256*3"    ; hier laden wir das Bild im RAW-
  240.                     ; Format
  241.     dcb.b    40*30,0    ; siehe oben
  242.  
  243.     end
  244.  
  245. In diesem Beispiel wurde durch das Setzen mehrerer Modulo eine Art Spiegelung
  246. um eine ziemlich rudimentale, runde Fläche simuliert. Wenn man die Modulo
  247. richtig setzt, kann man auch Effekte wie "Vergrößerung" oder ZOOM erzielen,
  248. weiters auch zylindrische Verzerrungen, wie in diesem Beispiel, vor allem
  249. wenn man dann noch einige Farben zur Hilfe zieht, wie etwa der blaue
  250. Balken.
  251. Das Listing ist das gleiche wie in Listing5c.s, nur wurde hier die Copperlist
  252. etwas geändert. Durch die $dff102 (BPLCON1) konnte so etwas Realismus ins
  253. Spiel gebracht werden. Tauscht die Copperlist mit dieser aus, es ist eine
  254. Mischung mit der in Listing5d2.s
  255.  
  256. -Ich erinnere, daß man die Tasten Amiga+x dazu verwenden kann, einen Teil
  257. auszuschneiden, der vorher mit Amiga+b markiert wurde. Dieser Teil kann
  258. dann mit Amiga+i in einem beliebeigen Ort eingesetzt werden, dort, wo gerade
  259. der Cursor steht.
  260.  
  261.     dc.w    $b007,$fffe
  262.     dc.w    $180,$004    ; Color0
  263.     dc.w    $102,$011    ; bplcon1
  264.     dc.w    $108,-40*7    ; Bpl1Mod - Spiegel 5 Mal halbiert
  265.     dc.w    $10a,-40*7    ; Bpl2Mod
  266.     dc.w    $b307,$fffe
  267.     dc.w    $180,$006    ; Color0
  268.     dc.w    $102,$022    ; bplcon1
  269.     dc.w    $108,-40*6    ; Bpl1Mod - Spiegel 4 Mal halbiert
  270.     dc.w    $10a,-40*6    ; Bpl2Mod
  271.     dc.w    $b607,$fffe
  272.     dc.w    $180,$008    ; Color0
  273.     dc.w    $102,$033    ; bplcon1
  274.     dc.w    $108,-40*5    ; Bpl1Mod - Spiegel 3 Mal halbiert
  275.     dc.w    $10a,-40*5    ; Bpl2Mod
  276.     dc.w    $bb07,$fffe
  277.     dc.w    $180,$00a    ; Color0
  278.     dc.w    $102,$044    ; bplcon1
  279.     dc.w    $108,-40*4    ; Bpl1Mod - Spiegel 2 Mal halbiert
  280.     dc.w    $10a,-40*4    ; Bpl2Mod
  281.     dc.w    $c307,$fffe
  282.     dc.w    $180,$00c    ; Color0
  283.     dc.w    $102,$055    ; bplcon1
  284.     dc.w    $108,-40*3    ; Bpl1Mod - Spiegel
  285.     dc.w    $10a,-40*3    ; Bpl2Mod
  286.     dc.w    $d007,$fffe
  287.     dc.w    $180,$00e    ; Color0
  288.     dc.w    $102,$066    ; bplcon1
  289.     dc.w    $108,-40*2    ; Bpl1Mod - normaler Spiegel
  290.     dc.w    $10a,-40*2    ; Bpl2Mod
  291.     dc.w    $d607,$fffe
  292.     dc.w    $180,$00f    ; Color0
  293.     dc.w    $102,$077    ; bplcon1
  294.     dc.w    $108,-40    ; Bpl1Mod - FLOOD, wiederholte Zeilen für den
  295.     dc.w    $10a,-40    ; Bpl2Mod - Vergrößerungseffekt in der Mitte
  296.     dc.w    $da07,$fffe
  297.     dc.w    $180,$00e    ; Color0
  298.     dc.w    $102,$066    ; bplcon1
  299.     dc.w    $108,-40*2    ; Bpl1Mod - normaler Spiegel
  300.     dc.w    $10a,-40*2    ; Bpl2Mod
  301.     dc.w    $e007,$fffe
  302.     dc.w    $180,$00c    ; Color0
  303.     dc.w    $102,$055    ; bplcon1
  304.     dc.w    $108,-40*3    ; Bpl1Mod - Spiegel
  305.     dc.w    $10a,-40*3    ; Bpl2Mod
  306.     dc.w    $ed07,$fffe
  307.     dc.w    $180,$00a    ; Color0
  308.     dc.w    $102,$044    ; bplcon1
  309.     dc.w    $108,-40*4    ; Bpl1Mod - Spiegel 2 Mal halbiert
  310.     dc.w    $10a,-40*4    ; Bpl2Mod
  311.     dc.w    $f507,$fffe
  312.     dc.w    $180,$008    ; Color0
  313.     dc.w    $102,$033    ; bplcon1
  314.     dc.w    $108,-40*5    ; Bpl1Mod - Spiegel 3 Mal halbiert
  315.     dc.w    $10a,-40*5    ; Bpl2Mod
  316.     dc.w    $fa07,$fffe
  317.     dc.w    $180,$006    ; Color0
  318.     dc.w    $102,$022    ; bplcon1
  319.     dc.w    $108,-40*6    ; Bpl1Mod - Spiegel 4 Mal halbiert
  320.     dc.w    $10a,-40*6    ; Bpl2Mod
  321.     dc.w    $fd07,$fffe
  322.     dc.w    $180,$004    ; Color0
  323.     dc.w    $102,$011    ; bplcon1
  324.     dc.w    $108,-40*7    ; Bpl1Mod - Spiegel 5 Mal halbiert
  325.     dc.w    $10a,-40*7    ; Bpl2Mod
  326.     dc.w    $ff07,$fffe
  327.     dc.w    $180,$002    ; Color0
  328.     dc.w    $102,$000    ; bplcon1
  329.     dc.w    $108,-40    ; stoppe das Bild, um nicht die Bytes vor
  330.     dc.w    $10a,-40    ; dem RAW anzuzeigen
  331.  
  332.