Home » Archimedes archive » Acorn User » AU 1994-06.adf » !WriteDemo_WriteDemo » Modules/Balls/Source

Modules/Balls/Source

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Acorn User » AU 1994-06.adf » !WriteDemo_WriteDemo
Filename: Modules/Balls/Source
Read OK:
File size: 1A4E bytes
Load address: 0000
Exec address: 0000
File contents
   10REM >Balls
   20
   30ON ERROR SYS "Hourglass_Smash":ERROR 0,(REPORT$+" (internal error code "+STR$(ERL)+")")
   40
   50REM Fixed variables :
   60
   70  REM Trigger character for each ball
   80  trigger1$ = "w"
   90  trigger2$ = "v"
  100  trigger3$ = "u"
  110  trigger%  = TRUE
  120
  130  REM Maximum number of balls
  140  b%       = 3
  150  
  160  REM Left of bounding box in pixels
  170  lef%     = 0
  180  
  190  REM Bottom of bounding box in pixels
  200  bot%     = 169
  210
  220  REM Right of bounding box in pixels
  230  rig%     = 320
  240
  250  REM Top of bounding box in pixels
  260  top%     = 0
  270
  280  REM Gravity: 1<<16 = one line per frame
  290  gravity% = (1<<16) / 4
  300
  310  REM Data for balls
  320  REM  x = initial x position (y is always above the bounding box)
  330  REM xs = horizontal velocity (+ve right) (divisable by 4)
  340  REM ys = vertical velocity (+ve downwards)
  350  REM     x  xs   ys
  360  DATA  290,  4 ,  8
  370  DATA   50, -4 ,  5
  380  DATA  170,  4 ,  7
  390
  400
  410
  420module$ = "Balls"
  430
  440SYS "Hourglass_On"
  450LIBRARY "<Demo$Dir>.FNconvert"
  460SYS "OS_File",13,"<Modules$Dir>."+module$+".Sprites" TO spr_exists%,,,,spr_len%
  470IF spr_exists% = 0 THEN ERROR 0,(module$+": Sprite file not found")
  480PROCassemble
  490PROCinit
  500
  510CASE FNconvert(module$,sprites%) OF
  520  WHEN 0
  530    OSCLI "SAVE    <Modules$Dir>."+module$+".Module "+STR$~code%+" "+STR$~P%
  540    OSCLI "SETTYPE <Modules$Dir>."+module$+".Module Data"
  550  WHEN -1
  560    ERROR 0,(module$+": Sprite file not found")
  570  OTHERWISE
  580    ERROR 0,(module$+": Sprite width not divisible by 4")
  590ENDCASE
  600
  610SYS "Hourglass_Off"
  620END
  630
  640
  650
  660DEF PROCassemble
  670  len% = (1024 * 2) + spr_len%
  680  DIM code% len%
  690  FOR pass% = 8 TO 10 STEP 2
  700    P% = code%
  710    L% = code% + len%
  720    [ OPT pass%
  730  
  740
  750.init      EQUD   0
  760.frame     EQUD   balls - code%
  770.end       EQUD   0
  780
  790
  800
  810.balls     STMFD  R13!,{R0-R11,R14}
  820           ]
  830           IF trigger% THEN
  840             [OPT pass%
  850             MOV    R0,#0
  860             TST    R11,#(1 << (ASC("z") - ASC(trigger1$)))
  870             MOVNE  R0,#1
  880             TST    R11,#(1 << (ASC("z") - ASC(trigger2$)))
  890             MOVNE  R0,#2
  900             TST    R11,#(1 << (ASC("z") - ASC(trigger3$)))
  910             MOVNE  R0,#3
  920             CMP    R0,#0           ; is number_of_balls=0 ?
  930             BEQ    exit            ; if so, exit
  940             ]
  950           ELSE
  960             [OPT pass%
  970             MOV    R0,#b%
  980             ]
  990           ENDIF
 1000           [OPT pass%
 1010           
 1020           MOV    R8,R0             ;  r8=number_of_balls
 1030           ADR    R2,table%         ;  r2=address of data table
 1040.ball_loop LDMIA  R2,{R3-R7,R11}    ;  r3=x position
 1050                                    ;  r4=y position
 1060                                    ;  r5=x speed
 1070                                    ;  r6=y speed
 1080                                    ;  r7=ball sprite number
 1090                                    ; r11=y_speed_after_bounce
 1100           MOV    R9,R4,ASR#16      ;  r9=y_pos>>>16
 1110           ADD    R0,R3,R9,LSL#6    ;  r0=x_pos+(x_pos*320)
 1120           ADD    R0,R0,R9,LSL#8
 1130           MOV    R1,R7,LSL#11      ;  r1=sprite_number*(32*32*2)
 1140           BL     plot_ball         ; plot ball using r0 and r1
 1150           ADD    R3,R3,R5          ; x_pos=x_pos+x_speed
 1160           ADD    R4,R4,R6          ; y_pos=y_pos+y_speed
 1170           CMP    R3,#(rig%-32)     ; is x_pos>right_boundary ?
 1180           MOVGT  R3,#(rig%-32)     ; if so, x_pos=right_boundary
 1190           MVNGT  R5,R5             ;        x_speed=(-x_speed)+1
 1200           ADDGT  R5,R5,#1
 1210           CMP    R3,#lef%          ; is x_pos<left_boundary ?
 1220           MOVLT  R3,#lef%          ; if so, x_pos=left_boundary
 1230           MVNLT  R5,R5             ;        x_speed=(-x_speed)+1
 1240           ADDLT  R5,R5,#1
 1250           CMP    R4,#(bot%-32)<<16 ; is y_pos<=bottom_boundary ?
 1260           BLE    skip              ; if so, go to 'skip'
 1270           MOV    R4,#(bot%-32)<<16 ; y_pos=bottom_boundary
 1280           MOV    R6,R11            ; y_speed=y_speed_after_bounce
 1290
 1300.skip      ADD    R6,R6,#gravity%   ; y_speed=y_speed+gravity
 1310
 1320           STMIA  R2!,{R3-R7,R11}   ; store away ball data
 1330           SUBS   R8,R8,#1          ; is there another ball ?
 1340           BNE    ball_loop         ; if so, go to 'ball_loop'
 1350.exit      LDMFD  R13!,{R0-R11,PC}  ; exit
 1360
 1370
 1380.table%    FNarray(b%*24)           ; ball data table
 1390
 1400
 1410           ; On entry - r0 = screen offset
 1420           ;            r1 = sprite offset
 1430
 1440.plot_ball STMFD  R13!,{R0-R11,R14}
 1450           ADD    R0,R0,R12         ;  r0=screen_off+screen_addr
 1460           ADR    R2,sprites%       ;  r2=sprite address
 1470           ADD    R1,R1,R2          ;  r1=sprite_off+sprite_addr
 1480           ADD    R2,R1,#(32*32)    ;  r2=mask address
 1490           MOV    R10,#32           ; r10=number of rows
 1500.jump_loop CMP    R0,R12            ; is this row on the screen ?
 1510           BGE    begin             ; if so, go to 'begin'
 1520
 1530           ADD    R1,R1,#32         ; if not, sprite_addr+=32
 1540           ADD    R2,R2,#32         ;           mask_addr+=32
 1550           ADD    R0,R0,#32         ;         screen_addr+=32
 1560           B      end_2             ;         go to 'end'
 1570
 1580.begin     ]
 1590           FOR loop% = 1 TO 4
 1600             [ OPT pass%
 1610             
 1620           LDMIA  R1!,{R3-R4}       ; r3 and r4 = sprite data
 1630           LDMIA  R2!,{R5-R6}       ; r5 and r6 =   mask data
 1640           LDMIA  R0 ,{R7-R8}       ; r7 and r8 = screen data
 1650           AND    R7,R7,R5          ; screen=screen AND mask
 1660           ORR    R5,R7,R3          ;   mask=screen OR sprite
 1670           AND    R8,R8,R6          ; above process repeated
 1680           ORR    R6,R8,R4          ; for the next set of data
 1690           STMIA  R0!,{R5-R6}       ; store r5 and r6 onto screen
 1700           
 1710             ]
 1720           NEXT
 1730           [OPT pass%
 1740           
 1750.end_2     ADD    R0,R0,#(320-32)   ; move screen ptr to next row
 1760           SUBS   R10,R10,#1        ; is there another row ?
 1770           BNE    jump_loop         ; if so, go to 'jump_loop'
 1780.plot_end  LDMFD  R13!,{R0-R11,PC}
 1790
 1800
 1810.sprites%  FNarray(spr_len%)
 1820
 1830
 1840    ]
 1850  NEXT
 1860ENDPROC
 1870
 1880
 1890
 1900DEF FNarray(size%)
 1910  P% += size%
 1920=0
 1930
 1940
 1950
 1960DEF PROCinit
 1970  LOCAL wid%,hei%,I%,x%,xs%,ys%,pos%
 1980
 1990  wid% = rig% - lef%
 2000  hei% = bot% - top%
 2010
 2020  FOR I% = 1 TO b%
 2030    pos% = table% + ((I%-1) * 24)
 2040    READ x%,xs%,ys%
 2050    pos%!0  = x%
 2060    pos%!4  = ( top% + (bot% - 256) ) << 16
 2070    pos%!8  = xs%
 2080    pos%!12 = (ys% / 8) << 16
 2090    pos%!16 = ( (I% - 1) MOD 3)
 2100    pos%!20 = -ys% << 16
 2110  NEXT
 2120
 2130ENDPROC

