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

  1.  
  2. ; Listing6p.s    DRUCKEN EINEN BUCHSTABEN PRO FRAME AUF DEN
  3. ;        BILDSCHIRM
  4.  
  5.  
  6.     SECTION    CIPundCOP,CODE
  7.  
  8. Anfang:
  9.     move.l    4.w,a6        ; Execbase
  10.     jsr    -$78(a6)    ; Disable
  11.     lea    GfxName(PC),a1    ; Namen der Lib
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,GfxBase    ;
  14.     move.l    d0,a6
  15.     move.l    $26(a6),OldCop    ; speichern die alte COP
  16.  
  17.  
  18. ;    POINTEN AUF UNSERE BITPLANES
  19.  
  20.     MOVE.L    #BITPLANE,d0
  21.     LEA    BPLPOINTERS,A1    ; COP - Pointer
  22.     move.w    d0,6(a1)
  23.     swap    d0        
  24.     move.w    d0,2(a1)    
  25.  
  26.     move.l    #COPPERLIST,$dff080    ; COP1LC - unsere COP
  27.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  28.     move.w    #0,$dff1fc        ; FMODE - Deaktiviert das AGA
  29.     move.w    #$c00,$dff106        ; BPLCON3 - Deaktiviert das AGA
  30.  
  31. mouse:
  32.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  33.     bne.s    mouse
  34.  
  35.     bsr.w    PRINTCharakter    ; Drucken einen Buchstaben pro Frame
  36.  
  37. Warte:
  38.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  39.     beq.s    Warte        
  40.  
  41.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  42.     bne.s    mouse
  43.  
  44.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  45.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  46.  
  47.     move.l    4.w,a6
  48.     jsr    -$7e(a6)    ; Enable
  49.     move.l    GfxBase(PC),a1
  50.     jsr    -$19e(a6)    ; Closelibrary 
  51.     rts
  52.  
  53.  
  54. ; DATEN
  55.  
  56.  
  57.  
  58. GfxName:
  59.     dc.b    "graphics.library",0,0
  60.  
  61. GfxBase:
  62.     dc.l    0
  63.  
  64. OldCop:
  65.     dc.l    0
  66.  
  67.  
  68. ; Diese Routine ist eine Art Mischling zwischen der normalen PRINT-Routine
  69. ; und der Tabellenroutine, denn wir verwenden einen Text auf dieselbe Art
  70. ; wie es bei der Tabelle der Fall war, einen Wert nach dem anderen, einen
  71. ; pro Fotogramm, und der kommt dann auf den Screen. Des Weiteren müssen wir
  72. ; auch die Adresse im Bitplane der letzten vom Print erreichten Position 
  73. ; abspeichern, um den nächsten genau nach ihn setzen zu können. Um zwischen
  74. ; einem Frame und dem anderen die Adresse im Text und im Bitplane zu merken,
  75. ; verwenden wir zwei Longword als Pointer:
  76. ;
  77. ; PointeText:
  78. ;    dc.l    TEXT
  79. ;
  80. ; PointeBitplane:
  81. ;    dc.l    BITPLANE
  82. ;
  83. ; Jedesmal, wenn die Routine ausgeführt wird, wird ein Buchstabe
  84. ; gedruckt, und es wird der Pointer auf TEXT "upgedatet" (mit einem
  85. ; ADDQ.L #1, das ihn auf den nächsten Buchstaben bringt, da einer
  86. ; genau 1 Byte lang ist) und auch der Pointer auf das Bitplane, denn
  87. ; jeder Buchstaben hat seinen Platz im Bitplane.
  88. ; Das erste Problem besteht darin, daß alle 40 Zeichen eine neue (Text-)
  89. ; Zeile genommen werden muß, also 40*7 Bytes zum Bitplanepointer dazugezählt
  90. ; werden muß. Um dieses Problem zu lösen wurde einfach eine NULL am Ende
  91. ; einer jeden Textzeile angehängt, die uns mitteilt, daß wir am Ende sind
  92. ; und wir 40*7 zum Bitplanepointer und 1 zum Textpointer dazuzählen müssen.
  93. ; Das zweite Problem war, daß wir aufhören müssen Buchstaben zu drucken,
  94. ; wenn wir am Ende des Textes angekommen sind. Per Konvention schließen wir
  95. ; somit die Zeile statt mit $00 mit $FF ab, somit können wir die Routine
  96. ; verlassen, wenn wir dieses "Zeichen" erreichen. Einfach das gelesene Byte
  97. ; kontrollieren, und wenn es $FF ergibt, nichts mehr drucken, keine Pointer
  98. ; verstellen, nix mehr. Wenn wir nun beim nächsten Durchgang wieder auf $FF
  99. ; treffen ( weil wir den Pointer nicht vorgestellt haben), wird wieder nichts 
  100. ; getan, usw.
  101. ; Ihr könnt euch mehrere solcher "Spezialzeichen" erfinden, Hauptsache,
  102. ; sie liegen nicht im Bereich zwischen $20 und $80, also den Buchstaben
  103. ; gewideten Bytes.
  104.  
  105.  
  106. PRINTCharakter:
  107.     MOVE.L    PointeText(PC),A0 ; Adresse des zu druckenden Textes in a0
  108.     MOVEQ    #0,D2        ; Lösche d2
  109.     MOVE.B    (A0)+,D2    ; Nächster Buchstaben in d2
  110.     CMP.B    #$ff,d2        ; Ende-Text Signal? ($FF)
  111.     beq.s    EndeTEXT    ; Wenn ja, raus, ohne was zu drucken
  112.     TST.B    d2        ; Ende-Zeile Signal? ($00)
  113.     bne.s    NichtEndeZeile    ; Wenn nicht, nimm keine neue (Text-)Zeile
  114.  
  115.     ADD.L    #40*7,PointeBitplane    ; NEUE TEXTZEILE
  116.     ADDQ.L    #1,PointeText        ; erster Buchstabe in der neuen Zeile
  117.                     ; (überspringen die NULL)
  118.     move.b    (a0)+,d2        ; erster Buchstabe in der neuen Zeile
  119.                     ; (überspringen die NULL)
  120.  
  121. NichtEndeZeile:
  122.     SUB.B    #$20,D2        ; ZÄHLE 32 VOM ASCII-WERT DES BUCHSTABEN WEG,
  123.                 ; SOMIT VERWANDELN WIR Z.B. DAS LEERZEICHEN
  124.                 ; (Das $20 entspricht), IN $00, DAS
  125.                 ; MALZEICHEN ($21) IN $01...
  126.     MULU.W    #8,D2        ; MULTIPLIZIERE DIE ERHALTENE ZAHL MIT 8,
  127.                 ; da die Charakter ja 8 Pixel hoch sind
  128.     MOVE.L    D2,A2
  129.     ADD.L    #FONT,A2    ; FINDE DEN GEWÜNSCHTEN BUCHSTEBEN IM FONT
  130.  
  131.     MOVE.L    PointeBitplane(PC),A3 ; Adresse des Ziel-Bitplane in a3
  132.  
  133.                 ; DRUCKE DEN BUCHSTABEN ZEILE FÜR ZEILE
  134.     MOVE.B    (A2)+,(A3)    ; Drucke Zeile 1 des Buchstaben
  135.     MOVE.B    (A2)+,40(A3)    ; Drucke Zeile 2  "    "
  136.     MOVE.B    (A2)+,40*2(A3)    ; Drucke Zeile 3  "    "
  137.     MOVE.B    (A2)+,40*3(A3)    ; Drucke Zeile 4  "    "
  138.     MOVE.B    (A2)+,40*4(A3)    ; Drucke Zeile 5  "    "
  139.     MOVE.B    (A2)+,40*5(A3)    ; Drucke Zeile 6  "    "
  140.     MOVE.B    (A2)+,40*6(A3)    ; Drucke Zeile 7  "    "
  141.     MOVE.B    (A2)+,40*7(A3)    ; Drucke Zeile 8  "    "
  142.  
  143.     ADDQ.L    #1,PointeBitplane ; 8 Bit weiter vor (NÄCHSTER BUCHSTABE)
  144.     ADDQ.L    #1,PointeText    ; nächster zu druckende Buchstabe
  145.  
  146. EndeTEXT:
  147.     RTS
  148.  
  149.  
  150. PointeText:
  151.     dc.l    TEXT
  152.  
  153. PointeBitplane:
  154.     dc.l    BITPLANE
  155.  
  156. ;    $00 für "Ende Zeile" - $FF für "Ende TEXT"
  157.  
  158.         ; Anzahl Charakter pro Zeile: 40
  159. TEXT:           ;         1111111111222222222233333333334
  160.     dc.b    '   ERSTE ZEILE                          ',0 ; 1
  161.     dc.b    '                ZWEITE ZEILE            ',0 ; 2
  162.     dc.b    '     /\  /                              ',0 ; 3
  163.     dc.b    '    /  \/                               ',0 ; 4
  164.     dc.b    '                                        ',0 ; 5
  165.     dc.b    '        SECHSTE ZEILE                   ',0 ; 6
  166.     dc.b    '                                        ',0 ; 7
  167.     dc.b    '                                        ',0 ; 8
  168.     dc.b    'FABIO CIUCCI COMMUNICATION INTERNATIONAL',0 ; 9
  169.     dc.b    '                                        ',0 ; 10
  170.     dc.b    '   1234567890 !@#$%^&*()_+|\=-[]{}      ',0 ; 11
  171.     dc.b    '                                        ',0 ; 12
  172.     dc.b    '     ICH DENKE, ALSO BIN ICH...         ',0 ; 15
  173.     dc.b    '                                        ',0 ; 16
  174.     dc.b    '                                        ',0 ; 17
  175.     dc.b    '  Das Fraeulein stand am Meere,         ',0 ; 18
  176.     dc.b    '    Und seufzte lang und bang,          ',0 ; 19
  177.     dc.b    '    Es ruehrte sie so sehre,            ',0 ; 20
  178.     dc.b    '  Der Sonnenuntergang.   (...)          ',0 ; 21
  179.     dc.b    '                                        ',0 ; 22
  180.     dc.b    ' Schon draufgekommen...? Noch nicht...? ',0 ; 23
  181.     dc.b    ' Es war: . . . . . . . Heinrich Heine ! ',$FF ; 24 Ende
  182.  
  183.  
  184.     EVEN
  185.  
  186.  
  187.     SECTION GRAPHIC,DATA_C
  188.  
  189. COPPERLIST:
  190.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  191.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  192.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  193.     dc.w    $13e,$0000
  194.  
  195.     dc.w    $8E,$2c81    ; DiwStrt (Register mit Normalwerten)
  196.     dc.w    $90,$2cc1    ; DiwStop
  197.     dc.w    $92,$0038    ; DdfStart
  198.     dc.w    $94,$00d0    ; DdfStop
  199.     dc.w    $102,0        ; BplCon1
  200.     dc.w    $104,0        ; BplCon2
  201.     dc.w    $108,0        ; Bpl1Mod
  202.     dc.w    $10a,0        ; Bpl2Mod
  203.  
  204.             ; 5432109876543210
  205.     dc.w    $100,%0001001000000000  ; Bit 12 an - 1 Bitplane Lowres
  206.  
  207. BPLPOINTERS:
  208.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane
  209.  
  210.     dc.w    $0180,$000    ; Color0 - Hintergrund
  211.     dc.w    $0182,$19a    ; Color1 - Schrift
  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, 320x256 LowRes
  229.  
  230.     end
  231.  
  232.  
  233.