verz

LowRes Graph C64 - Kernal math

Jun 6th, 2021 (edited)
494
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; 10 SYS2061
  2.  
  3. *=$0801
  4.  
  5.         BYTE    $0B, $08, $0A, $00, $9E, $32, $30, $36, $31, $00, $00, $00
  6.  
  7.         jsr CLRSCR      ; {clrscr}
  8.  
  9.         ; reset I (I=0)
  10.         lda #0
  11.         sta varI
  12.         sta varI+1
  13.         sta varI+2
  14.         sta varI+3
  15.         sta varI+4
  16.  
  17.         lda #<varI
  18.         ldy #>varI
  19.         jsr MOVFM       ; Copy counter to Fac1
  20.  
  21. ForLoop
  22.         ; compute P=cos(I/2)
  23.         jsr Fac1Div2    ; Fac1 = Fac1 / 2        ; Fac1 = I / 2
  24.         jsr FCOS        ; COS                    ; Fac1 = cos(I/2)
  25.  
  26.         ldx #<varP
  27.         ldy #>varP
  28.         jsr MOVMF       ; Copy Fac1 to Ram       ; varP = cos(I/2)
  29.  
  30.         ; compute Y=24*P*Sin(I)+25
  31.         lda #<varI
  32.         ldy #>varI
  33.         jsr MOVFM       ; Copy counter to Fac1
  34.         jsr FSIN        ; SIN                    ; Fac1 = sin(I)
  35.  
  36.         lda #<varP      
  37.         ldy #>varP
  38.         jsr FMUL        ; Mul Fac1 x ram         ; Fac1 = P x sin(I)
  39.  
  40.         lda #<_24
  41.         ldy #>_24
  42.         jsr FMUL        ; Mul Fac1 x ram         ; Fac1 = 24 x P x sin(I)
  43.  
  44.         lda #<_25
  45.         ldy #>_25
  46.         jsr FADD        ; Add Fac1 + ram         ; Fac1 = 25 + 24 x P x sin(I)
  47.  
  48.         ; compute B=(Y & 1)   and   40*int(Y/2)
  49.         jsr F2INT       ; INT                    ; Fac1+4 = int(Y); Y <= 50
  50.  
  51.         lsr Fac1+4      ; Carry = Y & 1, Fac1+4 = int(Y/2)
  52.         lda #0
  53.         sta varL+1
  54.         rol             ; enter Carry
  55.         sta varB        ; varB = Y & 1
  56.  
  57.         lda Fac1+4      ; (<= 25)
  58.         asl             ; (<= 50)
  59.         asl             ; int(Y/2) * 4  (<= 100)
  60.         adc Fac1+4      ; int(Y/2) * 5  (<= 125)
  61.         asl
  62.         ;rol varL+1     ; int(Y/2) * 10 (<= 250)
  63.         asl
  64.         rol varL+1      ; int(Y/2) * 20
  65.         asl
  66.         sta varL
  67.         rol varL+1      ; varL = int(Y/2) * 40
  68.  
  69.         ; compute X=39*P*Cos(I)+40
  70.         lda #<varI
  71.         ldy #>varI
  72.         jsr MOVFM       ; Copy counter to Fac1
  73.         jsr FCOS        ; COS                    ; Fac1 = cos(I)
  74.  
  75.         lda #<varP      
  76.         ldy #>varP
  77.         jsr FMUL        ; Mul Fac1 x ram         ; Fac1 = P x cos(I)
  78.  
  79.         lda #<_39
  80.         ldy #>_39
  81.         jsr FMUL        ; Mul Fac1 x ram         ; Fac1 = 39 x P x cos(I)
  82.  
  83.         lda #<_40
  84.         ldy #>_40
  85.         jsr FADD        ; Add Fac1 + ram         ; Fac1 = 40 + 39 x P x cos(I)
  86.  
  87.         ; compute 2^((X & 1) + 2*(Y & 1))   and    Scr + int(X/2) + 40*int(Y/2)
  88.         jsr F2INT       ; INT                    ; Fac1+4 = int(X); X <= 80
  89.  
  90.         lsr Fac1+4      ; Carry = X & 1, Fac1+4 = int(X/2)
  91.         lda varB
  92.         rol             ; enter Carry, doubles (Y & 1)
  93.         tay             ; (X & 1) + 2*(Y & 1)
  94.         lda _pwr2,y
  95.         sta varB        ; varB = 2 ^ (X & 1 + (2 * (Y & 1)))
  96.         lda Fac1+4      ; int(X/2)
  97.         clc
  98.         adc varL
  99.         sta varL        ; varL = int(X/2) + 40 * int(Y/2)      
  100.         lda #>Scr
  101.         adc varL+1
  102.         sta varL+1      ; varL = Scr + int(X/2) + 40 * int(Y/2)
  103.  
  104.         ; Draw new point on the screen
  105.         ldy #0
  106.         ldx #15
  107.         lda (varL),y    ; get the byte from screen mem
  108. _loop   cmp _plotab,x   ; seek the value in the table
  109.         beq _found
  110.         dex
  111.         bpl _loop
  112. _found  txa
  113.         ora varB        ; add the offset for the new value
  114.         tax
  115.         lda _plotab,x   ; load the new value
  116.         sta (varL),y    ; on the screen
  117.        
  118.         ; increment counter and check the loop condition
  119.         lda #<varI
  120.         ldy #>varI
  121.         jsr MOVFM       ; Copy counter to Fac1
  122.  
  123.         lda #<Point03
  124.         ldy #>Point03
  125.         jsr FADD                                 ; Fac1 = I + 0.03
  126.  
  127.         ldx #<varI
  128.         ldy #>varI
  129.         jsr MOVMF       ; Copy Fac1 to counter   ; varI = I + 0.03
  130.  
  131.         lda #<fourPi
  132.         ldy #>fourPi
  133.         jsr FCOMP       ; compare I with 4*Pi
  134.         bpl _end        
  135.  
  136.         jmp ForLoop
  137.  
  138. _end    rts
  139.  
  140.  
  141. Fac1Div2
  142.         lda Fac1        ; if exponent > 0
  143.         beq _end
  144.         dec Fac1        ; decrement exponent (i.e. value=value/2)
  145.         rts
  146.  
  147.  
  148. ; memory references
  149. Scr=$400
  150. Fac1=$61
  151. Fac2=$69
  152.  
  153. ; System references
  154. FCOMP=$bc5b
  155. MOVMF=$bbd4
  156. MOVFM=$bba2
  157. F2INT=$b1bf
  158. FCOS =$e264
  159. FSIN =$e26b
  160. FADD =$b867
  161. FMUL =$ba28
  162. CLRSCR=$e544
  163.  
  164. ; variables
  165. varB=$2                                 ; offset in the _plotab
  166. varL=$fb                                ; Screen Location to plot
  167. varI    byte 00, 00, 00, 00, 00         ; counter
  168. varP    byte 00, 00, 00, 00, 00
  169.  
  170. ; constants
  171. fourPi  byte $84, $49, $0f, $da, $a1    ; 4*Pi
  172. Point03 byte $7b, $75, $c2, $8f, $5d    ; 0.03
  173. _24     byte $85, $40, 00, 00, 00       ; 24
  174. _25     byte $85, $48, 00, 00, 00       ; 25
  175. _39     byte $86, $1c, 00, 00, 00       ; 39
  176. _40     byte $86, $20, 00, 00, 00       ; 40
  177.  
  178. _plotab byte  32,126,124,226,123, 97,255,236
  179.         byte 108,127,225,251, 98,252,254,160
  180. _pwr2   byte   1, 2, 4, 8
  181.  
RAW Paste Data