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

  1.  
  2. ; Listing6h.s    DRUCKEN MEHRERE ZELEN AUF, IN * 3 * FARBEN,
  3. ;        DAZU VERWENDEN WIR DAS ZWEITE BITPLANE, AUF DEM
  4. ;        DER TEXT2 KOMMT
  5.  
  6.     SECTION    CIPundCOP,CODE
  7.  
  8. Anfang:
  9.     move.l    4.w,a6        ; Execbase in a6
  10.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  11.     lea    GfxName(PC),a1    ; Adresse des Namen der zu öffnenden Lib in a1
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  14.     move.l    d0,a6
  15.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  16.                 ; des Betriebssystemes
  17.  
  18. ;    POINTEN AUF UNSERE BITPLANES
  19.  
  20.     MOVE.L    #BITPLANE,d0    ; in d0 kommt die Adresse des PIC
  21.     LEA    BPLPOINTERS,A1    ; Pointer in der Copperlist
  22.     move.w    d0,6(a1)    ; kopiert das niederw. Word der Planeadresse
  23.     swap    d0        ; vertauscht die 2 Word in d0 (1234 > 3412)
  24.     move.w    d0,2(a1)    ; kopiert das hochw. Word der Adresse des Plnae
  25.  
  26. ;    POINTEN AUF UNSER BITPLANE
  27.  
  28.     MOVE.L    #BITPLANE2,d0    ; in d0 kommt die Adresse des PIC
  29.     LEA    BPLPOINTERS2,A1 ; Pointer in der Copperlist
  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 Planeadresse
  33.     
  34.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  35.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  36.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  37.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  38.  
  39.     LEA    TEXT(PC),A0    ; Adresse des zu schreibenden Textes in a0
  40.     LEA    BITPLANE,A3    ; Adresse des Ziel-Bitplanes in a3
  41.     bsr.w    print        ; Bringt den Text auf den Bildschirm
  42.  
  43.     LEA    TEXT2(PC),A0    ; Adresse des zu schreibenden Textes in a0
  44.     LEA    BITPLANE2,A3    ; Adresse des Ziel-Bitplanes in a3
  45.     bsr.w    print        ; Bringt den Text auf den Bildschirm
  46.  
  47. mouse:
  48.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  49.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  50.  
  51.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  52.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  53.  
  54.     move.l    4.w,a6
  55.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  56.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  57.                 ; (Libraries werden geöffnet UND geschlossen!)
  58.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  59.     rts
  60.  
  61.  
  62. ; DATEN
  63.  
  64. GfxName:
  65.     dc.b    "graphics.library",0,0
  66.  
  67. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  68.     dc.l    0    ; ab hier werden die Offsets gemacht
  69.  
  70. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  71.     dc.l    0    ; Betriebssystemes
  72.  
  73. ;    Routine, die 8x8 Pixel große Buchstaben druckt
  74.  
  75. PRINT:
  76.     MOVEQ    #27-1,D3     ; ANZAHL DER ZEILEN, DIE ZU DRUCKEN SIND -> 26
  77. PRINTZEILE:
  78.     MOVEQ    #40-1,D0    ; ANZAHL DER SPALTEN EINER ZEILE: 40 (LOWRES!)
  79.  
  80. PRINTCHAR2:
  81.     MOVEQ    #0,D2        ; Löscht D2
  82.     MOVE.B    (A0)+,D2    ; Nächster Charakter in d2
  83.     SUB.B    #$20,D2        ; ZÄHLE 32 VOM ASCII-WERT DES BUCHSTABEN WEG,
  84.                 ; SOMIT VERWANDELN WIR Z.B. DAS LEERZEICHEN
  85.                 ; (Das $20 entspricht), IN $00, DAS
  86.                 ; MALZEICHEN ($21) IN $01...
  87.     MULU.W    #8,D2        ; MULTIPLIZIERE DIE ERHALTENE ZAHL MIT 8,
  88.                 ; da die Charakter ja 8 Pixel hoch sind
  89.     MOVE.L    D2,A2
  90.     ADD.L    #FONT,A2    ; FINDE DEN GEWÜNSCHTEN BUCHSTEBEN IM FONT
  91.  
  92.                 ; DRUCKE DEN BUCHSTABEN ZEILE FÜR ZEILE
  93.     MOVE.B    (A2)+,(A3)    ; Drucke Zeile 1 des Buchstaben
  94.     MOVE.B    (A2)+,40(A3)    ; Drucke Zeile 2  "    "
  95.     MOVE.B    (A2)+,40*2(A3)    ; Drucke Zeile 3  "    "
  96.     MOVE.B    (A2)+,40*3(A3)    ; Drucke Zeile 4  "    "
  97.     MOVE.B    (A2)+,40*4(A3)    ; Drucke Zeile 5  "    "
  98.     MOVE.B    (A2)+,40*5(A3)    ; Drucke Zeile 6  "    "
  99.     MOVE.B    (A2)+,40*6(A3)    ; Drucke Zeile 7  "    "
  100.     MOVE.B    (A2)+,40*7(A3)    ; Drucke Zeile 8  "    "
  101.  
  102.     ADDQ.w    #1,A3        ; A3+1, wir gehen um 8 Bit weiter (zum
  103.                 ; nächsten Buchstaben
  104.  
  105.     DBRA    D0,PRINTCHAR2    ; DRUCKEN D0 (80) ZEICHEN PRO ZEILE
  106.  
  107.     ADD.W    #40*7,A3    ; "Return", neue Zeile
  108.  
  109.     DBRA    D3,PRINTZEILE    ; Wir drucken D3 Zeilen
  110.     RTS
  111.  
  112.  
  113. TEXT:
  114.              ; Anzahl Charakter pro Zeile: 40
  115.              ;            1111111111222222222233333333334
  116.              ;   1234567890123456789012345678901234567890
  117.     dc.b    '   ERSTE ZEILE (nur TEXT1)              ' ; 1
  118.     dc.b    '                                        ' ; 2
  119.     dc.b    '     /\  /                              ' ; 3
  120.     dc.b    '    /  \/                               ' ; 4
  121.     dc.b    '                                        ' ; 5
  122.     dc.b    '        SECHSTE ZEILE (beide Bitplanes) ' ; 6
  123.     dc.b    '                                        ' ; 7
  124.     dc.b    '                                        ' ; 8
  125.     dc.b    'FABIO CIUCCI               INTERNATIONAL' ; 9
  126.     dc.b    '                                        ' ; 10
  127.     dc.b    '   1  4 6 89  !@ $ ^& () +| =- ]{       ' ; 11
  128.     dc.b    '                                        ' ; 12
  129.     dc.b    '     I H D N E,  L O BIN I H            ' ; 13
  130.     dc.b    '                                        ' ; 24
  131.     dc.b    '                                        ' ; 15
  132.     dc.b    '  Das Fraeulein stand am Meere,         ' ; 16
  133.     dc.b    '                                        ' ; 17
  134.     dc.b    '    Und seufzte lang und bang,          ' ; 18
  135.     dc.b    '                                        ' ; 19
  136.     dc.b    '    Es ruehrte sie so sehre,            ' ; 20
  137.     dc.b    '                                        ' ; 21
  138.     dc.b    '      Sonnenuntergang.                  ' ; 22
  139.     dc.b    '                                        ' ; 23
  140.     dc.b    '           ...                          ' ; 24
  141.     dc.b    '                                        ' ; 25
  142.     dc.b    '                                        ' ; 26
  143.     dc.b    '                                        ' ; 27
  144.  
  145.  
  146.         EVEN
  147.  
  148. TEXT2:
  149.              ; Anzahl Charakter pro Zeile: 40
  150.              ;            1111111111222222222233333333334
  151.              ;   1234567890123456789012345678901234567890
  152.     dc.b    '                                        ' ; 1
  153.     dc.b    '  ZWEITE ZEILE (nur TEXT2)              ' ; 2
  154.     dc.b    '     /\  /                              ' ; 3
  155.     dc.b    '    /  \/                               ' ; 4
  156.     dc.b    '                                        ' ; 5
  157.     dc.b    '        SECHSTE ZEILE (beide Bitplanes) ' ; 6
  158.     dc.b    '                                        ' ; 7
  159.     dc.b    '                                        ' ; 8
  160.     dc.b    'FABIO        COMMUNICATION INTERNATIONAL' ; 9
  161.     dc.b    '                                        ' ; 10
  162.     dc.b    '   1234567 90  @#$%^&*( _+|\=-[]{}      ' ; 11
  163.     dc.b    '                                        ' ; 12
  164.     dc.b    '     ICH DENKE, ALSO     ICH            ' ; 13
  165.     dc.b    '                                        ' ; 14
  166.     dc.b    '                                        ' ; 15
  167.     dc.b    '  Das           stand am                ' ; 16
  168.     dc.b    '                                        ' ; 17
  169.     dc.b    '    Und s u  te l n  und b  g,          ' ; 18
  170.     dc.b    '                                        ' ; 19
  171.     dc.b    '    Es ruehrte        sehre,            ' ; 20
  172.     dc.b    '                                        ' ; 21
  173.     dc.b    '  Der Sonnen     gang.                  ' ; 22
  174.     dc.b    '                                        ' ; 23
  175.     dc.b    '           ...                          ' ; 24
  176.     dc.b    '                                        ' ; 25
  177.     dc.b    '                                        ' ; 26
  178.     dc.b    '                                        ' ; 27
  179.  
  180.     EVEN
  181.  
  182.  
  183.     SECTION GRAPHIC,DATA_C
  184.  
  185. COPPERLIST:
  186.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  187.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  188.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  189.     dc.w    $13e,$0000
  190.  
  191.     dc.w    $8E,$2c81    ; DiwStrt (Register mit Normalwerten)
  192.     dc.w    $90,$2cc1    ; DiwStop
  193.     dc.w    $92,$0038    ; DdfStart
  194.     dc.w    $94,$00d0    ; DdfStop
  195.     dc.w    $102,0        ; BplCon1
  196.     dc.w    $104,0        ; BplCon2
  197.     dc.w    $108,0        ; Bpl1Mod
  198.     dc.w    $10a,0        ; Bpl2Mod
  199.     
  200.             ; 5432109876543210
  201.     dc.w    $100,%0010001000000000  ; 2 BITPLANES LOWRES, 4 FARBEN
  202.  
  203. BPLPOINTERS:
  204.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane
  205. BPLPOINTERS2:
  206.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane
  207.  
  208.     dc.w    $0180,$000  ; Color0 - SFONDO
  209.     dc.w    $0182,$19a  ; Color1 - SCHRIFT erstes Bitplane (BLAU)
  210.     dc.w    $0184,$f62  ; Color2 - SCHRIFT zweites Bitplane (ORANGE)
  211.     dc.w    $0186,$1e4  ; Color3 - SCHRIFT erstes+zweites Bitplane (GRÜN)
  212.  
  213.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  214.  
  215. ;    Der FONT, Charakter 8x8
  216.  
  217. FONT:
  218. ;    incbin    "metal.fnt"    ; Breiter Zeichensatz
  219. ;    incbin    "normal.fnt"    ; Ähnlich dem aus dem Kickstart 1.3
  220.     incbin    "nice.fnt"    ; Schmaler Zeichensatz
  221.  
  222.     SECTION MEIPLANE,BSS_C    ; Die SECTION BSS können nur aus NULLEN
  223.                 ; bestehen!!! Man verwendet das DS.B um zu
  224.                 ; definieren, wieviele Nullen die Section
  225.                 ; enthalten soll
  226.  
  227. BITPLANE:
  228.     ds.b    40*256    ; ein Bitplane LOWRES 320x256
  229. BITPLANE2:
  230.     ds.b    40*256    ; ein Bitplane LOWRES 320x256
  231.  
  232.     end
  233.  
  234.  
  235. Um  den  Text  in  3  Farben  anzuzeigen  (4,  wenn  man  den  Hintergrund
  236. mitrechnet), braucht man nur ein weiteres Bitplane einschalten, und darauf
  237. den  Text2 drucken. Wenn man nun einige Worte oder Buchstaben ausläßt, sei
  238. es nun im einen oder im anderen Bitplane, dann ergeben  sich  verschiedene
  239. Überlagerungsmuster,  die  jeweils  zu  verschiedenen  Farben  führen. Ihr
  240. erinnert euch ja: Bitplane1 und Bitplane2 aus: Hintergrundfarbe; Bitplane1
  241. aus,  Bitplane2  ein Color1, ... , Bitplane1 ein und Bitplane2 ein Color3.
  242. Um beide Texte auszugeben, verwenden wir  die  gleiche  Routine,  nur  mit
  243. einer kleinen Änderung: die ersten zwei Anweisungen, die den zu druckenden
  244. Text und das ZielBitplane anpointen, werden  herausgenommen  und  vor  dem
  245. Aufruf der PRINT: - Routine selbst hingeschrieben. Die Routine verarbeitet
  246. nun jeden Text, der vorher in a0 geladen wurde (dessen  Adresse,  versteht
  247. sich), und gibt ihn auf das Bitplane aus, auf das a3 pointet.
  248.  
  249.     LEA    TEXT(PC),A0    ; Adresse des zu schreibenden Textes in a0
  250.     LEA    BITPLANE,A3    ; Adresse des Ziel-Bitplanes in a3
  251.     bsr.w    print        ; Bringt den Text auf den Bildschirm
  252.  
  253.     LEA    TEXT2(PC),A0    ; Adresse des zu schreibenden Textes in a0
  254.     LEA    BITPLANE2,A3    ; Adresse des Ziel-Bitplanes in a3
  255.     bsr.w    print        ; Bringt den Text auf den Bildschirm
  256.  
  257. Somit kann die Routine auf jedes Bitplane und  mit  jedem  Text  verwendet
  258. werden,  und  nicht nur ausschließlich mit dem Bitplane "BITPLANE" und den
  259. Text "TEXT"! Beim ersten bsr.w ist alles wie  bei  den  vorigen  Listings,
  260. beim zweiten aber kommt BITPLANE2 und TEXT" zum Zuge. Je nach Überlagerung
  261. der Bitplane kommt es zu einer der folgenden 3 Farben (die erste -  Farbe0
  262. - ist wie immer der Hintergrund):
  263.  
  264.     dc.w    $0180,$000  ; Color0 - SFONDO
  265.     dc.w    $0182,$19a  ; Color1 - SCHRIFT erstes Bitplane (BLAU)
  266.     dc.w    $0184,$f62  ; Color2 - SCHRIFT zweites Bitplane (ORANGE)
  267.     dc.w    $0186,$1e4  ; Color3 - SCHRIFT erstes+zweites Bitplane (GRÜN)
  268.  
  269. Um das alles ein bißchen besser zu sehen, versucht, das zweite Bitplane um
  270. 5 Pixel nach oben zu verschieben:
  271.  
  272.  
  273.     MOVE.L  #BITPLANE2+(40*5),d0
  274.  
  275.  
  276.