� >Balls

G� � ș "Hourglass_Smash":� 0,(�$+" (internal error code "+�(�)+")")
(
2� Fixed variables :
<
F'  � Trigger character for each ball
P  trigger1$ = "w"
Z  trigger2$ = "v"
d  trigger3$ = "u"
n  trigger%  = �
x
�  � Maximum number of balls
�  b%       = 3
�  
�&  � Left of bounding box in pixels
�  lef%     = 0
�  
�(  � Bottom of bounding box in pixels
�  bot%     = 169
�
�'  � Right of bounding box in pixels
�  rig%     = 320
�
�%  � Top of bounding box in pixels
  top%     = 0

+  � Gravity: 1<<16 = one line per frame
"  gravity% = (1<<16) / 4
,
6  � Data for balls
@D  �  x = initial x position (y is always above the bounding box)
J=  � xs = horizontal velocity (+ve right) (divisable by 4)
T.  � ys = vertical velocity (+ve downwards)
^  �     x  xs   ys
h  �  290,  4 ,  8
r  �   50, -4 ,  5
|  �  170,  4 ,  7
�
�
�
�module$ = "Balls"
�
�ș "Hourglass_On"
�ț "<Demo$Dir>.FNconvert"
�Qș "OS_File",13,"<Modules$Dir>."+module$+".Sprites" � spr_exists%,,,,spr_len%
�?� spr_exists% = 0 � � 0,(module$+": Sprite file not found")
�
�assemble
�	�init
�
�#Ȏ �convert(module$,sprites%) �
	  � 0
F    � "SAVE    <Modules$Dir>."+module$+".Module "+�~code%+" "+�~P%
9    � "SETTYPE <Modules$Dir>."+module$+".Module Data"
&
  � -1
0/    � 0,(module$+": Sprite file not found")
:  
D9    � 0,(module$+": Sprite width not divisible by 4")
N�
X
bș "Hourglass_Off"
l�
v
�
�
�� �assemble
�"  len% = (1024 * 2) + spr_len%
�  � code% len%
�  � pass% = 8 � 10 � 2
�    P% = code%
�    L% = code% + len%
�    [ OPT pass%
�  
�
�.init      EQUD   0
�#.frame     EQUD   balls - code%
.end       EQUD   0


 
*'.balls     STMFD  R13!,{R0-R11,R14}
4           ]
>           � trigger% �
H             [OPT pass%
R             MOV    R0,#0
\;             TST    R11,#(1 << (�("z") - �(trigger1$)))
f             MOVNE  R0,#1
p;             TST    R11,#(1 << (�("z") - �(trigger2$)))
z             MOVNE  R0,#2
�;             TST    R11,#(1 << (�("z") - �(trigger3$)))
�             MOVNE  R0,#3
�@             CMP    R0,#0           ; is number_of_balls=0 ?
�5             BEQ    exit            ; if so, exit
�             ]
�           �
�             [OPT pass%
�             MOV    R0,#b%
�             ]
�           �
�           [OPT pass%
�           
�=           MOV    R8,R0             ;  r8=number_of_balls
C           ADR    R2,table%         ;  r2=address of data table
8.ball_loop LDMIA  R2,{R3-R7,R11}    ;  r3=x position
8                                    ;  r4=y position
$5                                    ;  r5=x speed
.5                                    ;  r6=y speed
8@                                    ;  r7=ball sprite number
BB                                    ; r11=y_speed_after_bounce
L8           MOV    R9,R4,ASR#16      ;  r9=y_pos>>>16
V?           ADD    R0,R3,R9,LSL#6    ;  r0=x_pos+(x_pos*320)
`$           ADD    R0,R0,R9,LSL#8
jE           MOV    R1,R7,LSL#11      ;  r1=sprite_number*(32*32*2)
tC           BL     plot_ball         ; plot ball using r0 and r1
~=           ADD    R3,R3,R5          ; x_pos=x_pos+x_speed
�=           ADD    R4,R4,R6          ; y_pos=y_pos+y_speed
�C           CMP    R3,#(rig%-32)     ; is x_pos>right_boundary ?
�E           MOVGT  R3,#(rig%-32)     ; if so, x_pos=right_boundary
�E           MVNGT  R5,R5             ;        x_speed=(-x_speed)+1
�           ADDGT  R5,R5,#1
�B           CMP    R3,#lef%          ; is x_pos<left_boundary ?
�D           MOVLT  R3,#lef%          ; if so, x_pos=left_boundary
�E           MVNLT  R5,R5             ;        x_speed=(-x_speed)+1
�           ADDLT  R5,R5,#1
�E           CMP    R4,#(bot%-32)<<16 ; is y_pos<=bottom_boundary ?
�=           BLE    skip              ; if so, go to 'skip'
�?           MOV    R4,#(bot%-32)<<16 ; y_pos=bottom_boundary
F           MOV    R6,R11            ; y_speed=y_speed_after_bounce


A.skip      ADD    R6,R6,#gravity%   ; y_speed=y_speed+gravity

(>           STMIA  R2!,{R3-R7,R11}   ; store away ball data
2A           SUBS   R8,R8,#1          ; is there another ball ?
<B           BNE    ball_loop         ; if so, go to 'ball_loop'
F..exit      LDMFD  R13!,{R0-R11,PC}  ; exit
P
Z
d8.table%    �array(b%*24)           ; ball data table
n
x
�.           ; On entry - r0 = screen offset
�.           ;            r1 = sprite offset
�
�'.plot_ball STMFD  R13!,{R0-R11,R14}
�D           ADD    R0,R0,R12         ;  r0=screen_off+screen_addr
�<           ADR    R2,sprites%       ;  r2=sprite address
�D           ADD    R1,R1,R2          ;  r1=sprite_off+sprite_addr
�:           ADD    R2,R1,#(32*32)    ;  r2=mask address
�<           MOV    R10,#32           ; r10=number of rows
�E.jump_loop CMP    R0,R12            ; is this row on the screen ?
�>           BGE    begin             ; if so, go to 'begin'
�
�A           ADD    R1,R1,#32         ; if not, sprite_addr+=32
A           ADD    R2,R2,#32         ;           mask_addr+=32
A           ADD    R0,R0,#32         ;         screen_addr+=32
=           B      end_2             ;         go to 'end'
"
,.begin     ]
6           � loop% = 1 � 4
@             [ OPT pass%
J             
TA           LDMIA  R1!,{R3-R4}       ; r3 and r4 = sprite data
^A           LDMIA  R2!,{R5-R6}       ; r5 and r6 =   mask data
hA           LDMIA  R0 ,{R7-R8}       ; r7 and r8 = screen data
r<           �    R7,R7,R5          ; screen=screen � mask
|?           �R    R5,R7,R3          ;   mask=screen � sprite
�>           �    R8,R8,R6          ; above process repeated
�A           �R    R6,R8,R4          ; for the next set of data
�E           STMIA  R0!,{R5-R6}       ; store r5 and r6 onto screen
�           
�             ]
�           �
�           [OPT pass%
�           
�E.end_2     ADD    R0,R0,#(320-32)   ; move screen ptr to next row
�@           SUBS   R10,R10,#1        ; is there another row ?
�B           BNE    jump_loop         ; if so, go to 'jump_loop'
�&.plot_end  LDMFD  R13!,{R0-R11,PC}
�

.sprites%  �array(spr_len%)

&
0	    ]
:  �
D�
N
X
b
l� �array(size%)
v  P% += size%
�=0
�
�
�
�� �init
�$  � wid%,hei%,I%,x%,xs%,ys%,pos%
�
�  wid% = rig% - lef%
�  hei% = bot% - top%
�
�  � I% = 1 � b%
�%    pos% = table% + ((I%-1) * 24)
�    � x%,xs%,ys%
    pos%!0  = x%
/    pos%!4  = ( top% + (bot% - 256) ) << 16
    pos%!8  = xs%
 !    pos%!12 = (ys% / 8) << 16
*!    pos%!16 = ( (I% - 1) � 3)
4    pos%!20 = -ys% << 16
>  �
H
R�
�
00000000  0d 00 0a 0c f4 20 3e 42  61 6c 6c 73 0d 00 14 04  |..... >Balls....|
00000010  0d 00 1e 47 ee 20 85 20  c8 99 20 22 48 6f 75 72  |...G. . .. "Hour|
00000020  67 6c 61 73 73 5f 53 6d  61 73 68 22 3a 85 20 30  |glass_Smash":. 0|
00000030  2c 28 f6 24 2b 22 20 28  69 6e 74 65 72 6e 61 6c  |,(.$+" (internal|
00000040  20 65 72 72 6f 72 20 63  6f 64 65 20 22 2b c3 28  | error code "+.(|
00000050  9e 29 2b 22 29 22 29 0d  00 28 04 0d 00 32 17 f4  |.)+")")..(...2..|
00000060  20 46 69 78 65 64 20 76  61 72 69 61 62 6c 65 73  | Fixed variables|
00000070  20 3a 0d 00 3c 04 0d 00  46 27 20 20 f4 20 54 72  | :..<...F'  . Tr|
00000080  69 67 67 65 72 20 63 68  61 72 61 63 74 65 72 20  |igger character |
00000090  66 6f 72 20 65 61 63 68  20 62 61 6c 6c 0d 00 50  |for each ball..P|
000000a0  15 20 20 74 72 69 67 67  65 72 31 24 20 3d 20 22  |.  trigger1$ = "|
000000b0  77 22 0d 00 5a 15 20 20  74 72 69 67 67 65 72 32  |w"..Z.  trigger2|
000000c0  24 20 3d 20 22 76 22 0d  00 64 15 20 20 74 72 69  |$ = "v"..d.  tri|
000000d0  67 67 65 72 33 24 20 3d  20 22 75 22 0d 00 6e 13  |gger3$ = "u"..n.|
000000e0  20 20 74 72 69 67 67 65  72 25 20 20 3d 20 b9 0d  |  trigger%  = ..|
000000f0  00 78 04 0d 00 82 1f 20  20 f4 20 4d 61 78 69 6d  |.x.....  . Maxim|
00000100  75 6d 20 6e 75 6d 62 65  72 20 6f 66 20 62 61 6c  |um number of bal|
00000110  6c 73 0d 00 8c 12 20 20  62 25 20 20 20 20 20 20  |ls....  b%      |
00000120  20 3d 20 33 0d 00 96 06  20 20 0d 00 a0 26 20 20  | = 3....  ...&  |
00000130  f4 20 4c 65 66 74 20 6f  66 20 62 6f 75 6e 64 69  |. Left of boundi|
00000140  6e 67 20 62 6f 78 20 69  6e 20 70 69 78 65 6c 73  |ng box in pixels|
00000150  0d 00 aa 12 20 20 6c 65  66 25 20 20 20 20 20 3d  |....  lef%     =|
00000160  20 30 0d 00 b4 06 20 20  0d 00 be 28 20 20 f4 20  | 0....  ...(  . |
00000170  42 6f 74 74 6f 6d 20 6f  66 20 62 6f 75 6e 64 69  |Bottom of boundi|
00000180  6e 67 20 62 6f 78 20 69  6e 20 70 69 78 65 6c 73  |ng box in pixels|
00000190  0d 00 c8 14 20 20 62 6f  74 25 20 20 20 20 20 3d  |....  bot%     =|
000001a0  20 31 36 39 0d 00 d2 04  0d 00 dc 27 20 20 f4 20  | 169.......'  . |
000001b0  52 69 67 68 74 20 6f 66  20 62 6f 75 6e 64 69 6e  |Right of boundin|
000001c0  67 20 62 6f 78 20 69 6e  20 70 69 78 65 6c 73 0d  |g box in pixels.|
000001d0  00 e6 14 20 20 72 69 67  25 20 20 20 20 20 3d 20  |...  rig%     = |
000001e0  33 32 30 0d 00 f0 04 0d  00 fa 25 20 20 f4 20 54  |320.......%  . T|
000001f0  6f 70 20 6f 66 20 62 6f  75 6e 64 69 6e 67 20 62  |op of bounding b|
00000200  6f 78 20 69 6e 20 70 69  78 65 6c 73 0d 01 04 12  |ox in pixels....|
00000210  20 20 74 6f 70 25 20 20  20 20 20 3d 20 30 0d 01  |  top%     = 0..|
00000220  0e 04 0d 01 18 2b 20 20  f4 20 47 72 61 76 69 74  |.....+  . Gravit|
00000230  79 3a 20 31 3c 3c 31 36  20 3d 20 6f 6e 65 20 6c  |y: 1<<16 = one l|
00000240  69 6e 65 20 70 65 72 20  66 72 61 6d 65 0d 01 22  |ine per frame.."|
00000250  1c 20 20 67 72 61 76 69  74 79 25 20 3d 20 28 31  |.  gravity% = (1|
00000260  3c 3c 31 36 29 20 2f 20  34 0d 01 2c 04 0d 01 36  |<<16) / 4..,...6|
00000270  16 20 20 f4 20 44 61 74  61 20 66 6f 72 20 62 61  |.  . Data for ba|
00000280  6c 6c 73 0d 01 40 44 20  20 f4 20 20 78 20 3d 20  |lls..@D  .  x = |
00000290  69 6e 69 74 69 61 6c 20  78 20 70 6f 73 69 74 69  |initial x positi|
000002a0  6f 6e 20 28 79 20 69 73  20 61 6c 77 61 79 73 20  |on (y is always |
000002b0  61 62 6f 76 65 20 74 68  65 20 62 6f 75 6e 64 69  |above the boundi|
000002c0  6e 67 20 62 6f 78 29 0d  01 4a 3d 20 20 f4 20 78  |ng box)..J=  . x|
000002d0  73 20 3d 20 68 6f 72 69  7a 6f 6e 74 61 6c 20 76  |s = horizontal v|
000002e0  65 6c 6f 63 69 74 79 20  28 2b 76 65 20 72 69 67  |elocity (+ve rig|
000002f0  68 74 29 20 28 64 69 76  69 73 61 62 6c 65 20 62  |ht) (divisable b|
00000300  79 20 34 29 0d 01 54 2e  20 20 f4 20 79 73 20 3d  |y 4)..T.  . ys =|
00000310  20 76 65 72 74 69 63 61  6c 20 76 65 6c 6f 63 69  | vertical veloci|
00000320  74 79 20 28 2b 76 65 20  64 6f 77 6e 77 61 72 64  |ty (+ve downward|
00000330  73 29 0d 01 5e 16 20 20  f4 20 20 20 20 20 78 20  |s)..^.  .     x |
00000340  20 78 73 20 20 20 79 73  0d 01 68 15 20 20 dc 20  | xs   ys..h.  . |
00000350  20 32 39 30 2c 20 20 34  20 2c 20 20 38 0d 01 72  | 290,  4 ,  8..r|
00000360  15 20 20 dc 20 20 20 35  30 2c 20 2d 34 20 2c 20  |.  .   50, -4 , |
00000370  20 35 0d 01 7c 15 20 20  dc 20 20 31 37 30 2c 20  | 5..|.  .  170, |
00000380  20 34 20 2c 20 20 37 0d  01 86 04 0d 01 90 04 0d  | 4 ,  7.........|
00000390  01 9a 04 0d 01 a4 15 6d  6f 64 75 6c 65 24 20 3d  |.......module$ =|
000003a0  20 22 42 61 6c 6c 73 22  0d 01 ae 04 0d 01 b8 15  | "Balls"........|
000003b0  c8 99 20 22 48 6f 75 72  67 6c 61 73 73 5f 4f 6e  |.. "Hourglass_On|
000003c0  22 0d 01 c2 1d c8 9b 20  22 3c 44 65 6d 6f 24 44  |"...... "<Demo$D|
000003d0  69 72 3e 2e 46 4e 63 6f  6e 76 65 72 74 22 0d 01  |ir>.FNconvert"..|
000003e0  cc 51 c8 99 20 22 4f 53  5f 46 69 6c 65 22 2c 31  |.Q.. "OS_File",1|
000003f0  33 2c 22 3c 4d 6f 64 75  6c 65 73 24 44 69 72 3e  |3,"<Modules$Dir>|
00000400  2e 22 2b 6d 6f 64 75 6c  65 24 2b 22 2e 53 70 72  |."+module$+".Spr|
00000410  69 74 65 73 22 20 b8 20  73 70 72 5f 65 78 69 73  |ites" . spr_exis|
00000420  74 73 25 2c 2c 2c 2c 73  70 72 5f 6c 65 6e 25 0d  |ts%,,,,spr_len%.|
00000430  01 d6 3f e7 20 73 70 72  5f 65 78 69 73 74 73 25  |..?. spr_exists%|
00000440  20 3d 20 30 20 8c 20 85  20 30 2c 28 6d 6f 64 75  | = 0 . . 0,(modu|
00000450  6c 65 24 2b 22 3a 20 53  70 72 69 74 65 20 66 69  |le$+": Sprite fi|
00000460  6c 65 20 6e 6f 74 20 66  6f 75 6e 64 22 29 0d 01  |le not found")..|
00000470  e0 0d f2 61 73 73 65 6d  62 6c 65 0d 01 ea 09 f2  |...assemble.....|
00000480  69 6e 69 74 0d 01 f4 04  0d 01 fe 23 c8 8e 20 a4  |init.......#.. .|
00000490  63 6f 6e 76 65 72 74 28  6d 6f 64 75 6c 65 24 2c  |convert(module$,|
000004a0  73 70 72 69 74 65 73 25  29 20 ca 0d 02 08 09 20  |sprites%) ..... |
000004b0  20 c9 20 30 0d 02 12 46  20 20 20 20 ff 20 22 53  | . 0...F    . "S|
000004c0  41 56 45 20 20 20 20 3c  4d 6f 64 75 6c 65 73 24  |AVE    <Modules$|
000004d0  44 69 72 3e 2e 22 2b 6d  6f 64 75 6c 65 24 2b 22  |Dir>."+module$+"|
000004e0  2e 4d 6f 64 75 6c 65 20  22 2b c3 7e 63 6f 64 65  |.Module "+.~code|
000004f0  25 2b 22 20 22 2b c3 7e  50 25 0d 02 1c 39 20 20  |%+" "+.~P%...9  |
00000500  20 20 ff 20 22 53 45 54  54 59 50 45 20 3c 4d 6f  |  . "SETTYPE <Mo|
00000510  64 75 6c 65 73 24 44 69  72 3e 2e 22 2b 6d 6f 64  |dules$Dir>."+mod|
00000520  75 6c 65 24 2b 22 2e 4d  6f 64 75 6c 65 20 44 61  |ule$+".Module Da|
00000530  74 61 22 0d 02 26 0a 20  20 c9 20 2d 31 0d 02 30  |ta"..&.  . -1..0|
00000540  2f 20 20 20 20 85 20 30  2c 28 6d 6f 64 75 6c 65  |/    . 0,(module|
00000550  24 2b 22 3a 20 53 70 72  69 74 65 20 66 69 6c 65  |$+": Sprite file|
00000560  20 6e 6f 74 20 66 6f 75  6e 64 22 29 0d 02 3a 07  | not found")..:.|
00000570  20 20 7f 0d 02 44 39 20  20 20 20 85 20 30 2c 28  |  ...D9    . 0,(|
00000580  6d 6f 64 75 6c 65 24 2b  22 3a 20 53 70 72 69 74  |module$+": Sprit|
00000590  65 20 77 69 64 74 68 20  6e 6f 74 20 64 69 76 69  |e width not divi|
000005a0  73 69 62 6c 65 20 62 79  20 34 22 29 0d 02 4e 05  |sible by 4")..N.|
000005b0  cb 0d 02 58 04 0d 02 62  16 c8 99 20 22 48 6f 75  |...X...b... "Hou|
000005c0  72 67 6c 61 73 73 5f 4f  66 66 22 0d 02 6c 05 e0  |rglass_Off"..l..|
000005d0  0d 02 76 04 0d 02 80 04  0d 02 8a 04 0d 02 94 0f  |..v.............|
000005e0  dd 20 f2 61 73 73 65 6d  62 6c 65 0d 02 9e 22 20  |. .assemble..." |
000005f0  20 6c 65 6e 25 20 3d 20  28 31 30 32 34 20 2a 20  | len% = (1024 * |
00000600  32 29 20 2b 20 73 70 72  5f 6c 65 6e 25 0d 02 a8  |2) + spr_len%...|
00000610  12 20 20 de 20 63 6f 64  65 25 20 6c 65 6e 25 0d  |.  . code% len%.|
00000620  02 b2 1a 20 20 e3 20 70  61 73 73 25 20 3d 20 38  |...  . pass% = 8|
00000630  20 b8 20 31 30 20 88 20  32 0d 02 bc 12 20 20 20  | . 10 . 2....   |
00000640  20 50 25 20 3d 20 63 6f  64 65 25 0d 02 c6 19 20  | P% = code%.... |
00000650  20 20 20 4c 25 20 3d 20  63 6f 64 65 25 20 2b 20  |   L% = code% + |
00000660  6c 65 6e 25 0d 02 d0 13  20 20 20 20 5b 20 4f 50  |len%....    [ OP|
00000670  54 20 70 61 73 73 25 0d  02 da 06 20 20 0d 02 e4  |T pass%....  ...|
00000680  04 0d 02 ee 17 2e 69 6e  69 74 20 20 20 20 20 20  |......init      |
00000690  45 51 55 44 20 20 20 30  0d 02 f8 23 2e 66 72 61  |EQUD   0...#.fra|
000006a0  6d 65 20 20 20 20 20 45  51 55 44 20 20 20 62 61  |me     EQUD   ba|
000006b0  6c 6c 73 20 2d 20 63 6f  64 65 25 0d 03 02 17 2e  |lls - code%.....|
000006c0  65 6e 64 20 20 20 20 20  20 20 45 51 55 44 20 20  |end       EQUD  |
000006d0  20 30 0d 03 0c 04 0d 03  16 04 0d 03 20 04 0d 03  | 0.......... ...|
000006e0  2a 27 2e 62 61 6c 6c 73  20 20 20 20 20 53 54 4d  |*'.balls     STM|
000006f0  46 44 20 20 52 31 33 21  2c 7b 52 30 2d 52 31 31  |FD  R13!,{R0-R11|
00000700  2c 52 31 34 7d 0d 03 34  10 20 20 20 20 20 20 20  |,R14}..4.       |
00000710  20 20 20 20 5d 0d 03 3e  1b 20 20 20 20 20 20 20  |    ]..>.       |
00000720  20 20 20 20 e7 20 74 72  69 67 67 65 72 25 20 8c  |    . trigger% .|
00000730  0d 03 48 1b 20 20 20 20  20 20 20 20 20 20 20 20  |..H.            |
00000740  20 5b 4f 50 54 20 70 61  73 73 25 0d 03 52 1d 20  | [OPT pass%..R. |
00000750  20 20 20 20 20 20 20 20  20 20 20 20 4d 4f 56 20  |            MOV |
00000760  20 20 20 52 30 2c 23 30  0d 03 5c 3b 20 20 20 20  |   R0,#0..\;    |
00000770  20 20 20 20 20 20 20 20  20 54 53 54 20 20 20 20  |         TST    |
00000780  52 31 31 2c 23 28 31 20  3c 3c 20 28 97 28 22 7a  |R11,#(1 << (.("z|
00000790  22 29 20 2d 20 97 28 74  72 69 67 67 65 72 31 24  |") - .(trigger1$|
000007a0  29 29 29 0d 03 66 1d 20  20 20 20 20 20 20 20 20  |)))..f.         |
000007b0  20 20 20 20 4d 4f 56 4e  45 20 20 52 30 2c 23 31  |    MOVNE  R0,#1|
000007c0  0d 03 70 3b 20 20 20 20  20 20 20 20 20 20 20 20  |..p;            |
000007d0  20 54 53 54 20 20 20 20  52 31 31 2c 23 28 31 20  | TST    R11,#(1 |
000007e0  3c 3c 20 28 97 28 22 7a  22 29 20 2d 20 97 28 74  |<< (.("z") - .(t|
000007f0  72 69 67 67 65 72 32 24  29 29 29 0d 03 7a 1d 20  |rigger2$)))..z. |
00000800  20 20 20 20 20 20 20 20  20 20 20 20 4d 4f 56 4e  |            MOVN|
00000810  45 20 20 52 30 2c 23 32  0d 03 84 3b 20 20 20 20  |E  R0,#2...;    |
00000820  20 20 20 20 20 20 20 20  20 54 53 54 20 20 20 20  |         TST    |
00000830  52 31 31 2c 23 28 31 20  3c 3c 20 28 97 28 22 7a  |R11,#(1 << (.("z|
00000840  22 29 20 2d 20 97 28 74  72 69 67 67 65 72 33 24  |") - .(trigger3$|
00000850  29 29 29 0d 03 8e 1d 20  20 20 20 20 20 20 20 20  |)))....         |
00000860  20 20 20 20 4d 4f 56 4e  45 20 20 52 30 2c 23 33  |    MOVNE  R0,#3|
00000870  0d 03 98 40 20 20 20 20  20 20 20 20 20 20 20 20  |...@            |
00000880  20 43 4d 50 20 20 20 20  52 30 2c 23 30 20 20 20  | CMP    R0,#0   |
00000890  20 20 20 20 20 20 20 20  3b 20 69 73 20 6e 75 6d  |        ; is num|
000008a0  62 65 72 5f 6f 66 5f 62  61 6c 6c 73 3d 30 20 3f  |ber_of_balls=0 ?|
000008b0  0d 03 a2 35 20 20 20 20  20 20 20 20 20 20 20 20  |...5            |
000008c0  20 42 45 51 20 20 20 20  65 78 69 74 20 20 20 20  | BEQ    exit    |
000008d0  20 20 20 20 20 20 20 20  3b 20 69 66 20 73 6f 2c  |        ; if so,|
000008e0  20 65 78 69 74 0d 03 ac  12 20 20 20 20 20 20 20  | exit....       |
000008f0  20 20 20 20 20 20 5d 0d  03 b6 10 20 20 20 20 20  |      ]....     |
00000900  20 20 20 20 20 20 cc 0d  03 c0 1b 20 20 20 20 20  |      .....     |
00000910  20 20 20 20 20 20 20 20  5b 4f 50 54 20 70 61 73  |        [OPT pas|
00000920  73 25 0d 03 ca 1e 20 20  20 20 20 20 20 20 20 20  |s%....          |
00000930  20 20 20 4d 4f 56 20 20  20 20 52 30 2c 23 62 25  |   MOV    R0,#b%|
00000940  0d 03 d4 12 20 20 20 20  20 20 20 20 20 20 20 20  |....            |
00000950  20 5d 0d 03 de 10 20 20  20 20 20 20 20 20 20 20  | ]....          |
00000960  20 cd 0d 03 e8 19 20 20  20 20 20 20 20 20 20 20  | .....          |
00000970  20 5b 4f 50 54 20 70 61  73 73 25 0d 03 f2 0f 20  | [OPT pass%.... |
00000980  20 20 20 20 20 20 20 20  20 20 0d 03 fc 3d 20 20  |          ...=  |
00000990  20 20 20 20 20 20 20 20  20 4d 4f 56 20 20 20 20  |         MOV    |
000009a0  52 38 2c 52 30 20 20 20  20 20 20 20 20 20 20 20  |R8,R0           |
000009b0  20 20 3b 20 20 72 38 3d  6e 75 6d 62 65 72 5f 6f  |  ;  r8=number_o|
000009c0  66 5f 62 61 6c 6c 73 0d  04 06 43 20 20 20 20 20  |f_balls...C     |
000009d0  20 20 20 20 20 20 41 44  52 20 20 20 20 52 32 2c  |      ADR    R2,|
000009e0  74 61 62 6c 65 25 20 20  20 20 20 20 20 20 20 3b  |table%         ;|
000009f0  20 20 72 32 3d 61 64 64  72 65 73 73 20 6f 66 20  |  r2=address of |
00000a00  64 61 74 61 20 74 61 62  6c 65 0d 04 10 38 2e 62  |data table...8.b|
00000a10  61 6c 6c 5f 6c 6f 6f 70  20 4c 44 4d 49 41 20 20  |all_loop LDMIA  |
00000a20  52 32 2c 7b 52 33 2d 52  37 2c 52 31 31 7d 20 20  |R2,{R3-R7,R11}  |
00000a30  20 20 3b 20 20 72 33 3d  78 20 70 6f 73 69 74 69  |  ;  r3=x positi|
00000a40  6f 6e 0d 04 1a 38 20 20  20 20 20 20 20 20 20 20  |on...8          |
00000a50  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000a60  20 20 20 20 20 20 20 20  20 20 3b 20 20 72 34 3d  |          ;  r4=|
00000a70  79 20 70 6f 73 69 74 69  6f 6e 0d 04 24 35 20 20  |y position..$5  |
00000a80  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
*
00000aa0  20 20 3b 20 20 72 35 3d  78 20 73 70 65 65 64 0d  |  ;  r5=x speed.|
00000ab0  04 2e 35 20 20 20 20 20  20 20 20 20 20 20 20 20  |..5             |
00000ac0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000ad0  20 20 20 20 20 20 20 3b  20 20 72 36 3d 79 20 73  |       ;  r6=y s|
00000ae0  70 65 65 64 0d 04 38 40  20 20 20 20 20 20 20 20  |peed..8@        |
00000af0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000b00  20 20 20 20 20 20 20 20  20 20 20 20 3b 20 20 72  |            ;  r|
00000b10  37 3d 62 61 6c 6c 20 73  70 72 69 74 65 20 6e 75  |7=ball sprite nu|
00000b20  6d 62 65 72 0d 04 42 42  20 20 20 20 20 20 20 20  |mber..BB        |
00000b30  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000b40  20 20 20 20 20 20 20 20  20 20 20 20 3b 20 72 31  |            ; r1|
00000b50  31 3d 79 5f 73 70 65 65  64 5f 61 66 74 65 72 5f  |1=y_speed_after_|
00000b60  62 6f 75 6e 63 65 0d 04  4c 38 20 20 20 20 20 20  |bounce..L8      |
00000b70  20 20 20 20 20 4d 4f 56  20 20 20 20 52 39 2c 52  |     MOV    R9,R|
00000b80  34 2c 41 53 52 23 31 36  20 20 20 20 20 20 3b 20  |4,ASR#16      ; |
00000b90  20 72 39 3d 79 5f 70 6f  73 3e 3e 3e 31 36 0d 04  | r9=y_pos>>>16..|
00000ba0  56 3f 20 20 20 20 20 20  20 20 20 20 20 41 44 44  |V?           ADD|
00000bb0  20 20 20 20 52 30 2c 52  33 2c 52 39 2c 4c 53 4c  |    R0,R3,R9,LSL|
00000bc0  23 36 20 20 20 20 3b 20  20 72 30 3d 78 5f 70 6f  |#6    ;  r0=x_po|
00000bd0  73 2b 28 78 5f 70 6f 73  2a 33 32 30 29 0d 04 60  |s+(x_pos*320)..`|
00000be0  24 20 20 20 20 20 20 20  20 20 20 20 41 44 44 20  |$           ADD |
00000bf0  20 20 20 52 30 2c 52 30  2c 52 39 2c 4c 53 4c 23  |   R0,R0,R9,LSL#|
00000c00  38 0d 04 6a 45 20 20 20  20 20 20 20 20 20 20 20  |8..jE           |
00000c10  4d 4f 56 20 20 20 20 52  31 2c 52 37 2c 4c 53 4c  |MOV    R1,R7,LSL|
00000c20  23 31 31 20 20 20 20 20  20 3b 20 20 72 31 3d 73  |#11      ;  r1=s|
00000c30  70 72 69 74 65 5f 6e 75  6d 62 65 72 2a 28 33 32  |prite_number*(32|
00000c40  2a 33 32 2a 32 29 0d 04  74 43 20 20 20 20 20 20  |*32*2)..tC      |
00000c50  20 20 20 20 20 42 4c 20  20 20 20 20 70 6c 6f 74  |     BL     plot|
00000c60  5f 62 61 6c 6c 20 20 20  20 20 20 20 20 20 3b 20  |_ball         ; |
00000c70  70 6c 6f 74 20 62 61 6c  6c 20 75 73 69 6e 67 20  |plot ball using |
00000c80  72 30 20 61 6e 64 20 72  31 0d 04 7e 3d 20 20 20  |r0 and r1..~=   |
00000c90  20 20 20 20 20 20 20 20  41 44 44 20 20 20 20 52  |        ADD    R|
00000ca0  33 2c 52 33 2c 52 35 20  20 20 20 20 20 20 20 20  |3,R3,R5         |
00000cb0  20 3b 20 78 5f 70 6f 73  3d 78 5f 70 6f 73 2b 78  | ; x_pos=x_pos+x|
00000cc0  5f 73 70 65 65 64 0d 04  88 3d 20 20 20 20 20 20  |_speed...=      |
00000cd0  20 20 20 20 20 41 44 44  20 20 20 20 52 34 2c 52  |     ADD    R4,R|
00000ce0  34 2c 52 36 20 20 20 20  20 20 20 20 20 20 3b 20  |4,R6          ; |
00000cf0  79 5f 70 6f 73 3d 79 5f  70 6f 73 2b 79 5f 73 70  |y_pos=y_pos+y_sp|
00000d00  65 65 64 0d 04 92 43 20  20 20 20 20 20 20 20 20  |eed...C         |
00000d10  20 20 43 4d 50 20 20 20  20 52 33 2c 23 28 72 69  |  CMP    R3,#(ri|
00000d20  67 25 2d 33 32 29 20 20  20 20 20 3b 20 69 73 20  |g%-32)     ; is |
00000d30  78 5f 70 6f 73 3e 72 69  67 68 74 5f 62 6f 75 6e  |x_pos>right_boun|
00000d40  64 61 72 79 20 3f 0d 04  9c 45 20 20 20 20 20 20  |dary ?...E      |
00000d50  20 20 20 20 20 4d 4f 56  47 54 20 20 52 33 2c 23  |     MOVGT  R3,#|
00000d60  28 72 69 67 25 2d 33 32  29 20 20 20 20 20 3b 20  |(rig%-32)     ; |
00000d70  69 66 20 73 6f 2c 20 78  5f 70 6f 73 3d 72 69 67  |if so, x_pos=rig|
00000d80  68 74 5f 62 6f 75 6e 64  61 72 79 0d 04 a6 45 20  |ht_boundary...E |
00000d90  20 20 20 20 20 20 20 20  20 20 4d 56 4e 47 54 20  |          MVNGT |
00000da0  20 52 35 2c 52 35 20 20  20 20 20 20 20 20 20 20  | R5,R5          |
00000db0  20 20 20 3b 20 20 20 20  20 20 20 20 78 5f 73 70  |   ;        x_sp|
00000dc0  65 65 64 3d 28 2d 78 5f  73 70 65 65 64 29 2b 31  |eed=(-x_speed)+1|
00000dd0  0d 04 b0 1e 20 20 20 20  20 20 20 20 20 20 20 41  |....           A|
00000de0  44 44 47 54 20 20 52 35  2c 52 35 2c 23 31 0d 04  |DDGT  R5,R5,#1..|
00000df0  ba 42 20 20 20 20 20 20  20 20 20 20 20 43 4d 50  |.B           CMP|
00000e00  20 20 20 20 52 33 2c 23  6c 65 66 25 20 20 20 20  |    R3,#lef%    |
00000e10  20 20 20 20 20 20 3b 20  69 73 20 78 5f 70 6f 73  |      ; is x_pos|
00000e20  3c 6c 65 66 74 5f 62 6f  75 6e 64 61 72 79 20 3f  |<left_boundary ?|
00000e30  0d 04 c4 44 20 20 20 20  20 20 20 20 20 20 20 4d  |...D           M|
00000e40  4f 56 4c 54 20 20 52 33  2c 23 6c 65 66 25 20 20  |OVLT  R3,#lef%  |
00000e50  20 20 20 20 20 20 20 20  3b 20 69 66 20 73 6f 2c  |        ; if so,|
00000e60  20 78 5f 70 6f 73 3d 6c  65 66 74 5f 62 6f 75 6e  | x_pos=left_boun|
00000e70  64 61 72 79 0d 04 ce 45  20 20 20 20 20 20 20 20  |dary...E        |
00000e80  20 20 20 4d 56 4e 4c 54  20 20 52 35 2c 52 35 20  |   MVNLT  R5,R5 |
00000e90  20 20 20 20 20 20 20 20  20 20 20 20 3b 20 20 20  |            ;   |
00000ea0  20 20 20 20 20 78 5f 73  70 65 65 64 3d 28 2d 78  |     x_speed=(-x|
00000eb0  5f 73 70 65 65 64 29 2b  31 0d 04 d8 1e 20 20 20  |_speed)+1....   |
00000ec0  20 20 20 20 20 20 20 20  41 44 44 4c 54 20 20 52  |        ADDLT  R|
00000ed0  35 2c 52 35 2c 23 31 0d  04 e2 45 20 20 20 20 20  |5,R5,#1...E     |
00000ee0  20 20 20 20 20 20 43 4d  50 20 20 20 20 52 34 2c  |      CMP    R4,|
00000ef0  23 28 62 6f 74 25 2d 33  32 29 3c 3c 31 36 20 3b  |#(bot%-32)<<16 ;|
00000f00  20 69 73 20 79 5f 70 6f  73 3c 3d 62 6f 74 74 6f  | is y_pos<=botto|
00000f10  6d 5f 62 6f 75 6e 64 61  72 79 20 3f 0d 04 ec 3d  |m_boundary ?...=|
00000f20  20 20 20 20 20 20 20 20  20 20 20 42 4c 45 20 20  |           BLE  |
00000f30  20 20 73 6b 69 70 20 20  20 20 20 20 20 20 20 20  |  skip          |
00000f40  20 20 20 20 3b 20 69 66  20 73 6f 2c 20 67 6f 20  |    ; if so, go |
00000f50  74 6f 20 27 73 6b 69 70  27 0d 04 f6 3f 20 20 20  |to 'skip'...?   |
00000f60  20 20 20 20 20 20 20 20  4d 4f 56 20 20 20 20 52  |        MOV    R|
00000f70  34 2c 23 28 62 6f 74 25  2d 33 32 29 3c 3c 31 36  |4,#(bot%-32)<<16|
00000f80  20 3b 20 79 5f 70 6f 73  3d 62 6f 74 74 6f 6d 5f  | ; y_pos=bottom_|
00000f90  62 6f 75 6e 64 61 72 79  0d 05 00 46 20 20 20 20  |boundary...F    |
00000fa0  20 20 20 20 20 20 20 4d  4f 56 20 20 20 20 52 36  |       MOV    R6|
00000fb0  2c 52 31 31 20 20 20 20  20 20 20 20 20 20 20 20  |,R11            |
00000fc0  3b 20 79 5f 73 70 65 65  64 3d 79 5f 73 70 65 65  |; y_speed=y_spee|
00000fd0  64 5f 61 66 74 65 72 5f  62 6f 75 6e 63 65 0d 05  |d_after_bounce..|
00000fe0  0a 04 0d 05 14 41 2e 73  6b 69 70 20 20 20 20 20  |.....A.skip     |
00000ff0  20 41 44 44 20 20 20 20  52 36 2c 52 36 2c 23 67  | ADD    R6,R6,#g|
00001000  72 61 76 69 74 79 25 20  20 20 3b 20 79 5f 73 70  |ravity%   ; y_sp|
00001010  65 65 64 3d 79 5f 73 70  65 65 64 2b 67 72 61 76  |eed=y_speed+grav|
00001020  69 74 79 0d 05 1e 04 0d  05 28 3e 20 20 20 20 20  |ity......(>     |
00001030  20 20 20 20 20 20 53 54  4d 49 41 20 20 52 32 21  |      STMIA  R2!|
00001040  2c 7b 52 33 2d 52 37 2c  52 31 31 7d 20 20 20 3b  |,{R3-R7,R11}   ;|
00001050  20 73 74 6f 72 65 20 61  77 61 79 20 62 61 6c 6c  | store away ball|
00001060  20 64 61 74 61 0d 05 32  41 20 20 20 20 20 20 20  | data..2A       |
00001070  20 20 20 20 53 55 42 53  20 20 20 52 38 2c 52 38  |    SUBS   R8,R8|
00001080  2c 23 31 20 20 20 20 20  20 20 20 20 20 3b 20 69  |,#1          ; i|
00001090  73 20 74 68 65 72 65 20  61 6e 6f 74 68 65 72 20  |s there another |
000010a0  62 61 6c 6c 20 3f 0d 05  3c 42 20 20 20 20 20 20  |ball ?..<B      |
000010b0  20 20 20 20 20 42 4e 45  20 20 20 20 62 61 6c 6c  |     BNE    ball|
000010c0  5f 6c 6f 6f 70 20 20 20  20 20 20 20 20 20 3b 20  |_loop         ; |
000010d0  69 66 20 73 6f 2c 20 67  6f 20 74 6f 20 27 62 61  |if so, go to 'ba|
000010e0  6c 6c 5f 6c 6f 6f 70 27  0d 05 46 2e 2e 65 78 69  |ll_loop'..F..exi|
000010f0  74 20 20 20 20 20 20 4c  44 4d 46 44 20 20 52 31  |t      LDMFD  R1|
00001100  33 21 2c 7b 52 30 2d 52  31 31 2c 50 43 7d 20 20  |3!,{R0-R11,PC}  |
00001110  3b 20 65 78 69 74 0d 05  50 04 0d 05 5a 04 0d 05  |; exit..P...Z...|
00001120  64 38 2e 74 61 62 6c 65  25 20 20 20 20 a4 61 72  |d8.table%    .ar|
00001130  72 61 79 28 62 25 2a 32  34 29 20 20 20 20 20 20  |ray(b%*24)      |
00001140  20 20 20 20 20 3b 20 62  61 6c 6c 20 64 61 74 61  |     ; ball data|
00001150  20 74 61 62 6c 65 0d 05  6e 04 0d 05 78 04 0d 05  | table..n...x...|
00001160  82 2e 20 20 20 20 20 20  20 20 20 20 20 3b 20 4f  |..           ; O|
00001170  6e 20 65 6e 74 72 79 20  2d 20 72 30 20 3d 20 73  |n entry - r0 = s|
00001180  63 72 65 65 6e 20 6f 66  66 73 65 74 0d 05 8c 2e  |creen offset....|
00001190  20 20 20 20 20 20 20 20  20 20 20 3b 20 20 20 20  |           ;    |
000011a0  20 20 20 20 20 20 20 20  72 31 20 3d 20 73 70 72  |        r1 = spr|
000011b0  69 74 65 20 6f 66 66 73  65 74 0d 05 96 04 0d 05  |ite offset......|
000011c0  a0 27 2e 70 6c 6f 74 5f  62 61 6c 6c 20 53 54 4d  |.'.plot_ball STM|
000011d0  46 44 20 20 52 31 33 21  2c 7b 52 30 2d 52 31 31  |FD  R13!,{R0-R11|
000011e0  2c 52 31 34 7d 0d 05 aa  44 20 20 20 20 20 20 20  |,R14}...D       |
000011f0  20 20 20 20 41 44 44 20  20 20 20 52 30 2c 52 30  |    ADD    R0,R0|
00001200  2c 52 31 32 20 20 20 20  20 20 20 20 20 3b 20 20  |,R12         ;  |
00001210  72 30 3d 73 63 72 65 65  6e 5f 6f 66 66 2b 73 63  |r0=screen_off+sc|
00001220  72 65 65 6e 5f 61 64 64  72 0d 05 b4 3c 20 20 20  |reen_addr...<   |
00001230  20 20 20 20 20 20 20 20  41 44 52 20 20 20 20 52  |        ADR    R|
00001240  32 2c 73 70 72 69 74 65  73 25 20 20 20 20 20 20  |2,sprites%      |
00001250  20 3b 20 20 72 32 3d 73  70 72 69 74 65 20 61 64  | ;  r2=sprite ad|
00001260  64 72 65 73 73 0d 05 be  44 20 20 20 20 20 20 20  |dress...D       |
00001270  20 20 20 20 41 44 44 20  20 20 20 52 31 2c 52 31  |    ADD    R1,R1|
00001280  2c 52 32 20 20 20 20 20  20 20 20 20 20 3b 20 20  |,R2          ;  |
00001290  72 31 3d 73 70 72 69 74  65 5f 6f 66 66 2b 73 70  |r1=sprite_off+sp|
000012a0  72 69 74 65 5f 61 64 64  72 0d 05 c8 3a 20 20 20  |rite_addr...:   |
000012b0  20 20 20 20 20 20 20 20  41 44 44 20 20 20 20 52  |        ADD    R|
000012c0  32 2c 52 31 2c 23 28 33  32 2a 33 32 29 20 20 20  |2,R1,#(32*32)   |
000012d0  20 3b 20 20 72 32 3d 6d  61 73 6b 20 61 64 64 72  | ;  r2=mask addr|
000012e0  65 73 73 0d 05 d2 3c 20  20 20 20 20 20 20 20 20  |ess...<         |
000012f0  20 20 4d 4f 56 20 20 20  20 52 31 30 2c 23 33 32  |  MOV    R10,#32|
00001300  20 20 20 20 20 20 20 20  20 20 20 3b 20 72 31 30  |           ; r10|
00001310  3d 6e 75 6d 62 65 72 20  6f 66 20 72 6f 77 73 0d  |=number of rows.|
00001320  05 dc 45 2e 6a 75 6d 70  5f 6c 6f 6f 70 20 43 4d  |..E.jump_loop CM|
00001330  50 20 20 20 20 52 30 2c  52 31 32 20 20 20 20 20  |P    R0,R12     |
00001340  20 20 20 20 20 20 20 3b  20 69 73 20 74 68 69 73  |       ; is this|
00001350  20 72 6f 77 20 6f 6e 20  74 68 65 20 73 63 72 65  | row on the scre|
00001360  65 6e 20 3f 0d 05 e6 3e  20 20 20 20 20 20 20 20  |en ?...>        |
00001370  20 20 20 42 47 45 20 20  20 20 62 65 67 69 6e 20  |   BGE    begin |
00001380  20 20 20 20 20 20 20 20  20 20 20 20 3b 20 69 66  |            ; if|
00001390  20 73 6f 2c 20 67 6f 20  74 6f 20 27 62 65 67 69  | so, go to 'begi|
000013a0  6e 27 0d 05 f0 04 0d 05  fa 41 20 20 20 20 20 20  |n'.......A      |
000013b0  20 20 20 20 20 41 44 44  20 20 20 20 52 31 2c 52  |     ADD    R1,R|
000013c0  31 2c 23 33 32 20 20 20  20 20 20 20 20 20 3b 20  |1,#32         ; |
000013d0  69 66 20 6e 6f 74 2c 20  73 70 72 69 74 65 5f 61  |if not, sprite_a|
000013e0  64 64 72 2b 3d 33 32 0d  06 04 41 20 20 20 20 20  |ddr+=32...A     |
000013f0  20 20 20 20 20 20 41 44  44 20 20 20 20 52 32 2c  |      ADD    R2,|
00001400  52 32 2c 23 33 32 20 20  20 20 20 20 20 20 20 3b  |R2,#32         ;|
00001410  20 20 20 20 20 20 20 20  20 20 20 6d 61 73 6b 5f  |           mask_|
00001420  61 64 64 72 2b 3d 33 32  0d 06 0e 41 20 20 20 20  |addr+=32...A    |
00001430  20 20 20 20 20 20 20 41  44 44 20 20 20 20 52 30  |       ADD    R0|
00001440  2c 52 30 2c 23 33 32 20  20 20 20 20 20 20 20 20  |,R0,#32         |
00001450  3b 20 20 20 20 20 20 20  20 20 73 63 72 65 65 6e  |;         screen|
00001460  5f 61 64 64 72 2b 3d 33  32 0d 06 18 3d 20 20 20  |_addr+=32...=   |
00001470  20 20 20 20 20 20 20 20  42 20 20 20 20 20 20 65  |        B      e|
00001480  6e 64 5f 32 20 20 20 20  20 20 20 20 20 20 20 20  |nd_2            |
00001490  20 3b 20 20 20 20 20 20  20 20 20 67 6f 20 74 6f  | ;         go to|
000014a0  20 27 65 6e 64 27 0d 06  22 04 0d 06 2c 10 2e 62  | 'end'.."...,..b|
000014b0  65 67 69 6e 20 20 20 20  20 5d 0d 06 36 1e 20 20  |egin     ]..6.  |
000014c0  20 20 20 20 20 20 20 20  20 e3 20 6c 6f 6f 70 25  |         . loop%|
000014d0  20 3d 20 31 20 b8 20 34  0d 06 40 1c 20 20 20 20  | = 1 . 4..@.    |
000014e0  20 20 20 20 20 20 20 20  20 5b 20 4f 50 54 20 70  |         [ OPT p|
000014f0  61 73 73 25 0d 06 4a 11  20 20 20 20 20 20 20 20  |ass%..J.        |
00001500  20 20 20 20 20 0d 06 54  41 20 20 20 20 20 20 20  |     ..TA       |
00001510  20 20 20 20 4c 44 4d 49  41 20 20 52 31 21 2c 7b  |    LDMIA  R1!,{|
00001520  52 33 2d 52 34 7d 20 20  20 20 20 20 20 3b 20 72  |R3-R4}       ; r|
00001530  33 20 61 6e 64 20 72 34  20 3d 20 73 70 72 69 74  |3 and r4 = sprit|
00001540  65 20 64 61 74 61 0d 06  5e 41 20 20 20 20 20 20  |e data..^A      |
00001550  20 20 20 20 20 4c 44 4d  49 41 20 20 52 32 21 2c  |     LDMIA  R2!,|
00001560  7b 52 35 2d 52 36 7d 20  20 20 20 20 20 20 3b 20  |{R5-R6}       ; |
00001570  72 35 20 61 6e 64 20 72  36 20 3d 20 20 20 6d 61  |r5 and r6 =   ma|
00001580  73 6b 20 64 61 74 61 0d  06 68 41 20 20 20 20 20  |sk data..hA     |
00001590  20 20 20 20 20 20 4c 44  4d 49 41 20 20 52 30 20  |      LDMIA  R0 |
000015a0  2c 7b 52 37 2d 52 38 7d  20 20 20 20 20 20 20 3b  |,{R7-R8}       ;|
000015b0  20 72 37 20 61 6e 64 20  72 38 20 3d 20 73 63 72  | r7 and r8 = scr|
000015c0  65 65 6e 20 64 61 74 61  0d 06 72 3c 20 20 20 20  |een data..r<    |
000015d0  20 20 20 20 20 20 20 80  20 20 20 20 52 37 2c 52  |       .    R7,R|
000015e0  37 2c 52 35 20 20 20 20  20 20 20 20 20 20 3b 20  |7,R5          ; |
000015f0  73 63 72 65 65 6e 3d 73  63 72 65 65 6e 20 80 20  |screen=screen . |
00001600  6d 61 73 6b 0d 06 7c 3f  20 20 20 20 20 20 20 20  |mask..|?        |
00001610  20 20 20 84 52 20 20 20  20 52 35 2c 52 37 2c 52  |   .R    R5,R7,R|
00001620  33 20 20 20 20 20 20 20  20 20 20 3b 20 20 20 6d  |3          ;   m|
00001630  61 73 6b 3d 73 63 72 65  65 6e 20 84 20 73 70 72  |ask=screen . spr|
00001640  69 74 65 0d 06 86 3e 20  20 20 20 20 20 20 20 20  |ite...>         |
00001650  20 20 80 20 20 20 20 52  38 2c 52 38 2c 52 36 20  |  .    R8,R8,R6 |
00001660  20 20 20 20 20 20 20 20  20 3b 20 61 62 6f 76 65  |         ; above|
00001670  20 70 72 6f 63 65 73 73  20 72 65 70 65 61 74 65  | process repeate|
00001680  64 0d 06 90 41 20 20 20  20 20 20 20 20 20 20 20  |d...A           |
00001690  84 52 20 20 20 20 52 36  2c 52 38 2c 52 34 20 20  |.R    R6,R8,R4  |
000016a0  20 20 20 20 20 20 20 20  3b 20 66 6f 72 20 74 68  |        ; for th|
000016b0  65 20 6e 65 78 74 20 73  65 74 20 6f 66 20 64 61  |e next set of da|
000016c0  74 61 0d 06 9a 45 20 20  20 20 20 20 20 20 20 20  |ta...E          |
000016d0  20 53 54 4d 49 41 20 20  52 30 21 2c 7b 52 35 2d  | STMIA  R0!,{R5-|
000016e0  52 36 7d 20 20 20 20 20  20 20 3b 20 73 74 6f 72  |R6}       ; stor|
000016f0  65 20 72 35 20 61 6e 64  20 72 36 20 6f 6e 74 6f  |e r5 and r6 onto|
00001700  20 73 63 72 65 65 6e 0d  06 a4 0f 20 20 20 20 20  | screen....     |
00001710  20 20 20 20 20 20 0d 06  ae 12 20 20 20 20 20 20  |      ....      |
00001720  20 20 20 20 20 20 20 5d  0d 06 b8 10 20 20 20 20  |       ]....    |
00001730  20 20 20 20 20 20 20 ed  0d 06 c2 19 20 20 20 20  |       .....    |
00001740  20 20 20 20 20 20 20 5b  4f 50 54 20 70 61 73 73  |       [OPT pass|
00001750  25 0d 06 cc 0f 20 20 20  20 20 20 20 20 20 20 20  |%....           |
00001760  0d 06 d6 45 2e 65 6e 64  5f 32 20 20 20 20 20 41  |...E.end_2     A|
00001770  44 44 20 20 20 20 52 30  2c 52 30 2c 23 28 33 32  |DD    R0,R0,#(32|
00001780  30 2d 33 32 29 20 20 20  3b 20 6d 6f 76 65 20 73  |0-32)   ; move s|
00001790  63 72 65 65 6e 20 70 74  72 20 74 6f 20 6e 65 78  |creen ptr to nex|
000017a0  74 20 72 6f 77 0d 06 e0  40 20 20 20 20 20 20 20  |t row...@       |
000017b0  20 20 20 20 53 55 42 53  20 20 20 52 31 30 2c 52  |    SUBS   R10,R|
000017c0  31 30 2c 23 31 20 20 20  20 20 20 20 20 3b 20 69  |10,#1        ; i|
000017d0  73 20 74 68 65 72 65 20  61 6e 6f 74 68 65 72 20  |s there another |
000017e0  72 6f 77 20 3f 0d 06 ea  42 20 20 20 20 20 20 20  |row ?...B       |
000017f0  20 20 20 20 42 4e 45 20  20 20 20 6a 75 6d 70 5f  |    BNE    jump_|
00001800  6c 6f 6f 70 20 20 20 20  20 20 20 20 20 3b 20 69  |loop         ; i|
00001810  66 20 73 6f 2c 20 67 6f  20 74 6f 20 27 6a 75 6d  |f so, go to 'jum|
00001820  70 5f 6c 6f 6f 70 27 0d  06 f4 26 2e 70 6c 6f 74  |p_loop'...&.plot|
00001830  5f 65 6e 64 20 20 4c 44  4d 46 44 20 20 52 31 33  |_end  LDMFD  R13|
00001840  21 2c 7b 52 30 2d 52 31  31 2c 50 43 7d 0d 06 fe  |!,{R0-R11,PC}...|
00001850  04 0d 07 08 04 0d 07 12  1f 2e 73 70 72 69 74 65  |..........sprite|
00001860  73 25 20 20 a4 61 72 72  61 79 28 73 70 72 5f 6c  |s%  .array(spr_l|
00001870  65 6e 25 29 0d 07 1c 04  0d 07 26 04 0d 07 30 09  |en%)......&...0.|
00001880  20 20 20 20 5d 0d 07 3a  07 20 20 ed 0d 07 44 05  |    ]..:.  ...D.|
00001890  e1 0d 07 4e 04 0d 07 58  04 0d 07 62 04 0d 07 6c  |...N...X...b...l|
000018a0  13 dd 20 a4 61 72 72 61  79 28 73 69 7a 65 25 29  |.. .array(size%)|
000018b0  0d 07 76 11 20 20 50 25  20 2b 3d 20 73 69 7a 65  |..v.  P% += size|
000018c0  25 0d 07 80 06 3d 30 0d  07 8a 04 0d 07 94 04 0d  |%....=0.........|
000018d0  07 9e 04 0d 07 a8 0b dd  20 f2 69 6e 69 74 0d 07  |........ .init..|
000018e0  b2 24 20 20 ea 20 77 69  64 25 2c 68 65 69 25 2c  |.$  . wid%,hei%,|
000018f0  49 25 2c 78 25 2c 78 73  25 2c 79 73 25 2c 70 6f  |I%,x%,xs%,ys%,po|
00001900  73 25 0d 07 bc 04 0d 07  c6 18 20 20 77 69 64 25  |s%........  wid%|
00001910  20 3d 20 72 69 67 25 20  2d 20 6c 65 66 25 0d 07  | = rig% - lef%..|
00001920  d0 18 20 20 68 65 69 25  20 3d 20 62 6f 74 25 20  |..  hei% = bot% |
00001930  2d 20 74 6f 70 25 0d 07  da 04 0d 07 e4 13 20 20  |- top%........  |
00001940  e3 20 49 25 20 3d 20 31  20 b8 20 62 25 0d 07 ee  |. I% = 1 . b%...|
00001950  25 20 20 20 20 70 6f 73  25 20 3d 20 74 61 62 6c  |%    pos% = tabl|
00001960  65 25 20 2b 20 28 28 49  25 2d 31 29 20 2a 20 32  |e% + ((I%-1) * 2|
00001970  34 29 0d 07 f8 14 20 20  20 20 f3 20 78 25 2c 78  |4)....    . x%,x|
00001980  73 25 2c 79 73 25 0d 08  02 14 20 20 20 20 70 6f  |s%,ys%....    po|
00001990  73 25 21 30 20 20 3d 20  78 25 0d 08 0c 2f 20 20  |s%!0  = x%.../  |
000019a0  20 20 70 6f 73 25 21 34  20 20 3d 20 28 20 74 6f  |  pos%!4  = ( to|
000019b0  70 25 20 2b 20 28 62 6f  74 25 20 2d 20 32 35 36  |p% + (bot% - 256|
000019c0  29 20 29 20 3c 3c 20 31  36 0d 08 16 15 20 20 20  |) ) << 16....   |
000019d0  20 70 6f 73 25 21 38 20  20 3d 20 78 73 25 0d 08  | pos%!8  = xs%..|
000019e0  20 21 20 20 20 20 70 6f  73 25 21 31 32 20 3d 20  | !    pos%!12 = |
000019f0  28 79 73 25 20 2f 20 38  29 20 3c 3c 20 31 36 0d  |(ys% / 8) << 16.|
00001a00  08 2a 21 20 20 20 20 70  6f 73 25 21 31 36 20 3d  |.*!    pos%!16 =|
00001a10  20 28 20 28 49 25 20 2d  20 31 29 20 83 20 33 29  | ( (I% - 1) . 3)|
00001a20  0d 08 34 1c 20 20 20 20  70 6f 73 25 21 32 30 20  |..4.    pos%!20 |
00001a30  3d 20 2d 79 73 25 20 3c  3c 20 31 36 0d 08 3e 07  |= -ys% << 16..>.|
00001a40  20 20 ed 0d 08 48 04 0d  08 52 05 e1 0d ff        |  ...H...R....|
00001a4e