Advertisement
Guest User

Untitled

a guest
Jan 8th, 2018
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;AIMING_X_TO_Y : Set Obj[x]'s velocity toward Obj[y], its speed is V_AIMING_LO,V_AIMING_HI.
  2. ;ATAN_X_TO_Y : Get 8 bits wide binary degree angle toward Obj[y] from Obj[x].
  3.  
  4. ;Note: These routines are NOT validated well, though these are used for 4mi...
  5.  
  6. ;角度は、→x ↓yの自然なものにしてあるので注意
  7. AIMING_X_TO_0302_0100:
  8.     jsr ATAN_X_TO_0302_0100
  9.     jmp SET_VELOCITY_POLAR
  10. AIMING_X_TO_Y:
  11.     jsr ATAN_X_TO_Y
  12. SET_VELOCITY_POLAR:
  13.  
  14.     tya
  15.  
  16.     ;x速度のセット
  17.     pha ;1
  18.     tay
  19.     jsr .my_abs_cos
  20.     sta A_ObjVxlo,x
  21.     pla ;1
  22.     ;y速度のセット
  23.     pha ;2
  24.     tay
  25.     jsr .my_abs_sin
  26.     sta A_ObjVylo,x
  27.     ;速度上位クリア
  28. ;   lda #$00
  29. ;   sta A_ObjVxhi,x
  30. ;   sta A_ObjVyhi,x
  31. ;移動方向フラグをセット
  32.     pla ;2
  33.     asl a
  34.     rol <$00
  35.     asl a
  36.     rol <$00
  37.     lda <$00
  38.     and #$03
  39.     tay
  40.     lda .move_toward_table,y
  41.     sta $0420,x ; Obj移動方向<????上下左右>[%X]
  42.  
  43. ;掛け算※xレジスタ破壊
  44.  
  45.     ;X方向
  46.     ;00.## * 00.##
  47.     txa
  48.     pha ;[1]
  49.  
  50.     lda V_AIMING_LO
  51.     sta <$00
  52.     lda A_ObjVxlo,x
  53.     sta <$01
  54.     jsr $FC7B
  55.  
  56.     pla ;[1]
  57.     tax
  58.  
  59.     ;00.00**の部分には興味が無い……四捨五入とかしなくていいよね?
  60.     lda <$03
  61.     pha ;[1]
  62.  
  63.     ;00.## * ##
  64.     txa
  65.     pha ;[2]
  66.  
  67.     lda V_AIMING_HI
  68.     sta <$00
  69.     lda A_ObjVxlo,x
  70.     sta <$01
  71.     jsr $FC7B
  72.  
  73.     pla ;[2]
  74.     tax
  75.    
  76.     ;結果の足し合わせと書き込み
  77.     clc
  78.     pla ;[1]
  79.     adc <$02
  80.     sta A_ObjVxlo,x
  81.     lda <$03
  82.     adc #$00
  83.     sta A_ObjVxhi,x
  84.  
  85.     ;Y方向
  86.     ;00.## * 00.##
  87.     txa
  88.     pha ;[1]
  89.  
  90.     lda V_AIMING_LO
  91.     sta <$00
  92.     lda A_ObjVylo,x
  93.     sta <$01
  94.     jsr $FC7B
  95.  
  96.     pla ;[1]
  97.     tax
  98.  
  99.     ;00.00**の部分には興味が無い……四捨五入とかしなくていいよね?
  100.     lda <$03
  101.     pha ;[1]
  102.  
  103.     ;00.## * ##
  104.     txa
  105.     pha ;[2]
  106.  
  107.     lda V_AIMING_HI
  108.     sta <$00
  109.     lda A_ObjVylo,x
  110.     sta <$01
  111.     jsr $FC7B
  112.  
  113.     pla ;[2]
  114.     tax
  115.    
  116.     ;結果の足し合わせと書き込み
  117.     clc
  118.     pla ;[1]
  119.     adc <$02
  120.     sta A_ObjVylo,x
  121.     lda <$03
  122.     adc #$00
  123.     sta A_ObjVyhi,x
  124.  
  125.     rts
  126.  
  127. .move_toward_table
  128.     .db $5,$6,$A,$9
  129.  
  130.  
  131. .my_abs_sin
  132.     tya
  133.     and #$7F
  134.  
  135.     cmp #$40
  136.     and #$3F
  137.     bcc .sin_not_inverse
  138.     sta <$00
  139.     sec
  140.     lda #$3F
  141.     sbc <$00
  142. .sin_not_inverse
  143.     tay
  144.     lda UTIL_SIN_TABLE_64_256,y
  145.     rts
  146.  
  147. .my_abs_cos
  148.     tya
  149.     clc
  150.     adc #$40
  151.     tay
  152.     jmp .my_abs_sin
  153.  
  154.  
  155. UTIL_ABS_SIN:
  156.     tya
  157.     and #$7F
  158.  
  159.     cmp #$40
  160.     and #$3F
  161.     bcc .sin_not_inverse
  162.     sta <$00
  163.     sec
  164.     lda #$3F
  165.     sbc <$00
  166. .sin_not_inverse
  167.     tay
  168.     lda UTIL_SIN_TABLE_64_256,y
  169.     tay
  170.  
  171.     rts
  172.  
  173. ;y=sin(y)    -7F<=戻値<=7F
  174. UTIL_SIN:
  175.     sty <$01
  176.     jsr UTIL_ABS_SIN
  177.     tya
  178.     lsr a
  179.     asl <$01
  180.     bcc .plus
  181.     INV_A
  182. .plus
  183.     tay
  184.     rts
  185.  
  186. UTIL_SIN_TABLE_64_256:
  187.     .db $00,$06,$0D,$13,$19,$1F,$26,$2C,$32,$38,$3E,$44,$4A,$50,$56,$5C
  188.     .db $62,$68,$6D,$73,$79,$7E,$84,$89,$8E,$93,$98,$9D,$A2,$A7,$AC,$B1
  189.     .db $B5,$B9,$BE,$C2,$C6,$CA,$CE,$D1,$D5,$D8,$DC,$DF,$E2,$E5,$E7,$EA
  190.     .db $ED,$EF,$F1,$F3,$F5,$F7,$F8,$FA,$FB,$FC,$FD,$FE,$FF,$FF,$FF,$FF ;$100,$100
  191.  
  192. ATAN_X_TO_Y:
  193. ;Δx   $03~$02
  194. ;Δy   $01~$00
  195. ;$04flag     0 0 0 0   0 yxcoodinate yinv xinv
  196.  
  197.  
  198.     lda A_ObjXhi,y
  199.     sta <$02
  200.     lda A_ObjYhi,y
  201.     sta <$00
  202. ATAN_X_TO_Y_Hi:
  203.     lda A_ObjXhe,y
  204.     sta <$03
  205.     lda A_ObjYhe,y
  206.     sta <$01
  207.  
  208. ATAN_X_TO_0302_0100:
  209. ;ココから処理開始
  210.  
  211.  
  212.     sec
  213.     lda <$02
  214.     sbc A_ObjXhi,x
  215.     sta <$02
  216.     lda <$03
  217.     sbc A_ObjXhe,x
  218.     sta <$03
  219.  
  220.     sec
  221.     lda <$00
  222.     sbc A_ObjYhi,x
  223.     sta <$00
  224.     lda <$01
  225.     sbc A_ObjYhe,x
  226.     sta <$01
  227.  
  228. ATAN_Delta_0302_0100:
  229.     lda #$00
  230.     sta <$04
  231.  
  232. ;X負チェック
  233.     lda <$03
  234.     bpl .delta_x_isnot_minus
  235.     lda <$02
  236.     eor #$FF
  237.     clc
  238.     adc #$01
  239.     sta <$02
  240.     lda <$03
  241.     eor #$FF
  242.     adc #$00
  243.     sta <$03
  244.    
  245. ;   lda <$04 ;^
  246. ;   ora #$01 ;|
  247.     lda #$01 ;v
  248.     sta <$04
  249. .delta_x_isnot_minus
  250.  
  251. ;Y負チェック
  252.     lda <$01
  253.     bpl .delta_y_isnot_minus
  254.     lda <$00
  255.     eor #$FF
  256.     clc
  257.     adc #$01
  258.     sta <$00
  259.     lda <$01
  260.     eor #$FF
  261.     adc #$00
  262.     sta <$01
  263.     lda <$04
  264.     ora #$02
  265.     sta <$04
  266. .delta_y_isnot_minus
  267.  
  268. ;ΔxとΔyの大小関係をチェック
  269.  
  270.     sec
  271.     lda <$01 ;Δyhe
  272.     sbc <$03 ;Δxhe
  273.     bcc .delta_x_is_greater
  274.     bne .delta_y_is_greater
  275. ;延長戦
  276.     ;sec
  277.     lda <$00 ;Δyhi
  278.     sbc <$02 ;Δxhi
  279.     bcc .delta_x_is_greater
  280.     beq .delta_x_is_greater ;きわどいところだが同じならxが大きいことに
  281. .delta_y_is_greater
  282.     lda <$02 ;Δxhi
  283.     pha
  284.     lda <$00 ;Δyhi
  285.     sta <$02 ;Δxhi
  286.     pla
  287.     sta <$00 ;Δyhi
  288.  
  289.     lda <$03 ;Δxhe
  290.     pha
  291.     lda <$01 ;Δyhe
  292.     sta <$03 ;Δxhe
  293.     pla
  294.     sta <$01 ;Δyhe
  295.  
  296.     lda <$04
  297.     ora #$04
  298.     sta <$04
  299.  
  300. .delta_x_is_greater
  301.  
  302. ;以上の処理により、フラグにより扱いを変えるほかは、
  303. ;Δx >= Δy
  304. ;となった
  305.  
  306. ;フラグだけは退避しておく
  307.     lda <$04
  308.     pha
  309.  
  310. ;除算処理に送り込む
  311. ;実はこのΔx、Δyの取りかたで除算処理にちょうど送り込める
  312.     jsr $FC3A
  313. ;$05~$04に帰ってくる
  314.  
  315. ;   ;テスト(2以上にはならないはず……)
  316. ;.lock
  317. ;   lda <$05
  318. ;   cmp #$02
  319. ;   bcs .lock
  320.  
  321.     ldy #$20
  322.     lda <$05
  323.     bne .dx_equal_to_dy
  324.     lda <$04
  325.     lsr a
  326.     tay
  327.     lda .atan_table128,y
  328.     tay
  329. .dx_equal_to_dy
  330.     sty <$00
  331.  
  332. ;フラグを取り出した
  333.     pla
  334.     sta <$01
  335.     ldy <$01
  336.     lda .is_reverse,y
  337.     beq .not_reverse_angle
  338.     clc
  339.     lda <$00
  340.     eor #$FF
  341.     adc #$01
  342.     sta <$00
  343. .not_reverse_angle
  344.     ldy <$01
  345.     lda .atan_add_angle,y
  346.     clc
  347.     adc <$00
  348.  
  349.     tay
  350.     rts
  351.  
  352. .is_reverse
  353.     .db 0,1,1,0
  354.     .db 1,0,0,1
  355.  
  356. .atan_add_angle
  357.     .db $00,$80,$00,$80
  358.     .db $40,$40,$C0,$C0
  359.  
  360.  
  361. .atan_table128
  362.     .db $00,$00,$01,$01,$01,$02,$02,$02,$03,$03,$03,$03,$04,$04,$04,$05
  363.     .db $05,$05,$06,$06,$06,$07,$07,$07,$08,$08,$08,$08,$09,$09,$09,$0A
  364.     .db $0A,$0A,$0B,$0B,$0B,$0B,$0C,$0C,$0C,$0D,$0D,$0D,$0D,$0E,$0E,$0E
  365.     .db $0F,$0F,$0F,$0F,$10,$10,$10,$11,$11,$11,$11,$12,$12,$12,$12,$13
  366.     .db $13,$13,$13,$14,$14,$14,$14,$15,$15,$15,$15,$16,$16,$16,$16,$17
  367.     .db $17,$17,$17,$17,$18,$18,$18,$18,$19,$19,$19,$19,$19,$1A,$1A,$1A
  368.     .db $1A,$1A,$1B,$1B,$1B,$1B,$1B,$1C,$1C,$1C,$1C,$1C,$1D,$1D,$1D,$1D
  369.     .db $1D,$1D,$1E,$1E,$1E,$1E,$1E,$1F,$1F,$1F,$1F,$1F,$1F,$20,$20,$20
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement