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

  1.  
  2. ; Listing6c.s    GEBEN MEHRERE ZEILEN 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    #23-1,D3    ; ANZAHL DER ZEILEN, DIE ZU DRUCKEN SIND -> 23
  67. PRINTZEILE:
  68.     MOVEQ    #40-1,D0    ; ANZAHL DER SPALTEN EINER ZEILE: 40 (also die
  69.                 ; Anzahl der Buchstaben, die in einer Zeile
  70.                 ; Platz haben).
  71. PRINTCHAR2:
  72.     MOVEQ    #0,D2        ; Löscht D2
  73.     MOVE.B    (A0)+,D2    ; Nächster Charakter in d2
  74.     SUB.B    #$20,D2        ; ZÄHLE 32 VOM ASCII-WERT DES BUCHSTABEN WEG,
  75.                 ; SOMIT VERWANDELN WIR Z.B. DAS LEERZEICHEN
  76.                 ; (Das $20 entspricht), IN $00, DAS
  77.                 ; MALZEICHEN ($21) IN $01...
  78.     MULU.W    #8,D2        ; MULTIPLIZIERE DIE ERHALTENE ZAHL MIT 8,
  79.                 ; da die Charakter ja 8 Pixel hoch sind
  80.     MOVE.L    D2,A2
  81.     ADD.L    #FONT,A2    ; FINDE DEN GEWÜNSCHTEN BUCHSTEBEN IM FONT
  82.  
  83.                 ; DRUCKE DEN BUCHSTABEN ZEILE FÜR ZEILE
  84.     MOVE.B    (A2)+,(A3)    ; Drucke Zeile 1 des Buchstaben
  85.     MOVE.B    (A2)+,40(A3)    ; Drucke Zeile 2  "    "
  86.     MOVE.B    (A2)+,40*2(A3)    ; Drucke Zeile 3  "    "
  87.     MOVE.B    (A2)+,40*3(A3)    ; Drucke Zeile 4  "    "
  88.     MOVE.B    (A2)+,40*4(A3)    ; Drucke Zeile 5  "    "
  89.     MOVE.B    (A2)+,40*5(A3)    ; Drucke Zeile 6  "    "
  90.     MOVE.B    (A2)+,40*6(A3)    ; Drucke Zeile 7  "    "
  91.     MOVE.B    (A2)+,40*7(A3)    ; Drucke Zeile 8  "    "
  92.  
  93.     ADDQ.w    #1,A3        ; A3+1, wir gehen um 8 Bit weiter (zum
  94.                 ; nächsten Buchstaben
  95.  
  96.     DBRA    D0,PRINTCHAR2    ; DRUCKEN D0 (40) ZEICHEN PRO ZEILE
  97.  
  98.     ADD.W    #40*7,A3    ; "Return", neue Zeile
  99.  
  100.     DBRA    D3,PRINTZEILE    ; Wir drucken D3 Zeilen
  101.     RTS
  102.  
  103.  
  104. TEXT:
  105.              ;            1111111111222222222233333333334
  106.              ;   1234567890123456789012345678901234567890
  107.     dc.b    '   ERSTE ZEILE                          ' ; 1
  108.     dc.b    '                ZWEITE ZEILE            ' ; 2
  109.     dc.b    '     /\  /                              ' ; 3
  110.     dc.b    '    /  \/                               ' ; 4
  111.     dc.b    '                                        ' ; 5
  112.     dc.b    '        SECHSTE ZEILE                   ' ; 6
  113.     dc.b    '                                        ' ; 7
  114.     dc.b    '                                        ' ; 8
  115.     dc.b    'FABIO CIUCCI COMMUNICATION INTERNATIONAL' ; 9
  116.     dc.b    '                                        ' ; 10
  117.     dc.b    '   1234567890 !@#$%^&*()_+|\=-[]{}      ' ; 11
  118.     dc.b    '                                        ' ; 12
  119.     dc.b    '   PREISFRAGE: WER KENNT DEN AUTOR?     ' ; 15
  120.     dc.b    '                                        ' ; 25
  121.     dc.b    '                                        ' ; 16
  122.     dc.b    '  Das Fraeulein stand am Meere          ' ; 17
  123.     dc.b    '                                        ' ; 18
  124.     dc.b    '  Und seufzte lang und bang.            ' ; 19
  125.     dc.b    '                                        ' ; 20
  126.     dc.b    '  Es RueHrtE sIe sO sEhRe               ' ; 21
  127.     dc.b    '                                        ' ; 22
  128.     dc.b    '  der Sonnenuntergang.                  ' ; 23
  129.     dc.b    '                                        ' ; 24
  130.     dc.b    '        ...                             ' ; 25
  131.     dc.b    '                                        ' ; 26
  132.     dc.b    '                                        ' ; 27
  133.  
  134.     EVEN
  135.  
  136.  
  137.  
  138.     SECTION GRAPHIC,DATA_C
  139.  
  140. COPPERLIST:
  141.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  142.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  143.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  144.     dc.w    $13e,$0000
  145.  
  146.     dc.w    $8E,$2c81    ; DiwStrt
  147.     dc.w    $90,$2cc1    ; DiwStop
  148.     dc.w    $92,$0038    ; DdfStart
  149.     dc.w    $94,$00d0    ; DdfStop
  150.     dc.w    $102,0        ; BplCon1
  151.     dc.w    $104,0        ; BplCon2
  152.     dc.w    $108,0        ; Bpl1Mod
  153.     dc.w    $10a,0        ; Bpl2Mod
  154.             ; 5432109876543210
  155.     dc.w    $100,%0001001000000000  ; 1 Bitplane LOWRES 320x256
  156.  
  157. BPLPOINTERS:
  158.     dc.w $e0,$0000,$e2,$0000    ;erstes Bitplane
  159.  
  160.     dc.w    $0180,$000    ; color0 - HINTERGRUND
  161.     dc.w    $0182,$19a    ; color1 - SCHRIFTEN
  162.  
  163.     dc.w    $6c07,$fffe    ; Farbverlauf auf Textzeile 9
  164.     dc.w    $182,$451    ; Zeile1 des Charakters
  165.     dc.w    $6d07,$fffe
  166.     dc.w    $182,$671    ; Zeile 2
  167.     dc.w    $6e07,$fffe
  168.     dc.w    $182,$891    ; Zeile 3
  169.     dc.w    $6f07,$fffe
  170.     dc.w    $182,$ab1    ; Zeile 4
  171.     dc.w    $7007,$fffe
  172.     dc.w    $182,$781    ; Zeile 5
  173.     dc.w    $7107,$fffe
  174.     dc.w    $182,$561    ; Zeile 6
  175.     dc.w    $7207,$fffe
  176.     dc.w    $182,$451    ; Zeile 7  die letzte, weil die achte auf
  177.                 ;  NULL steht, um einen Abstand zwischen
  178.                 ;  den Buchstaben zu lassen
  179.  
  180.     dc.w    $7307,$fffe
  181.     dc.w    $182,$19a    ; Normale Farbe
  182.  
  183.     dc.w    $8c07,$fffe    ; Farbverlauf auf Textzeile 11
  184.     dc.w    $182,$516    ; Zeile1 des Buchstaben
  185.     dc.w    $8d07,$fffe
  186.     dc.w    $182,$739    ; Zeile 2
  187.     dc.w    $8e07,$fffe
  188.     dc.w    $182,$95b    ; Zeile 3
  189.     dc.w    $8f07,$fffe
  190.     dc.w    $182,$c6f    ; Zeile 4
  191.     dc.w    $9007,$fffe
  192.     dc.w    $182,$84a    ; Zeile 5
  193.     dc.w    $9107,$fffe
  194.     dc.w    $182,$739    ; Zeile 6
  195.     dc.w    $9207,$fffe
  196.     dc.w    $182,$517    ; Zeile 7  die letzte, weil die achte auf NULL
  197.  
  198.     dc.w    $9307,$fffe
  199.     dc.w    $182,$19a    ; Normale Farbe
  200.  
  201.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  202.  
  203. ;    Der FONT, Charakter 8x8
  204.  
  205. FONT:
  206. ;    incbin    "metal.fnt"    ; breite Charakter
  207. ;    incbin    "normal.fnt"    ; ähnlich den Kickstart 1.3 Fonts
  208.     incbin    "nice.fnt"    ; schmale Charakter
  209.  
  210.     SECTION MEIPLANE,BSS_C    ; Die SECTION BSS können nur aus NULLEN
  211.                 ; bestehen!!! Man verwendet das DS.B um zu
  212.                 ; definieren, wieviele Nullen die Section
  213.                 ; enthalten soll
  214.  
  215. BITPLANE:
  216.     ds.b    40*256    ; ein Bitplane LowRes 320x256
  217.  
  218.     end
  219.  
  220. Wie ihr gesehen habt,ist der Umstand, daß der Font nur in einer Farbe ist, noch
  221. lange kein Grund, um nicht mit dem Copper etwas Farbe ins Spiel zu bringen!
  222.  
  223. Um mehrere Zeilen  zu  schreiben,  muß  man  nur "Zeile-wechseln" und dann die
  224. nächste auf den Schirm pulvern! Das wiederholt sich D3 Mal.
  225.  
  226.     ADD.W    #40*7,A3    ; "RETURN"
  227.     DBRA    D3,PRINTZEILE    ; MACHEN D3 ZEILEN
  228.  
  229. Bemerkung: Um eine neue Zeile zu nehmen, also "RETURN", muß man 7 Zeilen  nach
  230. unten  gehen. Mit neuer  Zeile  meinte ich TEXTZEILE, 8 Pixel hoch, die andere
  231. Zeile war die effektive VideoZeile.
  232.  
  233. Darum braucht es ein "ADD.W #40*7,A3" für ein RETURN:
  234.  
  235. Das Probelm besteht darin, daß man den Eindruck haben könnte, man befinde sich
  236. mit A3 schon auf der untersten V-Zeile des zuletzt gedruckten Buchstaben,und es
  237. reiche, eine einzige nach unten zu gehen, um sich in die nächsten  Textzeile zu
  238. begeben. Aber in A3 ist und bleibt immer nur die Adresse der ersten V-Zeile des
  239. Charakters, denn die weiteren 7 werden ja mittels OFFSET erzeugt:
  240.  
  241.     MOVE.B    (A2)+,(A3)    ; Drucke Zeile 1 des Buchstaben
  242.     MOVE.B    (A2)+,40(A3)    ; Drucke Zeile 2  "    "
  243.     MOVE.B    (A2)+,40*2(A3)    ; Drucke Zeile 3  "    "
  244.     MOVE.B    (A2)+,40*3(A3)    ; Drucke Zeile 4  "    "
  245.     MOVE.B    (A2)+,40*4(A3)    ; Drucke Zeile 5  "    "
  246.     MOVE.B    (A2)+,40*5(A3)    ; Drucke Zeile 6  "    "
  247.     MOVE.B    (A2)+,40*6(A3)    ; Drucke Zeile 7  "    "
  248.     MOVE.B    (A2)+,40*7(A3)    ; Drucke Zeile 8  "    "
  249.  
  250. Aber in Register  A3  steht immer die Adresse der ersten Zeile. Denn jedesmal,
  251. wenn ein Buchstabe gedruckt wird, dann begeben wir uns zum nächsten  Charakter,
  252. indem wir 8  Bit, also ein Byte, zur Adresse in A3 dazuzählen. Diese wird dann
  253. auf die erste (Video)Zeile dieses Buchstaben pointen.
  254.  
  255.     ADDQ.w    #1,A3        ; A3+1, wir gehen um 8 Bit weiter (zum
  256.                 ; nächsten Buchstaben
  257.  
  258. An diesem Punkt, um den "nächsten Charakter" zu drucken, braucht  man  nur  die
  259. Routine mit  den  Offsets zu wiederholen. Schauen wir die Situation genauer an,
  260. wenn wir den Buchstaben ganz rechts  gedruckt  haben,  also den  letzten  einer
  261. T-Zeile: in A3 haben wir die Adresse des letzten Buchstaben,und nach den ganzen
  262. Offsets kommt die Anweisung zum  Zuge,  die  A3  um  8  Bit weitersetzt.  Damit
  263. befinden wir uns aber schon in der nächsten V-Zeile, aber ganz links,weil es ja
  264. "zu weit" gerutscht ist! Deswegen brauchen wir nur 7 -und nicht 8- dazuzählen,
  265. weil  wir uns ja schon auf der "zweiten" VideoZeile nach der gerade gedruckten
  266. Textzeile befinden.
  267.  
  268.