home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / demos / baah / CakeHead2 / Cake2_Src / BubblePart < prev    next >
Encoding:
Text File  |  1995-12-03  |  21.7 KB  |  554 lines

  1. ;                                     \|/
  2. ;                                     O O
  3. ; --------------------------------oOO--U--OOo--------------------------------
  4. ; |                                                                         |
  5. ; |                              Jelly Bubbles.                             |
  6. ; |                       By Alain BROBECKER. (as Baah)                     |
  7. ; |                                                                         |
  8. ; ---------------------------------------------------------------------------
  9. ;
  10. ; Parameter for this effect.
  11. ;    A variable called bubble_time.
  12. ;    r0=adress of a buffer for xleft-xright tables.
  13. ;
  14. ;    * This effect, though nice, is not really interesting. This is not real
  15. ; 3d, and movements are not realistic, so I won' t comment it too much. The
  16. ; only things you may appreciate are...
  17. ;    1)  Clipping, achieved by putting the good values in the xleft-xright
  18. ;        edges lookup table when x<0 or x>319.
  19. ;    2)  The axial ellipses routine. I' m ashamed to say that it is based
  20. ;        upon precalculations, so it is not all that interesting.
  21. ;    * The background must be filled with 0, and all colors must be black.
  22. ; NOTATIONS...
  23. ;     r for radius.
  24. ;     b for bubble.
  25. ;     r for reflex.
  26. ;     s for shadow.
  27. ;     x for x coord.
  28. ;     y for y coord.
  29. ; For example rxr = x coord of reflex radius.
  30. ;             yb = y coord of bubble. (its center, then)
  31.  
  32.  
  33. #set        clip_nb = 192           ; Nb of clipped pixels for filling.
  34. #set        dist_user = 450         ; Distance between user and screen.
  35. #set        dist_user2 = 8          ; The shift for dist_user.
  36. #set        obj_radius = 200        ; Radius of group of bubbles.
  37. #set        rad_b = 70              ; Radius of bubble.
  38. #set        rad_r = 12              ; Radius of reflex.
  39. #set        pos_r = 35              ; Dist betweem bubble and reflex centers.
  40. #set        y_ground = 90
  41. #set        recenter_y = 129
  42.  
  43. .bubble_part
  44.   stmfd     r13!,{r0-r12,r14}
  45.  
  46. ; Creates tables for converting x values to mask+offset. This tables will
  47. ; be used for a str hline filling routine in Mode9. You must note that
  48. ; the clipping is achieved by saving, for x<0 and x>319, masks+offsets which
  49. ; won' t affect the filling. (ie mask is null, and offset is -4 or 160)
  50.   mov       r1,#clip_nb             ; Nb of clipped pixels.
  51.   add       r2,r0,r1,lsl #4
  52.   add       r2,r2,#320*8            ; r2 points on xright table.
  53.   sub       r3,r2,r1,lsl #3         ; r3 points on right clipping of xleft.
  54.   add       r4,r2,#320*8
  55.   add       r4,r4,r1,lsl #3         ; r4 points on right clipping of xright.
  56.   mov       r5,#0                   ; Null mask.
  57.   mov       r6,#-4                  ; Offsets for clipped pixels.
  58.   mov       r7,#160
  59. ._make_clipped_pixels_one
  60.   stmia     r0!,{r5,r6}             ; Save left clipped pixels.
  61.   stmia     r2!,{r5,r6}
  62.   stmia     r3!,{r5,r7}             ; Save right clipped pixels.
  63.   stmia     r4!,{r5,r7}
  64.   subS      r1,r1,#1
  65.   bNE       _make_clipped_pixels_one
  66.   mov       r1,r4                   ; r1=r4 points after the two tables.
  67.   mov       r3,r0                   ; Don' t modify r0 and r2, which are
  68.   mov       r4,r2                   ; pointing on visibles pixels in tables.
  69.   mov       r5,#40                  ; 40 sets of 8 pixels.
  70.   mov       r9,#0                   ; r9=offset.
  71. ._make_eight_pixels
  72.   mov       r6,#&ffffffff           ; Mask of xleft pixel.
  73.   mov       r8,#8                   ; 8 pixels per long.
  74. ._make_one_pixel
  75.   stmia     r3!,{r6,r9}             ; Save mask_left | offset.
  76.   mov       r6,r6,lsl #4            ; Mask for next xleft pixel.
  77.   mvn       r7,r6                   ; Mask for current xright pixel.
  78.   stmia     r4!,{r7,r9}             ; Save mask_right | offset.
  79.   subS      r8,r8,#1                ; One pixel done.
  80.   bNE       _make_one_pixel
  81.   add       r9,r9,#4                ; Next offset.
  82.   subS      r5,r5,#1                ; One long donr.
  83.   bNE       _make_eight_pixels
  84.   str       r0,bb_xleft_ad          ; Save adresses.
  85.  
  86. ;---- Now the demo really begins! -------------------------------------------
  87.   adr       r2,_bubbles_colors      ; Set colors.
  88.   bl        set_palette
  89.   bl        get_showscreen          ; r0=showscreen adress.
  90.   bl        bubble_design1          ; Let' s have nice transitions.
  91.   bl        get_workscreen
  92.   bl        bubble_clear            ; Clear screen.
  93.  
  94. ._one_frame
  95.   bl        wait_and_swap           ; Wait vsync, swap screens, r0=workscreen.
  96.   bl        bubble_clear            ; Clear screen.
  97.  
  98.   adr       r1,_bubbles_parameters
  99.   adr       r2,_new_parameters
  100.   adr       r3,bss+sin_cos_ad
  101.   adr       r4,bss+inv_ad
  102.   mov       r5,#6                   ; 6 bubbles.
  103. ._calc_one_bubble
  104.   ldmia     r1,{r6-r7}              ; Load gel_pos and angle.
  105.   subS      r7,r7,#3                ; Decrement angle.
  106.   movMI     r7,#511
  107.   add       r6,r6,#1                ; Increment gel_pos.
  108.   cmp       r6,#120                 ; Flags=gel_pos-120.
  109.   subPL     r6,r6,#120
  110.   stmia     r1!,{r6-r7}             ; Store new parameters.
  111.   ldr       r8,[r3,r7,lsl #2]       ; r8=65536*sin(angle).
  112.   add       r7,r7,#128
  113.   ldr       r7,[r3,r7,lsl #2]       ; r7=65536*cos(angle).
  114.   mov       r9,#obj_radius
  115.   mul       r8,r9,r8                ; r8=65536*obj_radius*sin.
  116.   mul       r7,r9,r7                ; r7=65536*obj_radius*cos.
  117.   ldr       r9,_x_object
  118.   add       r7,r9,r7,asr #16        ; r7=new_x.
  119.   ldr       r9,_z_object
  120.   add       r9,r9,#dist_user
  121.   add       r8,r9,r8,asr #16        ; r8=new_z+dist_user.
  122.   str       r8,[r2],#4              ; Save z of bubble.
  123.   ldr       r8,[r4,r8,lsl #2]       ; r8=65536/(z+dist_user).
  124.   mul       r7,r8,r7                ; r7=x*65536/(z+dist_user).
  125.   mov       r7,r7,asr #dist_user2   ; r7=xb.
  126.   str       r7,[r2],#4              ; Save xb of bubble.
  127.   adr       r9,_gel_mvts
  128.   add       r6,r6,r6,lsl #1         ; r6=gel_pos*3.
  129.   add       r6,r9,r6,lsl #2         ; r6 points on good gel pos...
  130.   ldmia     r6,{r6,r9,r10}          ; Load y,mulx,muly.
  131.   mul       r6,r8,r6                ; r6=y*65536/(z+dist_user).
  132.   mov       r6,r6,asr #dist_user2   ; r6=yb.
  133.   str       r6,[r2],#4              ; Save yb of bubble.
  134.   mov       r11,#pos_r
  135.   mul       r12,r10,r11             ; r12=65536*muly*pos_r.
  136.   mov       r12,r12,asr #16
  137.   mul       r11,r9,r11              ; r11=65536*mulx*pos_r.
  138.   mov       r11,r11,asr #16
  139.   mul       r11,r8,r11              ; r11=mulx*pos_r/(z+dist_user).
  140.   mov       r11,r11,asr #dist_user2
  141.   add       r11,r11,r7              ; r11=xb+...=xr.
  142.   mul       r12,r8,r12              ; r12=muly*pos_r/(z+dist_user).
  143.   mov       r12,r12,asr #dist_user2
  144.   sub       r12,r6,r12              ; r12=yb-...=yr.
  145.   stmia     r2!,{r11,r12}           ; Save xr and yr.
  146.   mov       r6,#y_ground
  147.   mul       r6,r8,r6                ; r6=y_ground*65536/(z+dist_user).
  148.   mov       r6,r6,asr #dist_user2
  149.   str       r6,[r2],#4              ; Save ys.
  150.   mov       r6,#rad_b
  151.   mul       r6,r9,r6                ; r6=65536*mulx*rad_b.
  152.   mov       r6,r6,asr #16
  153.   mul       r7,r8,r6                ; r7=mulx*rad_b/(z+dist).
  154.   mov       r7,r7,asr #dist_user2
  155.   str       r7,[r2],#4              ; Save rxb.
  156.   mov       r7,#rad_b
  157.   mul       r7,r10,r7               ; r7=65536*muly*rad_b.
  158.   mov       r7,r7,asr #16
  159.   mul       r7,r8,r7                ; r7=muly*rad_b/(z+dist).
  160.   mov       r7,r7,asr #dist_user2
  161.   str       r7,[r2],#4              ; Save ryb.
  162.   mov       r7,#rad_r
  163.   mul       r7,r9,r7                ; r7=65536*mulx*rad_r.
  164.   mov       r7,r7,asr #16
  165.   mul       r7,r8,r7                ; r7=mulx*rad_r/(z+dist).
  166.   mov       r7,r7,asr #dist_user2
  167.   str       r7,[r2],#4              ; Save rxr.
  168.   mov       r7,#rad_r
  169.   mul       r7,r10,r7               ; r7=65536*muly*rad_r.
  170.   mov       r7,r7,asr #16
  171.   mul       r7,r8,r7                ; r7=muly*rad_r/(z+dist).
  172.   mov       r7,r7,asr #dist_user2
  173.   str       r7,[r2],#4              ; Save ryr.
  174.   ldr       r7,[r2,#-40]            ; Load z+dist_user.
  175.   add       r6,r7,r6                ; r6=z+dist_user+rad_b*mulx.
  176.   ldr       r6,[r4,r6,lsl #2]       ; r6=65536/(...).
  177.   mov       r7,#y_ground
  178.   mul       r7,r6,r7                ; r7=y_ground/(...).
  179.   mov       r7,r7,asr #dist_user2
  180.   ldr       r6,[r2,#-20]            ; r6=ys.
  181.   sub       r7,r6,r7
  182.   str       r7,[r2],#4              ; Save rys.
  183.   subS      r5,r5,#1
  184.   bNE       _calc_one_bubble
  185.  
  186. ._print_shadows
  187.   adr       r10,_new_parameters
  188.   mov       r11,#6
  189.   mov       r1,#&33333333
  190. ._one_shadow
  191.   ldr       r2,[r10,#4]
  192.   add       r2,r2,#159
  193.   ldr       r3,[r10,#20]
  194.   add       r3,r3,#recenter_y
  195.   ldr       r4,[r10,#24]
  196.   ldr       r5,[r10,#40]
  197.   bl        ellipse
  198.   add       r10,r10,#44
  199.   subS      r11,r11,#1
  200.   bNE       _one_shadow
  201.  
  202. ._print_bubbles
  203.   adr       r11,_bubbles_patterns
  204.   mov       r12,#6
  205. ._search_zmax
  206.   adr       r10,_new_parameters
  207.   mov       r9,#0                   ; r9=zmax.
  208.   mov       r8,#0
  209. ._search_z_one
  210.   ldr       r7,[r10],#44
  211.   cmp       r9,r7                   ; Flags=zmax-z?
  212.   movMI     r6,r8                   ; Then say which bubble is max.
  213.   movMI     r9,r7                   ; And new zmax.
  214.   add       r8,r8,#1
  215.   cmp       r8,#6
  216.   bNE       _search_z_one
  217. ._zmax_found
  218.   adr       r10,_new_parameters
  219.   add       r9,r11,r6,lsl #3        ; r9 points on bubble colours.
  220.   add       r7,r6,r6,lsl #2         ; r7=pos*5.
  221.   add       r6,r6,r7,lsl #1         ; r6=pos*11.
  222.   add       r10,r10,r6,lsl #2       ; r10 points on bubble.
  223.   mov       r6,#0
  224.   str       r6,[r10],#4             ; Bubble done.
  225.   ldr       r1,[r9],#4              ; Colour.
  226.   ldr       r2,[r10],#4             ; xb.
  227.   add       r2,r2,#159
  228.   ldr       r3,[r10],#4             ; yb.
  229.   add       r3,r3,#recenter_y
  230.   ldr       r4,[r10,#12]            ; rxb.
  231.   ldr       r5,[r10,#16]            ; ryb.
  232.   bl        ellipse
  233.   ldr       r1,[r9]
  234.   ldr       r2,[r10],#4             ; xr.
  235.   add       r2,r2,#159
  236.   ldr       r3,[r10],#4             ; yr.
  237.   add       r3,r3,#recenter_y
  238.   ldr       r4,[r10,#12]            ; rxr.
  239.   ldr       r5,[r10,#16]            ; ryr.
  240.   bl        ellipse
  241.   subS      r12,r12,#1              ; One bubble drawn.
  242.   bNE       _search_zmax
  243.  
  244. ; Now, we go on with the bubbles lateral movements.
  245.   bl        read_time               ; r0=time elapsed.
  246.   ldr       r1,_x_object            ; X movements.
  247.   cmp       r1,#0
  248.   addMI     r1,r1,#4                ; If x<0 then we add 4 to x so that the
  249.   strMI     r1,_x_object            ; bubbles enter the screen.
  250.   bMI       _one_frame
  251.   cmp       r0,#bubble_time         ; Time elapsed?
  252.   bLE       _one_frame
  253.   add       r1,r1,#4                ; If time has passed, we add 4 to x,
  254.   str       r1,_x_object            ; so that bubles go out of screen.
  255.   cmp       r1,#600
  256.   bMI       _one_frame
  257.  
  258.   bl        get_showscreen          ; r0=showscreen adress.
  259.   bl        bubble_design2
  260.  
  261.   ldmfd     r13!,{r0-r12,pc}        ; Bye...
  262.  
  263. ; ===========================================================================
  264. ; =                                                                         =
  265. ; =                              MAIN DATAS                                 =
  266. ; =                                                                         =
  267. ; ===========================================================================
  268.  
  269. ._bubbles_colors
  270.   dcb       &00,&00,&00,&50,&50,&50,&40,&40,&40,&30,&30,&30
  271.   dcb       &50,&00,&00,&80,&00,&00,&00,&40,&00,&00,&60,&00
  272.   dcb       &00,&00,&60,&00,&00,&b0,&50,&50,&00,&70,&70,&00
  273.   dcb       &50,&00,&50,&80,&00,&80,&00,&50,&50,&00,&70,&70
  274.  
  275. ._bubbles_parameters
  276.   dcd       0,0                     ; Gel pos and angle...
  277.   dcd       60,85
  278.   dcd       20,171
  279.   dcd       80,256
  280.   dcd       40,341
  281.   dcd       100,427
  282.  
  283. ._bubbles_patterns
  284.   dcd       &44444444,&55555555     ; Colours of bubble and reflex.
  285.   dcd       &aaaaaaaa,&bbbbbbbb
  286.   dcd       &66666666,&77777777
  287.   dcd       &eeeeeeee,&ffffffff
  288.   dcd       &88888888,&99999999
  289.   dcd       &cccccccc,&dddddddd
  290.  
  291. ._x_object
  292.   dcd       -600
  293. ._z_object
  294.   dcd       0
  295.  
  296. ._new_parameters                    ; Here are saved...
  297.   dbd       66                      ; z|xb|yb|xr|yr|ys|rxb|ryb|rxr|ryr|rys.
  298.  
  299. ._gel_mvts
  300.   incbin    Datas.Movements
  301.  
  302. .bb_xleft_ad                        ; Will contain adresses of the tables.
  303.   dcd       0
  304.  
  305. ; ===========================================================================
  306. ; ===========================================================================
  307. ; =                                                                         =
  308. ; =                               ROUTINES                                  =
  309. ; =                                                                         =
  310. ; ===========================================================================
  311. ; ===========================================================================
  312.  
  313.  
  314. ; ***************************************************************************
  315. ; *****                                                                 *****
  316. ; *****              Routine which draws a simple ellipse.              *****
  317. ; *****                 By Alain BROBECKER. (as Baah)                   *****
  318. ; *****                    27-28 september 1994.                        *****
  319. ; *****                                                                 *****
  320. ; ***************************************************************************
  321. ;
  322. ; >-------------------------------------------------------------------------<
  323. ; Parameters of this routine...
  324. ;           r0=videoram adress.
  325. ;           r1=fill_pattern.
  326. ;           r2=x of the center.
  327. ;           r3=y of the center.
  328. ;           r4=radius_x.
  329. ;           r5=radius_y.
  330. ; >-------------------------------------------------------------------------<
  331. ;
  332. ; The routine uses symmetry and 8 Kb of precalcs. The precalcs are organised
  333. ; into two tables. The first table contains, for each circle radius,
  334. ; the succession of the increments to go from one x to another, when you
  335. ; change from one hline to another. The second table contains the offset
  336. ; of the circles tables, since their size are not constant.
  337. ; Routine is x clipped but not y clipped.
  338. ; The radius_x of the bubble must not exceed 127.
  339. ; Routine is made for mode9.
  340.  
  341. .ellipse
  342.   stmfd     r13!,{r0-r12,r14}
  343.   str       r13,_old_stack
  344.   addS      r6,r2,r4                ; r6=x+radius_x.
  345.   bMI       _end_ellipse            ; Don' t draw if x+radius_x<0.
  346.   sub       r6,r2,r4                ; r6=x-radius_x.
  347.   cmp       r6,#320                 ; Flags=x-radius_x-320.
  348.   bPL       _end_ellipse            ; Don' t draw if x-radius_x>319.
  349.   add       r3,r3,r3,lsl #2         ; r3=y*5.
  350.   add       r0,r0,r3,lsl #5         ; r0 points on y*160.
  351.   mov       r3,r0                   ; For the symmetry.
  352.   adr       r6,_circles
  353.   adr       r7,_circles_offsets
  354.   ldr       r7,[r7,r4,lsl #2]       ; r7=offset for the circle of radius x.
  355.   add       r6,r6,r7                ; r6 points on the good circle.
  356.   adr       r7,bss+inv_ad
  357.   ldr       r5,[r7,r5,lsl #2]       ; r5=65536/radius_y.
  358.   mul       r5,r4,r5                ; r5=65536*(radius_x/radius_y).
  359.   mov       r4,r4,lsl #16           ; r4=65536*radius_x.
  360.   add       r4,r4,#&8000            ; Nicer with r4=65536*(radius_x+0.5).
  361.   ldr       r7,bb_xleft_ad
  362. ._two_lines
  363.   ldrB      r8,[r6,r4,lsr #16]      ; Load x.
  364.   add       r9,r2,r8                ; r9=x_center+x=xmax.
  365.   sub       r8,r2,r8                ; r8=x_center-x=xmin.
  366.   add       r8,r7,r8,lsl #3         ; r8 points on xmin.
  367.   add       r9,r7,r9,lsl #3
  368.   add       r9,r9,#8*(320+(2*clip_nb)) ; r9 points on xmax.
  369.   ldmia     r8,{r8,r10}             ; Load masks+offsets.
  370.   ldmia     r9,{r9,r11}
  371.   subS      r11,r11,r10             ; r11=(nb_longs_2_draw-1)*4.
  372.   add       r12,r10,r0              ; r12 points on first word.
  373.   add       r10,r10,r3              ; The same for symmetry.
  374.   bEQ       _melted
  375. ._normal_fill
  376.   ldr       r13,[r12]               ; Load longs.
  377.   ldr       r14,[r10]
  378.   bic       r13,r13,r8              ; r13=long and not(mask).
  379.   bic       r14,r14,r8
  380.   and       r8,r8,r1                ; r8=mask and fill_pattern.
  381.   orr       r13,r13,r8
  382.   orr       r14,r14,r8
  383.   str       r13,[r12],#4            ; Store longs.
  384.   str       r14,[r10],#4
  385.   rsb       r8,r11,#33*4            ; r8=(33-(nb_longs-1))*4.
  386.   add       pc,pc,r8,lsl #1         ; Pass 2*... instructions.
  387.   mov       r0,r0                   ; Paglop.
  388. #rept 32
  389.   str       r1,[r12],#4
  390.   str       r1,[r10],#4
  391. #endr
  392.   ldr       r13,[r12]               ; Load last longs.
  393.   ldr       r14,[r10]
  394.   bic       r13,r13,r9              ; r13=long and not(mask).
  395.   bic       r14,r14,r9
  396.   and       r9,r9,r1                ; r9=mask and fill_pattern.
  397.   orr       r13,r13,r9
  398.   orr       r14,r14,r9
  399.   str       r13,[r12]               ; Store longs.
  400.   str       r14,[r10]
  401.   add       r0,r0,#160              ; Next line.
  402.   sub       r3,r3,#160
  403.   subS      r4,r4,r5                ; Points on next radius to use.
  404.   bPL       _two_lines
  405.   ldr       r13,_old_stack
  406.   ldmfd     r13!,{r0-r12,pc}
  407.  
  408. ._melted
  409.   and       r8,r8,r9                ; mask=mask_left and mask_right.
  410.   ldr       r13,[r12]               ; Load longs.
  411.   ldr       r14,[r10]
  412.   bic       r13,r13,r8              ; r13=long and not(mask).
  413.   bic       r14,r14,r8
  414.   and       r8,r8,r1                ; r8=mask and fill_pattern.
  415.   orr       r13,r13,r8
  416.   orr       r14,r14,r8
  417.   str       r13,[r12]               ; Store longs.
  418.   str       r14,[r10]
  419.   add       r0,r0,#160            ; Next line.
  420.   sub       r3,r3,#160
  421.   subS      r4,r4,r5                ; Points on next radius to use.
  422.   bPL       _two_lines
  423. ._end_ellipse
  424.   ldr       r13,_old_stack
  425.   ldmfd     r13!,{r0-r12,pc}
  426.  
  427. ._old_stack
  428.   dcd       0
  429. ._circles
  430.   incbin    Datas.Circles
  431. ._circles_offsets
  432.   incbin    Datas.Circle_off
  433.  
  434. ;****************************************************************************
  435. ;                                BUBBLE CLEAR
  436. ;****************************************************************************
  437. ; The screen is cleared with 140 lines in color 1, and the rest in color 2.
  438. ;           r0 points on the Mode9 screen.
  439.  
  440. .bubble_clear
  441.   stmfd     r13!,{r1-r12,r14}
  442.   str       r13,_old_stack
  443.   mov       r1,#&11111111
  444.   mov r2,r1:mov r3,r2:mov r4,r3:mov r5,r4:mov r6,r5:mov r7,r6:mov r8,r7
  445.   mov r9,r8:mov r10,r9:mov r11,r10:mov r12,r11:mov r13,r12
  446.   mov       r14,#10
  447. ._clear_many1
  448.   str       r14,_counter
  449.   mov       r14,r13                 ; Here, r1-r14=fill pattern.
  450.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  451.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  452.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  453.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  454.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  455.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  456.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  457.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  458.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  459.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  460.   ldr       r14,_counter
  461.   subS      r14,r14,#1
  462.   bNE       _clear_many1
  463. ; Fill second part of the screen.
  464.   mov       r1,#&22222222
  465.   mov r2,r1:mov r3,r2:mov r4,r3:mov r5,r4:mov r6,r5:mov r7,r6:mov r8,r7
  466.   mov r9,r8:mov r10,r9:mov r11,r10:mov r12,r11:mov r13,r12
  467.   mov       r14,#10
  468. ._clear_many2
  469.   str       r14,_counter
  470.   mov       r14,r13                 ; Here, r1-r14=fill pattern.
  471.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  472.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  473.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  474.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  475.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  476.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  477.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  478.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  479.   ldr       r14,_counter
  480.   subS      r14,r14,#1
  481.   bNE       _clear_many2
  482.   mov       r14,r13
  483.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  484.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}
  485.   stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r14}:stmia r0!,{r1-r6}
  486.   sub       r0,r0,#160*256          ; Restore r0.
  487.   ldr       r13,_old_stack
  488.   ldmfd     r13!,{r1-r12,pc}
  489. ._old_stack
  490.   dcd       0
  491. ._counter
  492.   dcd       0
  493.  
  494. ;****************************************************************************
  495. ; Those two routines are made to let the background appear in a nice way.
  496. ; I don' t comment them, they are dull, boring, tedious, stupid  and so on.
  497. ;           r0=videoram adress.
  498. .bubble_design1
  499.   stmfd     r13!,{r0-r12,r14}
  500.   mov       r12,r0
  501.   add       r11,r0,#(140*160)+156
  502.   mov       r3,#&11111111
  503.   mov       r4,#&22222222
  504.   mov       r5,#40
  505. ._one_vbl
  506.   mov       r0,#&13                 ; Wait for Vsync.
  507.   swi       OS_Byte
  508.   mov       r6,r12
  509.   add       r12,r12,#4
  510.   mov       r7,r11
  511.   sub       r11,r11,#4
  512.   mov       r8,#140
  513. ._fill1
  514.   str       r3,[r6],#160
  515.   subS      r8,r8,#1
  516.   bNE       _fill1
  517.   mov       r8,#116
  518. ._fill2
  519.   str       r4,[r7],#160
  520.   subS      r8,r8,#1
  521.   bNE       _fill2
  522.   subS      r5,r5,#1
  523.   bNE       _one_vbl
  524.   ldmfd     r13!,{r0-r12,pc}
  525.  
  526. .bubble_design2
  527.   stmfd     r13!,{r0-r12,r14}
  528.   mov       r12,r0
  529.   add       r11,r0,#(140*160)+156
  530.   mov       r10,#160*256
  531.   mov       r3,#&0
  532.   mov       r4,#40
  533. ._one_vbl
  534.   mov       r0,#&13                 ; Wait for Vsync.
  535.   swi       OS_Byte
  536.   mov       r5,r12
  537.   add       r12,r12,#4
  538.   mov       r6,r11
  539.   sub       r11,r11,#4
  540.   mov       r7,#140
  541. ._fill1
  542.   str       r3,[r5],#160
  543.   subS      r7,r7,#1
  544.   bNE       _fill1
  545.   mov       r7,#116
  546. ._fill2
  547.   str       r3,[r6],#160
  548.   subS      r7,r7,#1
  549.   bNE       _fill2
  550.   subS      r4,r4,#1
  551.   bNE       _one_vbl
  552.   ldmfd     r13!,{r0-r12,pc}
  553.  
  554.