home *** CD-ROM | disk | FTP | other *** search
/ Falcon 030 Power 2 / F030_POWER2.iso / ST_STE / MAGS / UCM9.ARJ / ucm9 / SOURCES.LZH / VOXEL / STRAHL.S < prev    next >
Text File  |  1997-06-25  |  5KB  |  107 lines

  1. ******* Source: Vorberechnung der Strahlen mit x,y Positionen ******
  2.  
  3. map_groesse    equ    256        ; unsere Landschaft ist 256x256 gro∞
  4.  
  5. strahlen    equ    512        ; volle Umdrehung = 512 Strahlen = 360 Grad
  6. radius1        equ    40        ; Kreis innen
  7. radius2        equ     170        ; Kreis au∞en
  8. punkte        equ    64        ; wieviel Punkte nach vorne sehen - Richtung Horizont
  9.  
  10. bit_shift    equ    9        ; 2**9 = 512 -> eine Zeile in der Landkarte 
  11.                     ; siehe Landschaftsdaten
  12.  
  13. berechne_strahlen:
  14.  
  15.                 lea     strahlen_speicher(PC),A0    ; hier werden die Strahlen abgelegt
  16.                 lea     sin_tabelle(PC),A1        ; Sinustabelle mit 1024 Eintraegen
  17.                 lea     cos_tabelle(PC),A4        ; Kosinustabelle 
  18.  
  19.                 moveq   #0,D0               ; StrahlenzΣhler initialisieren
  20.  
  21. strahlen_loop:
  22.                 move.l  D0,-(SP)
  23.  
  24. ; pro Strahl durchlaufen ...
  25.  
  26.                 move.w  D0,D4            
  27.                 mulu    #1024,D4        ; 1024 Winkel in der Cos/Sin Tabelle ...
  28.                 divu    #strahlen,D4        ; ... auf ben÷tigte Strahlenwinkel umrechnen
  29.                 add.w   D4,D4            ; fuer Tabellenzugriff ( pro Winkel ein Word)
  30.                 and.w   #$07FE,D4        ; in der Tablle bleiben (sin+cos periodisch)
  31.                 move.w  0(A1,D4.w),D0        ; Sinuswert (multipliziert mit 2**15)
  32.                 move.w  0(A4,D4.w),D1        ; Kosinuswert (dito)
  33.                 move.w  D0,D2
  34.                 move.w  D1,D3
  35.                 muls    #radius1,D0        ; X Startpunkt auf dem inneren Kreis    (x1)
  36.                 muls    #radius1,D1        ; Y Startpunkt auf dem inneren Kreis    (y1)
  37.                 muls    #radius2,D2        ; X Startpunkt auf dem Σu∞eren Kreis    (x2)
  38.                 muls    #radius2,D3        ; Y Startpunkt auf dem Σu∞eren Kreis    (y2)
  39.                 add.l   D0,D0            ; 2**15 * 2 = 2**16 
  40.                 add.l   D1,D1            ; ä
  41.                 add.l   D2,D2            ; ä
  42.                 add.l   D3,D3            ; ä
  43.                 swap    D0            ; Multiplikation mit 2**16 rⁿckgΣngigmachen
  44.                 swap    D1
  45.                 swap    D2
  46.                 swap    D3
  47.  
  48.                 sub.w   D0,D2            ; x2 - x1 = deltaX
  49.                 sub.w   D1,D3            ; y2 - y1 = deltaY
  50.                 ext.l   D2            ; fⁿr weitere Long Berechnungen erweitern
  51.                 ext.l   D3            ; ä
  52.  
  53.                 suba.w  A2,A2            ; A2 l÷schen - ist letzter x Wert
  54.                 suba.w  A3,A3            ; A3 l÷schen - ist letzter y Wert
  55.  
  56.                 moveq   #0,D4            ; ist neuer x Wert
  57.                 moveq   #0,D5            ; ist neuer y Wert
  58.  
  59. ;--------------------------------------------------
  60. ; und jetzt die Positionsoffsets pro Strahl berechnen
  61.  
  62.                 move.w  #punkte-1,D6
  63.  
  64. punkt_loop:
  65.                 movea.l D4,A5        ; Aktuellen x Strahlwert sichern
  66.                 movea.l D5,A6        ; gleiches fⁿr y
  67.  
  68.                 divs    #punkte,D4    ; zwischen Radius1 und radius2 auf dem Strahl bewegen ...
  69.                 divs    #punkte,D5    ; Umrechnung, um die gewⁿnschte Punktanzahl auf die
  70.                 add.w   D0,D4        ; Distanz x1->x2, y1->y2 zu verteilen
  71.                 add.w   D1,D5
  72.                 ext.w   D4
  73.                 ext.w   D5
  74.  
  75.                 movem.w D4-D5,-(SP)    ; aktuelle x,y Position sichern
  76.                 sub.w   A2,D4        ; von alter Position abziehen, ergibt Delta x ...
  77.                 sub.w   A3,D5        ; Delta y fⁿr die Strahloffsets !
  78.                 movem.w (SP)+,A2-A3    ; aktuelle Werte werden alte Position !
  79.  
  80.                 and.l   #map_groesse-1,D4    ; innerhalb der Landschaft bleiben x
  81.                 and.l   #map_groesse-1,D5    ; innerhalb der Landschaft bleiben y
  82.  
  83.                 moveq   #bit_shift,D7        ; spezielles x+y Format erzeugen:
  84.                 lsl.l   D7,D5            ; y mit Zeilenbreite multiplizieren
  85.                         ; 256 fⁿr H÷hen + 256 Pixel fⁿr Farben 
  86.                         ; -> 512 = 2**9
  87.                 or.l    D4,D5            ; x ins Lowword
  88.  
  89.                 move.l  D5,(A0)+        ; x+y Wert fⁿr den berechneten Punkt ablegen
  90.  
  91. ;---------------------------------------
  92.  
  93.                 move.l  A5,D4            ; x+y Startwerte fⁿr Strahl wiederherstellen
  94.                 move.l  A6,D5
  95.  
  96.                 add.l   D2,D4            ; Weiter in x Richtung auf dem Strahl bewegen
  97.                 add.l   D3,D5            ; weiter in y Richtung auf dem Strahl bewegen
  98.                 dbra    D6,punkt_loop        ; Strahl abarbeiten
  99.  
  100.                 move.l  (SP)+,D0
  101.  
  102.                 addq.w  #1,D0            ; naechster Strahl
  103.  
  104.                 cmp.w   #strahlen,D0        ; Schon alle Strahlen ?
  105.                 bne     strahlen_loop
  106.                 rts
  107.