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

  1.  
  2. ; Listing6a.s    GEBEN EINEN BUCHSTABEN 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.  
  22.     move.w    d0,6(a1)    ; kopiert das niederwertige Word der Plane-
  23.                 ; Adresse ins richtige Word der Copperlist
  24.     swap    d0        ; vertauscht die 2 Word in d0 (1234 > 3412)
  25.  
  26.     move.w    d0,2(a1)    ; kopiert das hochwertige Word der Adresse des 
  27.                 ; Plane in das richtige Word in der Copperlist
  28.  
  29.     move.l    #COPPERLIST,$dff080    ; COP1LC - "Zeiger" auf unsere COP
  30.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  31.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  32.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  33.  
  34.     bsr.w    print        ; Bringt das Wort auf den Bildschirm
  35.  
  36. mouse:
  37.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  38.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  39.  
  40.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  41.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  42.  
  43.     move.l    4.w,a6
  44.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  45.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  46.                 ; (Libraries werden geöffnet UND geschlossen!)
  47.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  48.     rts
  49.  
  50. ; DATEN
  51.  
  52. GfxName:
  53.     dc.b    "graphics.library",0,0
  54.  
  55. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  56.     dc.l    0    ; ab hier werden die Offsets gemacht
  57.  
  58. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  59.     dc.l    0    ; Betriebssystemes
  60.  
  61. ;    Routine, die 8x8 Pixel große Buchstaben druckt
  62.  
  63. TEXT:
  64.     dc.b    'A'    ; der zu schreibende Text. Hier ist es nur ein "A",
  65.             ; also $41
  66.  
  67.     EVEN    ; biege die Adresse auf gerade
  68.  
  69. PRINT:
  70.     LEA    TEXT(PC),A0    ; Adresse des zu schreibenden Textes in a0
  71.     LEA    BITPLANE,A3    ; Adresse des Ziel-Bitplanes in a3
  72.     MOVEQ    #0,D2        ; Lösche 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.     RTS
  94.  
  95.  
  96.     SECTION GRAPHIC,DATA_C
  97.  
  98. COPPERLIST:
  99.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  100.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  101.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  102.     dc.w    $13e,$0000
  103.  
  104.     dc.w    $8E,$2c81    ; DiwStrt
  105.     dc.w    $90,$2cc1    ; DiwStop
  106.     dc.w    $92,$0038    ; DdfStart
  107.     dc.w    $94,$00d0    ; DdfStop
  108.     dc.w    $102,0        ; BplCon1
  109.     dc.w    $104,0        ; BplCon2
  110.     dc.w    $108,0        ; Bpl1Mod
  111.     dc.w    $10a,0        ; Bpl2Mod
  112.              ; 5432109876543210
  113.     dc.w    $100,%0001001000000000  ; 1 Bitplane LOWRES 320x256
  114.  
  115.  
  116. BPLPOINTERS:
  117.     dc.w $e0,$0000,$e2,$0000    ;erstes Bitplane
  118.  
  119.     dc.w    $0180,$000    ; color0 - HINTERGRUND
  120.     dc.w    $0182,$19a    ; color1 - SCHRIFTEN
  121.  
  122.  
  123.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  124.  
  125. ;    Der FONT, Charakter 8x8
  126.  
  127. FONT:
  128.     incbin    "nice.fnt"    ; ohne ALT-Charakter
  129.  
  130.     SECTION MEIPLANE,BSS_C    ; Die SECTION BSS können nur aus NULLEN
  131.                 ; bestehen!!! Man verwendet das DS.B um zu
  132.                 ; definieren, wieviele Nullen die Section
  133.                 ; enthalten soll
  134.  
  135. BITPLANE:
  136.     ds.b    40*256    ; ein Bitplane LowRes 320x256
  137.  
  138.     end
  139.  
  140.  
  141. Und  ein  "A" erscheint am Monitor!!! In der linken oberen Ecke. Ihr könnt
  142. den "Text" ändern, aber es ist keine große Neuheit, ein  "B"  statt  einem
  143. "A" zu drucken.
  144.  
  145. * ÄNDERUNG 1:
  146.  
  147. Probiert,  nur  den  halben Charakter zu drucken, also nur die ersten vier
  148. Zeilen:
  149.  
  150.  
  151.     MOVE.B    (A2)+,(A3)    ; Drucke Zeile 1 des Buchstaben
  152.     MOVE.B    (A2)+,40(A3)    ; Drucke Zeile 2  "    "
  153.     MOVE.B    (A2)+,40*2(A3)    ; Drucke Zeile 3  "    "
  154.     MOVE.B    (A2)+,40*3(A3)    ; Drucke Zeile 4  "    "
  155. ;    MOVE.B    (A2)+,40*4(A3)    ; Drucke Zeile 5  "    "
  156. ;    MOVE.B    (A2)+,40*5(A3)    ; Drucke Zeile 6  "    "
  157. ;    MOVE.B    (A2)+,40*6(A3)    ; Drucke Zeile 7  "    "
  158. ;    MOVE.B    (A2)+,40*7(A3)    ; Drucke Zeile 8  "    "
  159.     
  160. Jede Zeile ist ein Byte, also 4 BIT
  161.  
  162.     12345678
  163.  
  164.     ...###.. Zeile  1 - 8 Bit, 1 Byte
  165.     ..#...#. 2
  166.     ..#...#. 3
  167.     ..#####. 4
  168.     ..#...#. 5
  169.     ..#...#. 6
  170.     ..#...#. 7
  171.     ........ 8
  172.  
  173. * ÄNDERUNG 2:
  174.  
  175. Probiert, das EVEN nach dem String zu entfernen:
  176.  
  177.     dc.b    "A"
  178.  
  179. Beim assemblieren wird euch der ASMONE einen Fehler  mitteilen:  "Word  at
  180. ODD  Address",  oder  "UNGERADE  ADRESSE!!".  Also  einfach entweder einen
  181. Nuller hinten dran oder EVEN schreiben.
  182.  
  183.  
  184. * ÄNDERUNG 3:
  185.  
  186. Um  die  Position  des  "A"  zu  verändern, muß man nur das Ziel von PRINT
  187. verändern:
  188.  
  189. PRINT:
  190.     LEA    TEXT(PC),A0
  191.     LEA    BITPLANE+(40*120),A3 ; Zieladresse
  192.  
  193. Somit kommt das A 120 Zeilen weiter unten ins Bild, mitten im Monitor.  Um
  194. den Buchstaben vorrücken zu lassen, braucht es noch einige Bytes:
  195.  
  196.     LEA    BITPLANE+19+(40*120),A3 ; Zieladresse
  197.  
  198. Auf diese Art rücken wir ihn 19 Bytes weiter nach rechts, und er wird  ins
  199. zwanzigste  Byte geschrieben, also in der Mitte (Ein LowRes ist ja 40 Byte
  200. breit).
  201.  
  202. * ÄNDERUNG 4:
  203.  
  204. Probieren wir, den Buchstaben in einem HIRES-Bitplane darzustellen: um das
  205. zu tun, macht folgendes:
  206.  
  207.  
  208. In  der  Routine  werden  die  40er  mit  80ern  ausgewechselt,    da    der
  209. HiRes-Schirm ja 80 Byte breit ist:
  210.  
  211.     MOVE.B    (A2)+,(A3)    ; Drucke Zeile 1 des Buchstaben
  212.     MOVE.B    (A2)+,80(A3)    ; Drucke Zeile 2  "    "
  213.     MOVE.B    (A2)+,80*2(A3)    ; Drucke Zeile 3  "    "
  214.     MOVE.B    (A2)+,80*3(A3)    ; Drucke Zeile 4  "    "
  215.     MOVE.B    (A2)+,80*4(A3)    ; Drucke Zeile 5  "    "
  216.     MOVE.B    (A2)+,80*5(A3)    ; Drucke Zeile 6  "    "
  217.     MOVE.B    (A2)+,80*6(A3)    ; Drucke Zeile 7  "    "
  218.     MOVE.B    (A2)+,80*7(A3)    ; Drucke Zeile 8  "    "
  219.  
  220.  
  221. In der Copperlist: BIT 15 in BPLCON0 setzen, aktivieren das HIRES
  222.  
  223.             ; 5432109876543210
  224.     dc.w    $100,%1001001000000000  ; 1 Bitplane HIRES 640x256
  225.  
  226. Dann  nicht  das  DDFSTART/DDFSTOP  für  den  HiRes  vergessen!  Ansonsten
  227. schneidet  ihr  mir  die ersten Zeilen links ab! Wenn ihr diese Änderungen
  228. nicht anbringt, dann wird das "A" nicht erscheinen, wenn es sich am linken
  229. Rand befindet.
  230.  
  231.     dc.w    $92,$003c    ; DdfStart HIRES normal
  232.     dc.w    $94,$00d4    ; DdfStop HIRES normal
  233.  
  234. Zum  Schluß  och  die  SECTION BSS: wir müßen sie klarerweise das BITPLANE
  235. vergrößern!
  236.  
  237.     ds.b    80*256    ; ein Bitplane Hires 640x256
  238.  
  239.  
  240.