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

  1.  
  2. ; Listing3f.s    ; BALKEN, DER RAUF-UND RUNTERGEHT, ERSTELLT MIT MOVE & WAIT
  3.         ; DER COPPERS, UNTER DER $FF-ZEILE
  4.  
  5. ; Dieses Listing ist identisch mit dem Listing3d.s, mit der
  6. ; einzigen Ausnahme, daß der Balken sich unterhalb der $FF-Grenze
  7. ; befindet, die wir noch nie überschritten haben.
  8.  
  9.  
  10.     SECTION CIPundCOP,CODE    ; auch Fast ist    OK
  11.  
  12. Anfang:
  13.     move.l    4.w,a6        ; Execbase in a6
  14.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  15.     lea    GfxName,a1  ; Adresse des Namen der zu öffnenden Library in a1
  16.     jsr    -$198(a6)   ; OpenLibrary, Routine der EXEC, die Libraris
  17.                 ; öffnet, und als Resultat in d0 die Basisadresse
  18.                 ; derselben Bibliothek liefert, ab welcher
  19.                 ; die Offsets (Distanzen) zu machen sind
  20.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  21.     move.l    d0,a6
  22.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  23.                   ; des Betriebssystemes (immer auf $26 nach
  24.                     ; GfxBase)
  25.     move.l    #COPPERLIST,$dff080  ; COP1LC - "Zeiger" auf unsere COP
  26.                      ; (deren Adresse)
  27.     move.w    d0,$dff088         ; COPJMP1 - Starten unsere COP
  28. mouse:    
  29.     cmpi.b    #$ff,$dff006    ; VHPOSR - sind wir bei Zeile 255 angekommen?
  30.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  31.  
  32.  
  33.     bsr.s    BewegeCopper    ; Diese Subroutine läßt das WAIT sinken!
  34.                 ; Sie wird einmal pro Frame ausgeführt.
  35.  
  36.  
  37. Warte:
  38.     cmpi.b    #$ff,$dff006  ; VHPOSR:
  39.                   ; Sind wir noch auf $FF? Wenn ja, warte auf die
  40.     beq.s    Warte          ; nächste Zeile (00). Ansonsten wird BewegeCopper
  41.  
  42.  
  43.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  44.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  45.  
  46.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  47.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  48.  
  49.     move.l    4.w,a6
  50.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  51.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  52.                 ; (Libraries werden geöffnet UND geschlossen!!)
  53.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  54.     rts
  55.  
  56. ; Die Routine BewegeCopper ist die gleiche geblieben, nur die Werte der
  57. ; maximalen bzw. minimalen Höhe haben sich geändert: $0a für das obere
  58. ; Limit des Bildschirms und $2c für unten..
  59.  
  60.  
  61. BewegeCopper:
  62.     LEA    BALKEN,a0  ; in a0 kommt die Adresse von Balken
  63.     TST.B    RAUFRUNTER ; Müßen wir steigen oder sinken? Wenn RaufRunter
  64.                ; auf 0 steht (wenn TST also BEQ liefert), dann
  65.                 ; springen wir auf GEHRUNTER, wenn es hingegen
  66.                 ; auf $FF ist (TST also nicht eintrifft), fahren
  67.     beq.w    GEHRUNTER   ; wir fort und führen somit den "steigenden" Teil
  68.                 ; aus
  69.     
  70.     cmpi.b    #$0a,(a0)    ; sind wir bei Zeile $0a+$ff angekommen?
  71.     beq.s    SetzRunter    ; wenn ja, sind wir oben angekommen und
  72.     subq.b    #1,(a0)        ; müßen runter
  73.     subq.b    #1,8(a0)
  74.     subq.b    #1,8*2(a0) ; nun ändern wir die anderen Wait: der
  75.     subq.b    #1,8*3(a0) ; Abstand zwischen einem und dem anderen beträgt
  76.     subq.b    #1,8*4(a0) ; 8 Byte
  77.     subq.b    #1,8*5(a0)
  78.     subq.b    #1,8*6(a0)
  79.     subq.b    #1,8*7(a0) ; hier müßen wir alle 9 Wait des roten Balken
  80.     subq.b    #1,8*8(a0) ; ändern, wenn wir ihn steigen und sinken lassen
  81.     subq.b    #1,8*9(a0) ; wollen.
  82.     rts
  83.  
  84.  
  85. SetzRunter:
  86.     clr.b    RAUFRUNTER    ; Setzt RAUFRUNTER auf 0, beim TST.B RAUFRUNTER
  87.     rts            ; wird das BEQ zu Routine GEHRUNTER verzweigen,
  88.                 ; und der Balken wird sinken
  89.  
  90. GEHRUNTER:
  91.     cmpi.b    #$2c,8*9(a0)    ; sind wir bei Zeile $2c angekommen?
  92.     beq.s    SetzRauf    ; wenn ja, sind wir untern und müßen wieder
  93.     addq.b    #1,(a0)        ; steigen
  94.     addq.b    #1,8(a0)
  95.     addq.b    #1,8*2(a0) ; nun ändern wir die anderen Wait: der
  96.     addq.b    #1,8*3(a0) ; Abstand zwischen einem und dem anderen beträgt
  97.     addq.b    #1,8*4(a0) ; 8 Byte
  98.     addq.b    #1,8*5(a0)
  99.     addq.b    #1,8*6(a0)
  100.     addq.b    #1,8*7(a0) ; hier müßen wir alle 9 Wait des roten Balken
  101.     addq.b    #1,8*8(a0) ; ändern, wenn wir ihn steigen und sinken lassen
  102.     addq.b    #1,8*9(a0) ; wollen.
  103.     rts
  104.  
  105. SetzRauf:
  106.     move.b    #$ff,RAUFRUNTER ; Wenn das Label nicht auf NULL ist,
  107.     rts            ; bedeutet es, daß wir steigen müßen
  108.         
  109.  
  110. ;   Dieses Byte, das von dem Label RAUFRUNTER markiert ist, ist ein FLAG,
  111. ;   also eine "Fahne" (man kann es sich so vorstellen), einmal ist sie
  112. ;   auf $FF, ein anderes Mal auf $00, je nachdem ob wir steigen oder sinken
  113. ;   müßen! Es ist wie eine Flagge, denn wenn sie unten ist ($00) bedeutet
  114. ;   es, daß wir runter müßen, wenn sie gehißt ist ($FF), dann müßen wir
  115. ;   rauf. Es wird eine Kontrolle gemacht, auf welcher Zeile wir uns
  116. ;   befinden, und verglichen, ob wir oben oder unter angelangt sind. Ist
  117. ;   das der Fall, dann sagt uns das Flag, welche Richtung wir danach
  118. ;   einschlagen müßen, und dann ändern wir ihren Zustand mit clr.b RAUFRUNTER
  119. ;   oder move.b #$ff,RAUFRUNTER.
  120.  
  121. ;    DATEN...
  122.  
  123. RAUFRUNTER:
  124.     dc.b    0,0
  125.  
  126. GfxName:
  127.     dc.b    "graphics.library",0,0    ; Bemerkung: um Charakter in den
  128.                     ; Speicher zu geben, verwenden wir
  129.                     ; immer das dc.b und setzen sie
  130.                     ; unter "" oder ´´, Abschluß mit ,0
  131.  
  132.  
  133. GfxBase:       ; Hier hinein kommt die Basisadresse der graphics.library,
  134.     dc.l    0  ; ab hier werden die Offsets gemacht
  135.  
  136.  
  137.  
  138. OldCop:            ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  139.     dc.l    0   ; Betriebssystemes
  140.  
  141.  
  142.     SECTION GRAPHIC,DATA_C    ; Dieser Befehl veranlaßt das Betriebssystem,
  143.                 ; das folgende Datensegment in die CHIP-RAM
  144.                 ; zu laden, obligatorisch.
  145.                 ; Die Cpperlist MÜSSEN in die CHIP RAM!
  146.     
  147. COPPERLIST:
  148.     dc.w    $100,$200    ; BPLCON0
  149.     dc.w    $180,$000    ; COLOR0 - Beginne Cop mit SCHWARZ
  150.  
  151.     dc.w    $2c07,$FFFE    ; WAIT - Ein kleiner fixer Balken in grün
  152.     dc.w    $180,$010    ; COLOR0
  153.     dc.w    $2d07,$FFFE    ; WAIT
  154.     dc.w    $180,$020    ; COLOR0
  155.     dc.w    $2e07,$FFFE
  156.     dc.w    $180,$030
  157.     dc.w    $2f07,$FFFE
  158.     dc.w    $180,$040
  159.     dc.w    $3007,$FFFE
  160.     dc.w    $180,$030
  161.     dc.w    $3107,$FFFE
  162.     dc.w    $180,$020
  163.     dc.w    $3207,$FFFE
  164.     dc.w    $180,$010
  165.     dc.w    $3307,$FFFE
  166.     dc.w    $180,$000
  167.  
  168.     dc.w    $ffdf,$fffe    ; ACHTUNG! WAIT AM ENDE DER ZEILE FF!
  169.                 ; die folgenden Wait sind unter der Zeile
  170.                 ; $FF und starten wieder bei $00!!
  171.  
  172.     dc.w    $0107,$FFFE    ; Ein fixer, grüner Balken UNTER der Zeile $FF!
  173.     dc.w    $180,$010
  174.     dc.w    $0207,$FFFE
  175.     dc.w    $180,$020
  176.     dc.w    $0307,$FFFE
  177.     dc.w    $180,$030
  178.     dc.w    $0407,$FFFE
  179.     dc.w    $180,$040
  180.     dc.w    $0507,$FFFE
  181.     dc.w    $180,$030
  182.     dc.w    $0607,$FFFE
  183.     dc.w    $180,$020
  184.     dc.w    $0707,$FFFE
  185.     dc.w    $180,$010
  186.     dc.w    $0807,$FFFE
  187.     dc.w    $180,$000
  188.  
  189. BALKEN:
  190.     dc.w    $0907,$FFFE    ; Warte auf Zeile $79
  191.     dc.w    $180,$300    ; Beginne roten Balken: Rot auf 3
  192.     dc.w    $0a07,$FFFE    ; nächste Zeile
  193.     dc.w    $180,$600    ; Rot auf 6
  194.     dc.w    $0b07,$FFFE
  195.     dc.w    $180,$900    ; Rot auf 9
  196.     dc.w    $0c07,$FFFE
  197.     dc.w    $180,$c00    ; Rot auf 12
  198.     dc.w    $0d07,$FFFE
  199.     dc.w    $180,$f00    ; Rot auf 15 (Maximum)
  200.     dc.w    $0e07,$FFFE
  201.     dc.w    $180,$c00    ; Rot auf 12
  202.     dc.w    $0f07,$FFFE
  203.     dc.w    $180,$900    ; Rot auf 9
  204.     dc.w    $1007,$FFFE
  205.     dc.w    $180,$600    ; Rot auf 6
  206.     dc.w    $1107,$FFFE
  207.     dc.w    $180,$300    ; Rot auf 3
  208.     dc.w    $1207,$FFFE
  209.     dc.w    $180,$000    ; Farbe SCHWARZ
  210.  
  211.     dc.w    $FFFF,$FFFE    ; ENDE DER COPPERLIST
  212.  
  213.  
  214.     end
  215.  
  216.  
  217.  
  218. EIN   WUNDER!   Wir   haben   es   geschafft,  farbige  Balken  unter  die
  219. berühmt-berüchtigte Zeile $FF zu setzen! Und es reicht der Befehl
  220.  
  221.     dc.w    $ffdf,$fffe
  222.  
  223. und bei $0107 starten, um im unteren Teil des Bildschirmes zu aaiten.  Das
  224. ist  so,  weil  ein  Byte nur 256 Werte darstellen kann, also bis $FF. Das
  225. bedeutet, daß wenn wir eine Zeile abwarten wollen, die  unter  $FF  liegt,
  226. wir $FFdf,$FFFE schreiben müßen, danach startet die Numerierung wieder bei
  227. NULL, und geht soweit, wie der Bildschirm halt  reicht,  ca  bis  $30.  Zu
  228. Bemerken ist, daß der amerikanische Fernsehstandart NTSC nur bis zur Zeile
  229. $FF kommt, oder knapp mehr in Overscan,  die  Amerikaner  sehen  also  den
  230. unteren  Teil  des  Bildes  nicht.  Aber das kümmert uns nur wenig, da der
  231. Amiga ja vor allem in Europa verbreitet ist, und die  meisten  Demos  oder
  232. Spiele  ja  eh  in  PAL  geschrieben  sind.  In  manchen Fällen machen die
  233. Spieleprogrammierer eine NTSC-Version, die  dann  ausschließlich  für  den
  234. Markt in den USA bestimmt ist.
  235.  
  236. Bemerkung: Bisher konnten wir mit dem $dff006 nur Zeilen bis $FF abfragen,
  237. ich werde euch später beibringen, wie man mit  einem  $dffxxx  eine  Zeile
  238. nach $FF korrekt abfragt.
  239.  
  240.  
  241.