home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / programs / emulaton / asm6503 / examples / c64sprite < prev    next >
Text File  |  1998-08-25  |  4KB  |  136 lines

  1. ;Alain BROBECKER (aka baah/Arm's Tech), 07sep1997
  2. ;Sprites bouncing on screen
  3.             #name       c64SpriteX
  4.             #type       &064
  5.             #list
  6.             #base       &801-2
  7.  
  8. ;---- Constants ----------------------------------------------------------------
  9. ; &fb to &fe can be used as temp?
  10. #set CountDown = &fb                ; used as a timer
  11.  
  12. ;---- C64 specific part... loading adress+BASIC stuff --------------------------
  13.   #rw       &0801                   ; Load adress (C64)
  14.   #rw       BasicEnd,1997           ; Adress of next line + line number
  15.   #b        &9e,&32,&30,&36,&32     ; Basic "SYS2062" instruction
  16.   #b        0                       ; End of basic line
  17. .BasicEnd
  18.   #b        0,0,0                   ; End of basic program
  19. ;---- Assembly language ForEVER ------------------------------------------------
  20. .start
  21.   ldx       #7
  22. .init_sprites
  23.   lda       #sprite>>6              ; Sprite's adress
  24.   sta       &7f8,x                  ; Save sprite adress for sprite x
  25.   txa
  26.   ora       #&8
  27.   sta       &d027,x                 ; Save sprite's color
  28.   dex
  29.   bpl       init_sprites
  30.   lda       #&ff
  31.   sta       &d015                   ; All sprites activated
  32.   sta       &d017                   ; Vsize*2
  33.   sta       &d01d                   ; Hsize*2
  34.   lda       #0
  35.   sta       &d010                   ; sprites' 9th bit of x_pos set to 0
  36.  
  37.   lda       #0
  38.   sta       z,CountDown
  39. .one_frame
  40.   ldy       #&0                     ; Video synchronisation
  41. .vsync
  42.   cpy       &d012
  43.   bne       vsync
  44.   ldx       #15
  45. .one_sprite
  46.   lda       z,CountDown
  47.   sta       &400
  48.   and       #&f
  49.   bne       no_gravity
  50.   inc       sprite_speed,x          ; vy+=1 for gravity
  51. .no_gravity
  52. ; Perform mvts+bounce on y pos
  53.   clc
  54.   lda       sprite_pos,x            ; akku=y
  55.   adc       sprite_speed,x          ; akku=y+vy
  56.   cmp       #50                     ; flags=y+vy-50
  57.   bcs       yup_ok
  58.   sec
  59.   lda       #0
  60.   sbc       sprite_speed,x          ; akku=-vy
  61.   sta       sprite_speed,x          ; vy=-vy
  62.   clc
  63.   adc       sprite_pos,x            ; akku=y+vy
  64. .yup_ok
  65.   cmp       #229                    ; flags=y+vy-229
  66.   bcc       ydown_ok
  67.   sec
  68.   lda       #0
  69.   sbc       sprite_speed,x          ; akku=-vy
  70.   sta       sprite_speed,x          ; vy=-vy
  71.   clc
  72.   adc       sprite_pos,x            ; akku=y+vy
  73. .ydown_ok
  74.   sta       &d000,x
  75.   sta       sprite_pos,x
  76. ; Do the same with x position
  77.   dex
  78.   clc
  79.   lda       sprite_pos,x            ; akku=x
  80.   adc       sprite_speed,x          ; akku=x+vx
  81.   cmp       #24                     ; flags=x+vx-24
  82.   bcs       xleft_ok
  83.   sec
  84.   lda       #0
  85.   sbc       sprite_speed,x          ; akku=-vx
  86.   sta       sprite_speed,x          ; vy=-vx
  87.   clc
  88.   adc       sprite_pos,x            ; akku=x+vx
  89. .xleft_ok
  90.   cmp       #255                    ; flags=x+vx-200
  91.   bcc       xright_ok
  92.   sec
  93.   lda       #0
  94.   sbc       sprite_speed,x          ; akku=-vx
  95.   sta       sprite_speed,x          ; vx=-vx
  96.   clc
  97.   adc       sprite_pos,x            ; akku=x+vx
  98. .xright_ok
  99.   sta       &d000,x
  100.   sta       sprite_pos,x
  101.   dex
  102.   bpl       one_sprite
  103.   dec       z,CountDown
  104.   bne       one_frame
  105.   rts
  106.  
  107. ;---- Datas --------------------------------------------------------------------
  108. .sprite_pos
  109.   #b 80,80, 100,100, 120,120, 140,140, 160,160, 180,180, 200,200, 220,220
  110. .sprite_speed
  111.   #b 2,0, 2,0, 3,0, 1,0, 4,0, 3,0, 1,0, 2,0
  112.  
  113. #align &3f,0                        ; Sprite's adress must be a multiple of 64
  114. .sprite
  115.   #b %00000000,%11111000,%00000000
  116.   #b %00000011,%11111110,%00000000
  117.   #b %00001111,%11111111,%10000000
  118.   #b %00011111,%11111111,%11000000
  119.   #b %00111111,%11110001,%11100000
  120.   #b %00111111,%11100000,%11100000
  121.   #b %01111011,%11000100,%01110000
  122.   #b %01110001,%11001110,%01110000
  123.   #b %11111011,%11000100,%01111000
  124.   #b %11111111,%11100000,%11111000
  125.   #b %11111111,%11110001,%11111000
  126.   #b %11111111,%11111111,%11111000
  127.   #b %11111111,%11111111,%11111000
  128.   #b %01111111,%11111111,%11110000
  129.   #b %01111100,%11111111,%11110000
  130.   #b %00111000,%01111111,%11100000
  131.   #b %00111000,%01111111,%11100000
  132.   #b %00011100,%11111111,%11000000
  133.   #b %00001111,%11111111,%10000000
  134.   #b %00000011,%11111110,%00000000
  135.   #b %00000000,%11111000,%00000000
  136.