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

  1.  
  2. ; Listing6b.s    GEBEN EINEN GANZE ZEILE TEXT AM BILDSCHIRM AUS!!!
  3.  
  4.     SECTION    CIPundCOP,CODE
  5.  
  6. Anfang:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  9.     lea    GfxName(PC),a1    ; Adresse des Namen der zu öffnenden Lib in a1
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  12.     move.l    d0,a6
  13.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  14.                 ; des Betriebssystemes
  15.  
  16. ;    POINTEN AUF UNSERE BITPLANES
  17.  
  18.     MOVE.L    #BITPLANE,d0    ; in d0 kommt die Adresse unseres Bitplane
  19.     LEA    BPLPOINTERS,A1    ; in a1 kommt die Adresse der Bitplane-
  20.                 ; Pointer der Copperlist
  21.     move.w    d0,6(a1)    ; kopiert das niederwertige Word der Plane-
  22.                 ; Adresse ins richtige Word der Copperlist
  23.     swap    d0        ; vertauscht die 2 Word in d0 (1234 > 3412)
  24.  
  25.     move.w    d0,2(a1)    ; kopiert das hochwertige Word der Adresse des 
  26.                 ; Plane in das richtige Word in der Copperlist
  27.  
  28.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  29.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  30.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  31.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  32.  
  33.     bsr.w    print        ; Bringt die Zeile auf den Bildschirm
  34.  
  35. mouse:
  36.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  37.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  38.  
  39.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  40.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  41.  
  42.     move.l    4.w,a6
  43.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  44.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  45.                 ; (Libraries werden geöffnet UND geschlossen!)
  46.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  47.     rts
  48.  
  49. ; DATEN
  50.  
  51. GfxName:
  52.     dc.b    "graphics.library",0,0    
  53.  
  54. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  55.     dc.l    0    ; ab hier werden die Offsets gemacht
  56.  
  57. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  58.     dc.l    0    ; Betriebssystemes
  59.  
  60. ;    Routine, die 8x8 Pixel große Buchstaben druckt
  61.  
  62.  
  63. PRINT:
  64.     LEA    TEXT(PC),A0    ; Adresse des zu schreibenden Textes in a0
  65.     LEA    BITPLANE,A3    ; Adresse des Ziel-Bitplanes in a3
  66.     MOVEQ    #40-1,D0    ; ANZAHL DER SPALTEN EINER ZEILE: 40 (also die
  67.                 ; Anzahl der Buchstaben, die in einer Zeile
  68.                 ; Platz haben).
  69. PRINTCHAR2:
  70.     MOVEQ    #0,D2        ; Löscht D2
  71.     MOVE.B    (A0)+,D2    ; Nächster Charakter in d2
  72.     SUB.B    #$20,D2        ; ZÄHLE 32 VOM ASCII-WERT DES BUCHSTABEN WEG,
  73.                 ; SOMIT VERWANDELN WIR Z.B. DAS LEERZEICHEN
  74.                 ; (Das $20 entspricht), IN $00, DAS
  75.                 ; MALZEICHEN ($21) IN $01...
  76.     MULU.W    #8,D2        ; MULTIPLIZIERE DIE ERHALTENE ZAHL MIT 8,
  77.                 ; da die Charakter ja 8 Pixel hoch sind
  78.     MOVE.L    D2,A2
  79.     ADD.L    #FONT,A2    ; FINDE DEN GEWÜNSCHTEN BUCHSTEBEN IM FONT
  80.  
  81.                 ; DRUCKE DEN BUCHSTABEN ZEILE FÜR ZEILE
  82.     MOVE.B    (A2)+,(A3)    ; Drucke Zeile 1 des Buchstaben
  83.     MOVE.B    (A2)+,40(A3)    ; Drucke Zeile 2  "    "
  84.     MOVE.B    (A2)+,40*2(A3)    ; Drucke Zeile 3  "    "
  85.     MOVE.B    (A2)+,40*3(A3)    ; Drucke Zeile 4  "    "
  86.     MOVE.B    (A2)+,40*4(A3)    ; Drucke Zeile 5  "    "
  87.     MOVE.B    (A2)+,40*5(A3)    ; Drucke Zeile 6  "    "
  88.     MOVE.B    (A2)+,40*6(A3)    ; Drucke Zeile 7  "    "
  89.     MOVE.B    (A2)+,40*7(A3)    ; Drucke Zeile 8  "    "
  90.  
  91.     ADDQ.w    #1,A3        ; A3+1, wir gehen um 8 Bit weiter (zum
  92.                 ; nächsten Buchstaben
  93.  
  94.     DBRA    D0,PRINTCHAR2    ; DRUCKEN D0 (40) ZEICHEN PRO ZEILE
  95.     RTS
  96.  
  97.  
  98. TEXT:
  99.         ;         1111111111222222222233333333334
  100.         ;1234567890123456789012345678901234567890
  101.     dc.b    '   ERSTE ZEILE AM MONITOR! 123 PROBE    '
  102.  
  103.     EVEN
  104.  
  105.  
  106.     SECTION GRAPHIC,DATA_C
  107.  
  108. COPPERLIST:
  109.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  110.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  111.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  112.     dc.w    $13e,$0000
  113.  
  114.     dc.w    $8E,$2c81    ; DiwStrt
  115.     dc.w    $90,$2cc1    ; DiwStop
  116.     dc.w    $92,$0038    ; DdfStart
  117.     dc.w    $94,$00d0    ; DdfStop
  118.     dc.w    $102,0        ; BplCon1
  119.     dc.w    $104,0        ; BplCon2
  120.     dc.w    $108,0        ; Bpl1Mod
  121.     dc.w    $10a,0        ; Bpl2Mod
  122.             ; 5432109876543210
  123.     dc.w    $100,%0001001000000000  ; 1 Bitplane LOWRES 320x256
  124.  
  125. BPLPOINTERS:
  126.     dc.w $e0,$0000,$e2,$0000    ;erstes Bitplane
  127.  
  128.     dc.w    $0180,$000    ; color0 - HINTERGRUND
  129.     dc.w    $0182,$19a    ; color1 - SCHRIFTEN
  130.  
  131.  
  132.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  133.  
  134. ;    Der FONT, Charakter 8x8
  135.  
  136. FONT:
  137. ;    incbin    "metal.fnt"    ; breite Charakter
  138. ;    incbin    "normal.fnt"    ; ähnlich den Kickstart 1.3 Fonts
  139.     incbin    "nice.fnt"    ; schmale Charakter
  140.  
  141.     SECTION MEIPLANE,BSS_C    ; Die SECTION BSS können nur aus NULLEN
  142.                 ; bestehen!!! Man verwendet das DS.B um zu
  143.                 ; definieren, wieviele Nullen die Section
  144.                 ; enthalten soll
  145.  
  146. BITPLANE:
  147.     ds.b    40*256    ; ein Bitplane LowRes 320x256
  148.  
  149.     end
  150.  
  151.  
  152. In eine Zeile kann man viel schreiben. Um 40 Zeichen zu drucken, reicht ein
  153. DBRA-Zyklus, hier PRINTCHAR2 genannt:
  154.  
  155.     MOVEQ    #40-1,D0    ; ANZAHL DER SPALTEN PRO ZEILE: 40
  156. PRINTCHAR2:
  157.  
  158. Da  jeder  Buchstabe  1  Byte  "breit" ist, haben in einer LowRes-Zeile 40
  159. solche Buchstaben Platz, in  einer  HiRes-Zeile  80.  Bevor  die  Schleife
  160. wiederholt    wird,  die  einen  Buchstaben  ausgibt,  wird  noch  ein  ADD
  161. ausgeführt, das unseren imaginären Cursor  ein  Byte  weiter  schiebt,  um
  162. diesen neben den vorher gedruckten plaziert:
  163.  
  164.     ADDQ.w    #1,A3        ; A1+1, weiter um 8 Bit (NÄCHSTER CHARAKTER)
  165.  
  166.     DBRA    D0,PRINTCHAR2    ; DRUCKEN D0 (40) ZEICHEN PRO ZEILE
  167.  
  168.  
  169. Ihr könnt aus drei verschiedenen Fonts  auswählen,  einfach  einen  der  ;
  170. entfernen, wenn euch dieser Font interessiert, die anderen "ausklammern".
  171.  
  172. Wenn  ihr  es mit HiRes versuchen wollt, dann macht die Änderungen, wie in
  173. Listing6a.s beschrieben. Damit habt ihr jetzt 80 Zeichen pro Zeile  platz.
  174. Dafür müßt ihr aber den PRINTCHAR-Loop verändern: MOVEQ #80-1,d0. Den Text
  175. könnt ihr auch in zwei Zeilen schreiben:
  176.  
  177.     dc.b    ' ERSTE ZEILE am Bildschirm!! 123 Probe  ' 0-40
  178.     dc.b    ' ich bin immer noch auf der ersten Zeile' 41-80
  179.  
  180.     dc.b    " ZWEITE ZEILE!.........................."
  181.     dc.b    "........................................"
  182.  
  183.     dc.b    " DRITTE ZEILE!.... etcetera.
  184.  
  185.