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

  1.  
  2. ; Listing6g.s    SCHREIBEN "ÜBER" EINEM BILD (IN TRANSPARENZ)
  3. ;        Linke Maustaste um vorzugehen, rechte um
  4. ;        zurückzugehen, beide, um auszusteigen - man kann
  5. ;        auch den ganzen Speicher durchsuchen wie in Listing5l.s
  6.  
  7.  
  8.     SECTION    CIPundCOP,CODE
  9.  
  10. Anfang:
  11.     move.l    4.w,a6        ; Execbase in a6
  12.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  13.     lea    GfxName(PC),a1    ; Adresse des Namen der zu öffnenden Lib in a1
  14.     jsr    -$198(a6)    ; OpenLibrary
  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
  19.  
  20. ;    POINTEN AUF UNSERE BITPLANES
  21.  
  22.     MOVE.L    #PIC,d0        ; in d0 kommt die Adresse von unserer PIC
  23.                 ; bzw. wo ihr erstes Bitplane beginnt
  24.  
  25.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Bitplane-
  26.                 ; Pointer der Copperlist
  27.     MOVEQ    #2,D1        ; Anzahl der Bitplanes -1 (hier sind es 3)
  28.                 ; für den DBRA - Zyklus
  29. POINTBP:
  30.     move.w    d0,6(a1)    ; kopiert das niederw. Word der Planeadresse 
  31.     swap    d0        ; vertauscht die 2 Word in d0 (1234 > 3412)
  32.     move.w    d0,2(a1)    ; kopiert das hochw. Word der Adresse des Plnae
  33.     swap    d0        ; vertauscht erneut die 2 Word von d0
  34.     ADD.L    #40*256,d0    ; + Länge Bitplane -> nächstes Bitplane
  35.     addq.w    #8,a1        ; auf zum nächsten bplpointer in der COP
  36.     dbra    d1,POINTBP    ; wiederhole D1 mal POINTBP (D1=n. bitplanes)
  37.  
  38. ;    POINTEN AUF UNSER BITPLANE
  39.  
  40.     MOVE.L    #BITPLANE,d0    ; in d0 kommt die Adresse des PIC
  41.     LEA    BPLPOINTERS2,A1 ; Pointer in der Copperlist
  42.     move.w    d0,6(a1)    ; kopiert das niederw. Word der Planeadresse
  43.     swap    d0        ; vertauscht die 2 word in d0 (1234 > 3412)
  44.     move.w    d0,2(a1)    ; kopiert das hochw. Word der Planeadresse
  45.     
  46.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  47.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  48.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  49.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  50.  
  51.     bsr.w    print        ; Bringt den Text auf den Bildschirm
  52.  
  53. mouse:
  54.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  55.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  56.  
  57. Warte:
  58.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  59.     beq.s    Warte        ; Wenn nicht, geh nicht weiter
  60.  
  61.     btst    #2,$dff016    ; wenn die rechte Maustaste gedrückt ist,
  62.     bne.s    NichtRunter    ; gehe zu NichtRunter
  63.  
  64.     bsr.w    GehRunter    ; ansonsten auf GehRunter
  65.  
  66. NichtRunter:
  67.     btst    #6,$bfe001    ; linke Taste gedrückt?
  68.     beq.s    ScrollRauf    ; wenn ja, scrolle rauf
  69.     bra.s    mouse        ; nein? Dann wiederhole den Zyklus noch ein
  70.                 ; FRAME lang
  71.  
  72. ScrollRauf:
  73.     bsr.w    GehRauf     ; läßt das Bild nach oben scrollen
  74.  
  75.     btst    #2,$dff016    ; Right mouse button pressed?
  76.     bne.s    mouse
  77.  
  78.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  79.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  80.  
  81.     move.l    4.w,a6
  82.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  83.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  84.                 ; (Libraries werden geöffnet UND geschlossen!)
  85.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  86.     rts
  87.  
  88. ; DATEN
  89.  
  90. GfxName:
  91.     dc.b    "graphics.library",0,0    
  92.  
  93. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  94.     dc.l    0    ; ab hier werden die Offsets gemacht
  95.  
  96. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  97.     dc.l    0    ; Betriebssystemes
  98.  
  99. ;    Routine, die 8x8 Pixel große Buchstaben druckt
  100.  
  101. PRINT:
  102.     LEA    TEXT(PC),A0    ; Adresse des zu schreibenden Textes in a0
  103.     LEA    BITPLANE,A3    ; Adresse des Ziel-Bitplanes in a3
  104.     MOVEQ    #26-1,D3    ; ANZAHL DER ZEILEN, DIE ZU DRUCKEN SIND -> 25
  105. PRINTZEILE:
  106.     MOVEQ    #40-1,D0    ; ANZAHL DER SPALTEN EINER ZEILE: 40 (LOWRES!)
  107.  
  108. PRINTCHAR2:            
  109.     MOVEQ    #0,D2        ; Löscht D2
  110.     MOVE.B    (A0)+,D2    ; Nächster Charakter in d2
  111.     SUB.B    #$20,D2        ; ZÄHLE 32 VOM ASCII-WERT DES BUCHSTABEN WEG,
  112.                 ; SOMIT VERWANDELN WIR Z.B. DAS LEERZEICHEN
  113.                 ; (Das $20 entspricht), IN $00, DAS
  114.                 ; MALZEICHEN ($21) IN $01...
  115.     MULU.W    #8,D2        ; MULTIPLIZIERE DIE ERHALTENE ZAHL MIT 8,
  116.                 ; da die Charakter ja 8 Pixel hoch sind
  117.     MOVE.L    D2,A2
  118.     ADD.L    #FONT,A2    ; FINDE DEN GEWÜNSCHTEN BUCHSTEBEN IM FONT
  119.  
  120.                 ; DRUCKE DEN BUCHSTABEN ZEILE FÜR ZEILE
  121.     MOVE.B    (A2)+,(A3)    ; Drucke Zeile 1 des Buchstaben
  122.     MOVE.B    (A2)+,40(A3)    ; Drucke Zeile 2  "    "
  123.     MOVE.B    (A2)+,40*2(A3)    ; Drucke Zeile 3  "    "
  124.     MOVE.B    (A2)+,40*3(A3)    ; Drucke Zeile 4  "    "
  125.     MOVE.B    (A2)+,40*4(A3)    ; Drucke Zeile 5  "    "
  126.     MOVE.B    (A2)+,40*5(A3)    ; Drucke Zeile 6  "    "
  127.     MOVE.B    (A2)+,40*6(A3)    ; Drucke Zeile 7  "    "
  128.     MOVE.B    (A2)+,40*7(A3)    ; Drucke Zeile 8  "    "
  129.  
  130.     ADDQ.w    #1,A3        ; A3+1, wir gehen um 8 Bit weiter (zum
  131.                 ; nächsten Buchstaben
  132.  
  133.     DBRA    D0,PRINTCHAR2    ; DRUCKEN D0 (80) ZEICHEN PRO ZEILE
  134.  
  135.     ADD.W    #40*7,A3    ; "Return", neue Zeile
  136.  
  137.     DBRA    D3,PRINTZEILE    ; Wir drucken D3 Zeilen
  138.  
  139.     RTS
  140.  
  141.  
  142. TEXT:
  143.                 ; Anzahl Charakter pro Zeile: 80, also 2 von diesen zu 40!
  144.  
  145.  
  146.              ;            1111111111222222222233333333334
  147.              ;   1234567890123456789012345678901234567890
  148.  
  149.     dc.b    '                                        ' ; 1
  150.     dc.b    '                ZWEITE ZEILE            ' ; 2
  151.     dc.b    '     /\  /                              ' ; 3
  152.     dc.b    '    /  \/                               ' ; 4
  153.     dc.b    '                                        ' ; 5
  154.     dc.b    '        SECHSTE ZEILE                   ' ; 6
  155.     dc.b    '                                        ' ; 7
  156.     dc.b    '                                        ' ; 8
  157.     dc.b    'FABIO CIUCCI COMMUNICATION INTERNATIONAL' ; 9
  158.     dc.b    '                                        ' ; 10
  159.     dc.b    '   1234567890 !@#$%^&*()_+|\=-[]{}      ' ; 11
  160.     dc.b    '                                        ' ; 12
  161.     dc.b    ' -=-    ICH DENKE, ALSO BIN ICH...  -=- ' ; 13
  162.     dc.b    ' ## sagte mal jemand, aber er gefiel ## ' ; 14
  163.     dc.b    ' ///dem Cartoonzeichner nicht und   \\\ ' ; 15
  164.     dc.b    '       so wurde er ausradiert...        ' ; 16
  165.     dc.b    '                                        ' ; 17
  166.     dc.b    '  Das Fraeulein stand am Meere          ' ; 18
  167.     dc.b    '                                        ' ; 19
  168.     dc.b    '    und seufzte lang und bang,          ' ; 20
  169.     dc.b    '                                        ' ; 21
  170.     dc.b    '    ES RUEHRTE SIE SO SEHRE,            ' ; 22
  171.     dc.b    '                                        ' ; 23
  172.     dc.b    '  der Sonnenuntergang.                  ' ; 24
  173.     dc.b    '                                        ' ; 25
  174.     dc.b    '             ...                        ' ; 26
  175.  
  176.     EVEN
  177.  
  178.  
  179. ;    Diese Routine bewegt das Bild nach oben und unten, indem es auf die
  180. ;    Bitplane-Pointers in der Copperlist (mittels dem Label BPLPOINTERS2)
  181. ;    zugreift. Aus Listing5l.s.
  182.  
  183. GehRunter:
  184.     LEA    BPLPOINTERS2,A1 ; Mit diesen 4 Anweisungen holen wir aus der
  185.     move.w    2(a1),d0    ; Copperlist die Adresse, wohin das $dff0e0
  186.     swap    d0        ; gerade pointet und geben diesen Wert
  187.     move.w    6(a1),d0    ; in d0
  188.     
  189.     sub.l    #40,d0        ; subtrahieren 80*3, also 3 Zeilen, somit
  190.                 ; scrollt das Bild nach unten
  191.     bra.s    ENDE
  192.  
  193.  
  194. GehRauf:
  195.     LEA    BPLPOINTERS2,A1 ; Mit diesen 4 Anweisungen holen wir aus der
  196.     move.w    2(a1),d0    ; Copperlist die Adresse, wohin das $dff0e0
  197.     swap    d0        ; gerade pointet und geben diesen Wert
  198.     move.w    6(a1),d0    ; in d0
  199.     
  200.     add.l    #40,d0        ; addieren 80*3, also 3 Zeilen, somit
  201.                 ; scrollt das Bild nach oben
  202.  
  203. ENDE:             ; WIR POINTEN AUF UNSERE BITPLANES
  204.     move.w    d0,6(a1) ; kopiert das niederw. Word der Adresse des Plane
  205.     swap    d0     ; vertauscht die 2 Word in d0 (Z.B.: 1234 > 3412)
  206.     move.w    d0,2(a1) ; kopiert ds hochw. Word der Adresse des Plane
  207.     rts
  208.  
  209.  
  210.     SECTION GRAPHIC,DATA_C
  211.  
  212. COPPERLIST:
  213.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  214.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  215.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  216.     dc.w    $13e,$0000
  217.  
  218.     dc.w    $8E,$2c81    ; DiwStrt (Register mit Normalwerten)
  219.     dc.w    $90,$2cc1    ; DiwStop
  220.     dc.w    $92,$0038    ; DdfStart
  221.     dc.w    $94,$00d0    ; DdfStop
  222.     dc.w    $102,0        ; BplCon1
  223.     dc.w    $104,0        ; BplCon2
  224.     dc.w    $108,0        ; Bpl1Mod
  225.     dc.w    $10a,0        ; Bpl2Mod
  226.  
  227.             ; 5432109876543210
  228.     dc.w    $100,%0100001000000000  ; Bit 14 - 4 Bitplanes, 16 Farben HIRES
  229.  
  230. BPLPOINTERS:
  231.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane
  232.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane
  233.     dc.w $e8,$0000,$ea,$0000    ;drittes Bitplane
  234. BPLPOINTERS2: 
  235.     dc.w $ec,$0000,$ee,$0000    ;viertes Bitplane
  236.  
  237.     dc.w    $180,$000    ; Color0 ; Farben des Bildes, ein bißchen
  238.     dc.w    $182,$354    ; Color1 ; gedämpft
  239.     dc.w    $184,$678    ; Color2
  240.     dc.w    $186,$567    ; Color3
  241.     dc.w    $188,$455    ; Color4
  242.     dc.w    $18a,$121    ; Color5
  243.     dc.w    $18c,$455    ; Color6
  244.     dc.w    $18e,$233    ; Color7
  245.  
  246.     dc.w    $190,$454    ; color8    ; Colors of text:
  247.     dc.w    $192,$7a8    ; color9    ;
  248.     dc.w    $194,$eef    ; color10    ; 8 colors for 8 types of
  249.     dc.w    $196,$cde    ; color11    ; transparency.
  250.     dc.w    $198,$aab    ; color12
  251.     dc.w    $19a,$786    ; color13
  252.     dc.w    $19c,$9aa    ; color14
  253.     dc.w    $19e,$789    ; color15
  254.  
  255.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  256.  
  257. ;    Der FONT, Charakter 8x8
  258.  
  259. FONT:
  260. ;    incbin    "metal.fnt"    ; Breiter Zeichensatz
  261. ;    incbin    "normal.fnt"    ; Ähnlich dem aus dem Kickstart 1.3
  262.     incbin    "nice.fnt"    ; Schmaler Zeichensatz
  263.  
  264. PIC:
  265.     incbin    "amiga.320*256*3"    ; hier laden wir das Bild in RAW
  266.  
  267.  
  268.     SECTION MEIPLANE,BSS_C    ; Die SECTION BSS können nur aus NULLEN
  269.                 ; bestehen!!! Man verwendet das DS.B um zu
  270.                 ; definieren, wieviele Nullen die Section
  271.                 ; enthalten soll
  272.  
  273. BITPLANE:
  274.     ds.b    40*256    ; ein Bitplane LOWRES 320x256
  275.  
  276.     end
  277.  
  278. Ihr könnt auch den ganzen Speicher über dem Bild laufen lassen!    Wenn  ihr
  279. mit  dem  rechten Mausknopf nach hinten geht, werdet ihr auch auf die drei
  280. Bitplanes des Bildes stoßen, dann die Charakter des Font (nicht recht  gut
  281. sichtbar wegen des nicht übereinstimmenden Modulo).
  282.  
  283.