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

  1.  
  2. ; Listing6i.s        TEXT IN 3 FARBEN, BEI DEM EINE FARBE BLINKT
  3. ;            VERWENDEN DAZU EINE VORDEFINIERTE TABELLE
  4.  
  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.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  49.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  50.  
  51.     btst    #2,$dff016    ; wenn die rechte Maustaste gedrückt ist,
  52.     beq.s    Warte        ; gehe zu Warte
  53.  
  54.     bsr.w    BLINKEN     ; ansonsten gehe zu BLINKE
  55.  
  56. Warte:
  57.     cmpi.b    #$ff,$dff006    ; Sind wir auf Zeile 255?
  58.     beq.s    Warte        ; Wenn nicht, geh nicht weiter
  59.  
  60.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  61.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  62.  
  63.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  64.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  65.  
  66.     move.l    4.w,a6
  67.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  68.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  69.                 ; (Libraries werden geöffnet UND geschlossen!)
  70.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  71.     rts
  72.  
  73. ; DATEN
  74.  
  75. GfxName:
  76.     dc.b    "graphics.library",0,0    
  77.  
  78. GfxBase:        ; Hier hinein kommt die Basisadresse der graphics.lib,
  79.     dc.l    0    ; ab hier werden die Offsets gemacht
  80.  
  81. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  82.     dc.l    0    ; Betriebssystemes
  83.  
  84.  
  85. ;    Blinkroutine, die eine vorgefertigte Farbverlauf-TABELLE verwendet.
  86. ;    Diese Tabelle ist nicht anderes als eine Reihe von Words mit den
  87. ;    verschiedenen RGB-Werten, die COLOR1 annehmen wird.
  88. ;    Diese Routine nimmt bei jedem Durchgang den nächsten Wert in der 
  89. ;    Tabelle, und wenn sie ein Word (2 Bytes) vor dem Label ENDECOLORTAB
  90. ;    angekommen ist, beginnt der Lesevorgang wieder beim ersten Element:
  91. ;
  92. ;    dc.w    1,3,5,7,9,8,6,4,2,1    ; unsere "Mini"-Tabelle
  93. ;
  94. ;    Während der nächsten Fotogramme wird die Reihenfolge der kopierten
  95. ;    word so aussehen, in einem unendlichen Loop:
  96. ;
  97. ;    1,3,5,7,9,8,6,4,2,1,1,3,5,7,9,8,6,4,2,1,1,3,5,7,9,8,6,4,2,1....
  98. ;
  99. ;    Die Adresse des letzten gelesenen Word wird in der Long COLTABPOINT
  100. ;    gespeichert.
  101.  
  102. BLINKEN:
  103.     ADDQ.L    #2,COLTABPOINT        ; Pointet auf das nächste Word
  104.     MOVE.L    COLTABPOINT(PC),A0    ; Adresse, die im Long COLTABPOINT steht
  105.                     ; wird in a0 kopiert
  106.     CMP.L    #ENDECOLORTAB-2,A0    ; Sind wir beim letzten Word in der TAB?
  107.     BNE.S    NOBSTART2        ; noch nicht? dann geh´ weiter
  108.     MOVE.L    #COLORTAB-2,COLTABPOINT ; Starte wieder beim ersten Word
  109. NOBSTART2:
  110.     MOVE.W    (A0),Farbe1    ; kopiere das Word der Tabelle in die COP
  111.     rts
  112.  
  113.  
  114. COLTABPOINT:           ; Dieses Longword "POINTET" auf COLORTAB, also
  115.     dc.l    COLORTAB-2 ; enthält es die Adresse von COLORTAB. Es wird
  116.                ; die Adresse des zuletzt gelesenen Word innerhalb
  117.                ; der Tabelle beinhalten. (hier beginne es bei 
  118.                ; COLORTAB-2, weil das Blinken ja mit ADDQ.L #2,C...
  119.                ; beginnt. Es dient zum "ausgleich" dieser ersten
  120.                ; Anweisung.
  121.  
  122. ;    Die Tabelle mit den vordefinierten Werten, die das Blinken ergeben:
  123.  
  124. COLORTAB:
  125.     dc.w    $000,$000,$001,$011,$011,$011,$012,$012 ; Beginn DUNKEL
  126.     dc.w    $022,$022,$022,$023,$023
  127.     dc.w    $033,$033,$034
  128.     dc.w    $044,$044
  129.     dc.w    $045,$055,$055
  130.     dc.w    $056,$056,$066,$066,$066
  131.     dc.w    $167,$167,$177,$177,$177,$177,$177
  132.     dc.w    $278,$278,$278,$288,$288,$288,$288,$288
  133.     dc.w    $389,$389,$399,$399,$399,$399
  134.     dc.w    $39a,$39a,$3aa,$3aa,$3aa
  135.     dc.w    $3ab,$3bb,$3bb,$3bb
  136.     dc.w    $4bc,$4cc,$4cc,$4cc
  137.     dc.w    $4cd,$4cd,$4dd,$4dd,$4dd
  138.     dc.w    $5de,$5de,$5ee,$5ee,$5ee,$5ee
  139.     dc.w    $6ef,$6ff,$6ff,$7ff,$7ff,$8ff,$8ff,$9ff ; Maximum HELL
  140.     dc.w    $5ee,$5ee,$5ee,$5de,$5de,$5de
  141.     dc.w    $4dd,$4dd,$4dd,$4cd,$4cd
  142.     dc.w    $4cc,$4cc,$4cc,$4bc
  143.     dc.w    $3cb,$3bb,$3bb
  144.     dc.w    $3ba,$3aa,$3aa
  145.     dc.w    $3a9,$399,$399
  146.     dc.w    $298,$288
  147.     dc.w    $187,$177
  148.     dc.w    $076,$066
  149.     dc.w    $065,$055
  150.     dc.w    $054,$044
  151.     dc.w    $034
  152.     dc.w    $022
  153.     dc.w    $011
  154.     dc.w    $000            ; wieder DUNKEL
  155. ENDECOLORTAB:
  156.  
  157.  
  158. ;    Routine, die 8x8 Pixel große Buchstaben druckt
  159.  
  160. PRINT:
  161.     MOVEQ    #27-1,D3     ; ANZAHL DER ZEILEN, DIE ZU DRUCKEN SIND -> 26
  162. PRINTZEILE:
  163.     MOVEQ    #40-1,D0    ; ANZAHL DER SPALTEN EINER ZEILE: 40 (LOWRES!)
  164.  
  165. PRINTCHAR2:
  166.     MOVEQ    #0,D2        ; Löscht D2
  167.     MOVE.B    (A0)+,D2    ; Nächster Charakter in d2
  168.     SUB.B    #$20,D2        ; ZÄHLE 32 VOM ASCII-WERT DES BUCHSTABEN WEG,
  169.                 ; SOMIT VERWANDELN WIR Z.B. DAS LEERZEICHEN
  170.                 ; (Das $20 entspricht), IN $00, DAS
  171.                 ; MALZEICHEN ($21) IN $01...
  172.     MULU.W    #8,D2        ; MULTIPLIZIERE DIE ERHALTENE ZAHL MIT 8,
  173.                 ; da die Charakter ja 8 Pixel hoch sind
  174.     MOVE.L    D2,A2
  175.     ADD.L    #FONT,A2    ; FINDE DEN GEWÜNSCHTEN BUCHSTEBEN IM FONT
  176.  
  177.                 ; DRUCKE DEN BUCHSTABEN ZEILE FÜR ZEILE
  178.     MOVE.B    (A2)+,(A3)    ; Drucke Zeile 1 des Buchstaben
  179.     MOVE.B    (A2)+,40(A3)    ; Drucke Zeile 2  "    "
  180.     MOVE.B    (A2)+,40*2(A3)    ; Drucke Zeile 3  "    "
  181.     MOVE.B    (A2)+,40*3(A3)    ; Drucke Zeile 4  "    "
  182.     MOVE.B    (A2)+,40*4(A3)    ; Drucke Zeile 5  "    "
  183.     MOVE.B    (A2)+,40*5(A3)    ; Drucke Zeile 6  "    "
  184.     MOVE.B    (A2)+,40*6(A3)    ; Drucke Zeile 7  "    "
  185.     MOVE.B    (A2)+,40*7(A3)    ; Drucke Zeile 8  "    "
  186.  
  187.     ADDQ.w    #1,A3        ; A3+1, wir gehen um 8 Bit weiter (zum
  188.                 ; nächsten Buchstaben
  189.  
  190.     DBRA    D0,PRINTCHAR2    ; DRUCKEN D0 (80) ZEICHEN PRO ZEILE
  191.  
  192.     ADD.W    #40*7,A3    ; "Return", neue Zeile
  193.  
  194.     DBRA    D3,PRINTZEILE    ; Wir drucken D3 Zeilen
  195.     RTS
  196.  
  197. TEXT:
  198.              ; Anzahl Charakter pro Zeile: 40
  199.              ;            1111111111222222222233333333334
  200.              ;   1234567890123456789012345678901234567890
  201.     dc.b    '   ERSTE ZEILE (nur TEXT1)              ' ; 1
  202.     dc.b    '                                        ' ; 2
  203.     dc.b    '     /\  /                              ' ; 3
  204.     dc.b    '    /  \/                               ' ; 4
  205.     dc.b    '                                        ' ; 5
  206.     dc.b    '        SECHSTE ZEILE (beide Bitplanes) ' ; 6
  207.     dc.b    '                                        ' ; 7
  208.     dc.b    '                                        ' ; 8
  209.     dc.b    'FABIO CIUCCI               INTERNATIONAL' ; 9
  210.     dc.b    '                                        ' ; 10
  211.     dc.b    '   1  4 6 89  !@ $ ^& () +| =- ]{       ' ; 11
  212.     dc.b    '                                        ' ; 12
  213.     dc.b    '     I H D N E,  L O BIN I H            ' ; 13
  214.     dc.b    '                                        ' ; 24
  215.     dc.b    '                                        ' ; 15
  216.     dc.b    '  Das Fraeulein stand am Meere,         ' ; 16
  217.     dc.b    '                                        ' ; 17
  218.     dc.b    '    Und seufzte lang und bang,          ' ; 18
  219.     dc.b    '                                        ' ; 19
  220.     dc.b    '    Es ruehrte sie so sehre,            ' ; 20
  221.     dc.b    '                                        ' ; 21
  222.     dc.b    '      Sonnenuntergang.                  ' ; 22
  223.     dc.b    '                                        ' ; 23
  224.     dc.b    '           ...                          ' ; 24
  225.     dc.b    '                                        ' ; 25
  226.     dc.b    '                                        ' ; 26
  227.     dc.b    '                                        ' ; 27
  228.  
  229.  
  230.         EVEN
  231.  
  232. TEXT2:
  233.              ; Anzahl Charakter pro Zeile: 40
  234.              ;            1111111111222222222233333333334
  235.              ;   1234567890123456789012345678901234567890
  236.     dc.b    '                                        ' ; 1
  237.     dc.b    '  ZWEITE ZEILE (nur TEXT2)              ' ; 2
  238.     dc.b    '     /\  /                              ' ; 3
  239.     dc.b    '    /  \/                               ' ; 4
  240.     dc.b    '                                        ' ; 5
  241.     dc.b    '        SECHSTE ZEILE (beide Bitplanes) ' ; 6
  242.     dc.b    '                                        ' ; 7
  243.     dc.b    '                                        ' ; 8
  244.     dc.b    'FABIO        COMMUNICATION INTERNATIONAL' ; 9
  245.     dc.b    '                                        ' ; 10
  246.     dc.b    '   1234567 90  @#$%^&*( _+|\=-[]{}      ' ; 11
  247.     dc.b    '                                        ' ; 12
  248.     dc.b    '     ICH DENKE, ALSO     ICH            ' ; 13
  249.     dc.b    '                                        ' ; 14
  250.     dc.b    '                                        ' ; 15
  251.     dc.b    '  Das           stand am                ' ; 16
  252.     dc.b    '                                        ' ; 17
  253.     dc.b    '    Und s u  te l n  und b  g,          ' ; 18
  254.     dc.b    '                                        ' ; 19
  255.     dc.b    '    Es ruehrte        sehre,            ' ; 20
  256.     dc.b    '                                        ' ; 21
  257.     dc.b    '  Der Sonnen     gang.                  ' ; 22
  258.     dc.b    '                                        ' ; 23
  259.     dc.b    '           ...                          ' ; 24
  260.     dc.b    '                                        ' ; 25
  261.     dc.b    '                                        ' ; 26
  262.     dc.b    '                                        ' ; 27
  263.  
  264.     EVEN
  265.  
  266.  
  267.     SECTION GRAPHIC,DATA_C
  268.  
  269. COPPERLIST:
  270.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  271.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  272.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  273.     dc.w    $13e,$0000
  274.  
  275.     dc.w    $8E,$2c81    ; DiwStrt (Register mit Normalwerten)
  276.     dc.w    $90,$2cc1    ; DiwStop
  277.     dc.w    $92,$0038    ; DdfStart
  278.     dc.w    $94,$00d0    ; DdfStop
  279.     dc.w    $102,0        ; BplCon1
  280.     dc.w    $104,0        ; BplCon2
  281.     dc.w    $108,0        ; Bpl1Mod
  282.     dc.w    $10a,0        ; Bpl2Mod
  283.     
  284.             ; 5432109876543210
  285.     dc.w    $100,%0010001000000000  ; 2 BITPLANES LOWRES, 4 FARBEN
  286.  
  287. BPLPOINTERS:
  288.     dc.w $e0,$0000,$e2,$0000    ;erstes  Bitplane
  289. BPLPOINTERS2:
  290.     dc.w $e4,$0000,$e6,$0000    ;zweites Bitplane
  291.  
  292.     dc.w    $0180,$000    ; Color0 - HINTERGRUND
  293.     dc.w    $0182
  294.  
  295. Farbe1:
  296.     dc.w    $000
  297.     dc.w    $0184,$f62 ; Color2 - SCHRIFT zweites Bitplane (ORANGE)
  298.     dc.w    $0186,$1e4 ; Color3 - SCHRIFT erstes+zweites Bitplane (GRÜN)
  299.  
  300.  
  301.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  302.  
  303. ;    Der FONT, Charakter 8x8
  304.  
  305. FONT:
  306. ;    incbin    "metal.fnt"    ; Breiter Zeichensatz
  307. ;    incbin    "normal.fnt"    ; Ähnlich dem aus dem Kickstart 1.3
  308.     incbin    "nice.fnt"    ; Schmaler Zeichensatz
  309.  
  310.     SECTION MEIPLANE,BSS_C    ; Die SECTION BSS können nur aus NULLEN
  311.                 ; bestehen!!! Man verwendet das DS.B um zu
  312.                 ; definieren, wieviele Nullen die Section
  313.                 ; enthalten soll
  314.  
  315. BITPLANE:
  316.     ds.b    40*256    ; ein Bitplane LOWRES 320x256
  317. BITPLANE2:
  318.     ds.b    40*256    ; ein Bitplane LOWRES 320x256
  319.  
  320.  
  321.     end
  322.  
  323.  
  324. Unter Verwendung von vordefinierten oder "vorberechneten" Werten kann  man
  325. viel  bessere  Bewegungen oder Farbverläufe herstellen, als mit bloßen ADD
  326. und SUB.
  327. Die einzige "Neuigkeit" in diesem Listing besteht in der Auscodierung  der
  328. Routine  "BLINKEN",  die  die  Werte  aus einer Tabelle liest, die dann in
  329. "FARBE1" kommen. Dabei wird ein POINTER  auf  das  zuletzt  gelesene  Word
  330. verwendet,  also  ein LONGWORD, das die Adresse dieses Wordes inerhalb der
  331. Tabelle speichert. Zu Bemerken ist, daß ein:
  332.  
  333.  
  334. COLTABPOINT:
  335.     dc.l    COLORTAB
  336.  
  337. gleich einem
  338.  
  339. COLTABPOINT:
  340.     DC.L    0
  341.  
  342. ist, nachdem ein MOVE.L #COLORTAB,COLTABPOINT ausgeführt  wurde,  es  wird
  343. also  ein  Longword  assembliert,  das  die Adresse eines bestimmten Label
  344. enthält. In dieser Routine ist ein
  345.  
  346.     dc.l    COLORTAB-2
  347.  
  348. vorzufinden, es ist aber nur dazu da, um beim ersten Mal das erste Word zu
  349. lesen, da die Routine ja mit
  350.  
  351. BLINKEN:
  352.     ADDQ.L    #2,COLTABPOINT    ; Pointet auf das nächste Word
  353.  
  354. beginnt.  COLTABPOINT  muß  den  Anfang  des  ersten    Word-2    enthalten,
  355. jedenfalls  nach  dem ersten ADDQ.L #2 wird beim ersten jsr das erste Word
  356. kopiert und nicht das zweite.
  357. Danach wird das Longword COLTABPOINT jedesmal um 2  erhöht,  die  Adresse,
  358. die  es enthält, wird also jedesmal die nächste sein, bis nicht das letzte
  359. Word erreicht wird, das zwei Bytes vor dem ENDE der Tabelle steht:
  360.  
  361. ; wir sind auf dieser Adresse, wenn wir das letzte Word lesen...
  362.  
  363.     dc.w    $000            ; wieder DUNKEL
  364. ENDECOLORTAB:
  365.  
  366. Hier wird dann mit einem
  367.  
  368.     MOVE.L    #COLORTAB-2,COLTABPOINT ; Starte wieder beim ersten Word
  369.  
  370.  
  371. das Label COLTABPOINT wieder mit der Adresse des ersten Word geladen.
  372.  
  373. Ihr könnt diese Routine für viele verschiedene Zwecke verwenden,  z.B.  um
  374. Sprites zum springen oder wellen zu bringen. Einfach die Tabelle ersetzen.
  375.  
  376. Probiert, die Tabelle mit dieser zu ersetzen:
  377.  
  378. COLORTAB:
  379.     dc.w    $26F,$27E,$28D,$29C,$2AB,$2BA,$2C9,$2D8,$2E7,$2F6
  380.     dc.w    $4E7,$6D8,$8C9,$ABA,$CAA,$D9A,$E8A,$F7A,$F6B,$F5C
  381.     dc.w    $D6D,$B6E,$96F,$76F,$56F,$36F
  382. ENDECOLORTAB:
  383.  
  384.