Home » Archimedes archive » Archimedes World » AW-1996-12.adf » !AcornAns_AcornAns » December/!Balls/BallsNoInt

December/!Balls/BallsNoInt

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 » Archimedes World » AW-1996-12.adf » !AcornAns_AcornAns
Filename: December/!Balls/BallsNoInt
Read OK:
File size: 4383 bytes
Load address: 0000
Exec address: 0000
File contents
   10REM >Balls
   20REM
   30:
   40REM NB program will produce a beep if animation speed falls
   50REM below the target fps rate.
   60targetfps% = 50
   70IF 100MODtargetfps%<>0 ERROR 1, "Require targetfps divides into 100"
   80:
   90SYS &20280, 0, -1 TO ;flags%
  100IF flags% AND 1 THEN arm3%=FALSE ELSE arm3%=TRUE
  110:
  120ON ERROR SYS 6,112,1:SYS 6,113,1:PRINT REPORT$;" at line ";ERL:END
  130D% = RND(-TIME)
  140:
  150CLS
  160PRINT "                    B A L L S   D E M O"'
  170PRINT "� Program will beep if animation speed falls below the target of ";targetfps%;" fps."
  180PRINT "� Pressing any key during demo will add one more ball."
  190PRINT "� Press Escape to end program."'
  200INPUT "Please input Standard (0) or VGA (1) display";VGA%
  210IF VGA%<>1 VGA%=0
  220:
  230hpix%=288
  240vpix%=200
  250IF VGA% THEN
  260 mode%=99
  270 avpix%=400
  280 hadd%=hpix%*2
  290 lhadd%=6
  300 lhpix%=5
  310ELSE
  320 mode%=98
  330 avpix%=200
  340 hadd%=hpix%
  350 lhadd%=5
  360 lhpix%=5
  370ENDIF
  380:
  390DIM balldata% 864*3
  400SYS "OS_File", 255, "<Balls$Dir>.Resources.BallrData", balldata%, 0
  410SYS "OS_File", 255, "<Balls$Dir>.Resources.BallgData", balldata%+864, 0
  420SYS "OS_File", 255, "<Balls$Dir>.Resources.BallbData", balldata%+864*2, 0
  430DIM backdata% 57656
  440SYS "OS_File", 255, "<Balls$Dir>.Resources.BackSpr", backdata%, 0
  450DIM middata% 57656
  460SYS "OS_File", 255, "<Balls$Dir>.Resources.MidSpr", middata%, 0
  470:
  480DIM vblin% 8, vblout% 8
  490!vblin%=148:vblin%!4=-1
  500MODE mode%+128
  510SYS "OS_ReadVduVariables", vblin%, vblout%
  520scrst2%=!vblout%
  530MODE mode%
  540SYS "OS_ReadVduVariables", vblin%, vblout%
  550scrst1%=!vblout%
  560OFF
  570:
  580maxn%=200
  590DIM b% maxn%*24
  600REM NB b% stores array (of size n%) of structure:
  610REM {x coord, y coord, x increment, y increment, sticking count, ball type}
  620:
  630PROCass
  640:
  650SYS 6,112,1:SYS 6,113,1
  660n%=1
  670!an%=n%
  680:
  690REM initialise ball locations & velocities
  700FOR i% = 0 TO n%*24-1 STEP 24
  710  b%!(i%+0)  = 259*256
  720  b%!(i%+4)  = 174*256
  730  b%!(i%+8)  = RND(64)-32
  740  b%!(i%+12) = -4*256+RND(128)-64
  750  b%!(i%+16) = 0
  760  b%!(i%+20) = RND(3)-1
  770NEXT
  780:
  790CALL makeback%
  800:
  810REPEAT
  820 CALL anim%
  830 IF n%<maxn% THEN
  840  i%=24*n%
  850  b%!(i%+0)  = 259*256
  860  b%!(i%+4)  = 174*256
  870  b%!(i%+8)  = RND(64)-32
  880  b%!(i%+12) = -4*256+RND(128)-64
  890  b%!(i%+16) = 0
  900  b%!(i%+20) = RND(3)-1
  910  n%+=1
  920  !an%=n%
  930 ENDIF
  940UNTIL FALSE
  950:
  960END
  970:
  980DEF PROCass
  990DIM code% 10240, sqrt% 257*4, sincos% 256*8
 1000FOR i%=0 TO 256
 1010 sqrt%!(4*i%) = 0.5+SQR(256*i%)
 1020NEXT
 1030FOR i%=0 TO 255
 1040 sincos%!(8*i%  ) = 0.5+256*SIN(2*PI*i%/256)
 1050 sincos%!(8*i%+4) = 0.5+256*COS(2*PI*i%/256)
 1060NEXT
 1070scrst%=scrst1%
 1080FOR pass% = 0 TO 2 STEP 2
 1090 P%=code%
 1100 [OPT pass%
 1110 .aspframe%         EQUD 0
 1120 .ascrstsum%        EQUD scrst1%+scrst2%
 1130 .an%     EQUD 0
 1140 .ab%     EQUD b%
 1150 .atime%  EQUD 0              ;time storage for frame speed calc
 1160 .afc%    EQUD 0              ;frame counter
 1170 .anim%
 1180 STMFD    13!, {14}
 1190 STR      13, aspframe%       ;store sp to free up r13
 1200 .nextframe%
 1210 :
 1220 SWI      "OS_ReadMonotonicTime"        ;track frame speed
 1230 STR      0, atime%
 1240 :
 1250 MOV      0, #19
 1260 SWI      "OS_Byte"                     ;wait for vsync
 1270 MOV      0, #113
 1280 LDR      1, abank%
 1290 RSB      3, 1, #3
 1300 STR      3, abank%
 1310 SWI      "OS_Byte"           ;swap displayed screen bank
 1320 LDR      0, ascrstsum%
 1330 LDR      1, ascrst%
 1340 SUB      1, 0, 1
 1350 STR      1, ascrst%          ;swap ptr to other bank
 1360 BL       copyback%           ;cls that bank to background
 1370 :
 1380 LDR      12, ab%
 1390 LDR      13, an%
 1400 .framemoveloop%              ;then move each ball
 1410 LDMIA    12, {0,1,2,3,4,5}   ; read x,y,xi,yi,sc,bt
 1420 BL       movencheck%
 1430 STMIA    12!, {0,1,2,3,4,5}  ; restore x,y,xi,yi,sc,bt
 1440 SUBS     13, 13, #1
 1450 BNE      framemoveloop%      ;then do next ball
 1460 :
 1470 LDR      12, ab%
 1480 LDR      13, an%
 1490 .frameplotloop%              ;now plot each ball:
 1500 LDMIA    12, {0,1}           ; read x,y coords from data
 1510 LDR      2, [12, #20]
 1520 MOV      0, 0, ASR #8
 1530 MOV      1, 1, ASR #8
 1540 BL       plot%               ; plot ball at x,y
 1550 ADD      12, 12, #24
 1560 SUBS     13, 13, #1
 1570 BNE      frameplotloop%      ;then do next ball
 1580 LDR      11, afc%
 1590 ADD      11, 11, #1
 1600 STR      11, afc%            ;update frame count
 1610 :
 1620 ]
 1630 IF VGA% THEN
 1640 [OPT pass%
 1650 LDR      14, ascrst%         ;if in VGA mode, fill in the extra
 1660 ADD      13, 14, #hadd%-hpix%;blank lines by copying the line
 1670 MOV      12, #vpix%          ;above
 1680 .interlacel1%
 1690 LDMIA    14!, {0-11}
 1700 STMIA    13!, {0-11}
 1710 LDMIA    14!, {0-11}
 1720 STMIA    13!, {0-11}
 1730 LDMIA    14!, {0-11}
 1740 STMIA    13!, {0-11}
 1750 LDMIA    14!, {0-11}
 1760 STMIA    13!, {0-11}
 1770 LDMIA    14!, {0-11}
 1780 STMIA    13!, {0-11}
 1790 LDMIA    14!, {0-11}
 1800 STMIA    13!, {0-11}
 1810 ADD      13, 13, #hadd%-hpix%
 1820 ADD      14, 14, #hadd%-hpix%
 1830 SUBS     12, 12, #1
 1840 BNE      interlacel1%
 1850 ]
 1860 ENDIF
 1870 [OPT pass%
 1880 :
 1890 SWI      "OS_ReadMonotonicTime"        ;calculate frame speed
 1900 LDR      1, atime%
 1910 SUB      0, 0, 1
 1920 CMP      0, #100/targetfps%
 1930 SWIGT    256+7               ;beep if it falls below target fps
 1940 :
 1950 MOV      0, #129
 1960 MOV      1, #0
 1970 MOV      2, #0
 1980 SWI      "OS_Byte"
 1990 CMP      2, #&FF
 2000 BEQ      nextframe%          ;if no key pressed, do next frame
 2010 LDR      13, aspframe%       ;restore sp
 2020 LDMFD    13!, {PC}           ;return to BASIC
 2030 :
 2040 .makeback%
 2050 LDR      0, abackdata%
 2060 LDR      1, amiddata%
 2070 MOV      2, #vpix%*hpix%
 2080 MOV      4, #255
 2090 .makebackloop%
 2100 LDRB     3, [1]
 2110 CMP      3, #0
 2120 STRNEB   3, [0]
 2130 STRNEB   4, [1]
 2140 ADD      1, 1, #1
 2150 ADD      0, 0, #1
 2160 SUBS     2, 2, #1
 2170 BNE      makebackloop%
 2180 MOVS     PC, 14
 2190 :
 2200 .ascrst% EQUD scrst%
 2210 .adata%  EQUD balldata%
 2220 .abackdata%        EQUD backdata%+56
 2230 .amiddata%         EQUD middata%+56
 2240 .abank%  EQUD 1
 2250 .aplotregs%        EQUD 0:EQUD 0:EQUD 0
 2260 .plot%   ;plot our ball sprite at coords r0,r1
 2270          ;where 0,0 is top left & 287,199 is bottom right
 2280          ;NB sprite MUST lie entirely within screen
 2290 ADR      11, aplotregs%
 2300 STMIA    11, {12,13,14}
 2310 AND      4, 0, #3            ;calc which of 4 sprite alignments
 2320 ADD      3, 4, 4, ASL #1     ;we need via (xAND3)*12*2*9 + data%
 2330 ADD      3, 3, 3, ASL #3
 2340 BIC      0, 0, #3            ;round x down to mult of 3
 2350 ADD      1, 1, 1, ASL #3
 2360 LDR      4, ascrst%
 2370 ADD      4, 4, 1, ASL #lhadd%
 2380 ADD      0, 4, 0             ;calc (screen ptr + hadd%*y + x)
 2390 LDR      1, adata%
 2400 RSB      4, 2, 2, ASL #5
 2410 SUB      4, 4, 2, ASL #2
 2420 ADD      1, 1, 4, ASL #5
 2430 ADD      1, 1, 3, ASL #3     ;finally calc (xAND3)*12*2*9+data%
 2440 MOV      2, #3
 2450 ADD      3, 1, #12*9
 2460 .loop1%                      ;now plot sprite
 2470 FNplotfrag(pass%)            ;plot 1st row
 2480 ADD      0, 0, #hadd%-12     ;move screen ptr to start next row
 2490 FNplotfrag(pass%)
 2500 ADD      0, 0, #hadd%-12
 2510 FNplotfrag(pass%)            ;plot 3rd row
 2520 ADD      0, 0, #hadd%-12
 2530 SUBS     2, 2, #1
 2540 BNE      loop1%          ;repeat above 3 times to do all 9 rows
 2550 ADR      11, aplotregs%      ;plot completed - return to caller
 2560 LDMIA    11, {12,13,PC}      ;preserving r12 & r13.
 2570 :
 2580 .acollregs%    EQUD 0:EQUD 0:EQUD 0:EQUD 0
 2590                EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0
 2600 .movencheck%     ;move then collision check our
 2610                  ;ball sprite at coords r0,r1
 2620                  ;where 0,0 is top left & 287,199 is bottom right
 2630                  ;NB sprite MUST lie entirely within screen
 2640 ADR      11, acollregs%
 2650 ADD      0, 0, 2
 2660 ADD      1, 1, 3
 2670 STMIA    11, {0-5,12,13,14}
 2680 MOV      0, 0, ASR #8
 2690 MOV      1, 1, ASR #8
 2700 AND      2, 0, #3            ;calc which of 4 sprite alignments
 2710 ADD      3, 2, 2, ASL #1     ;we need via (xAND3)*12*2*9 + data%
 2720 ADD      3, 3, 3, ASL #3
 2730 BIC      0, 0, #3            ;round x down to mult of 3
 2740 ADD      1, 1, 1, ASL #3
 2750 LDR      2, amiddata%
 2760 ADD      2, 2, 1, ASL #lhpix%
 2770 ADD      0, 2, 0             ;calc (back mask ptr + hpix%*y + x)
 2780 LDR      1, adata%
 2790 RSB      2, 5, 5, ASL #5
 2800 SUB      2, 2, 5, ASL #2
 2810 ADD      1, 1, 2, ASL #5     ;add in to data ptr 864*balltype
 2820 ADD      1, 1, 3, ASL #3     ;finally calc (xAND3)*12*2*9+data%
 2830 ADD      1, 1, #12*9
 2840 ADR      2, colladdrbuf%     ;store back and sprite data addrs
 2850 STMIA    2, {0,1}            ;corresponding to top left of ball
 2860 MOV      2, #3
 2870 .collloop1%                  ;now check sprite
 2880 FNcollfrag(pass%)            ;check 1st row (if coll B gotcoll%)
 2890 ADD      0, 0, #hpix%-12     ;move back ptr to start next row
 2900 FNcollfrag(pass%)
 2910 ADD      0, 0, #hpix%-12
 2920 FNcollfrag(pass%)            ;check 4th row
 2930 ADD      0, 0, #hpix%-12
 2940 SUBS     2, 2, #1
 2950 BNE      collloop1%      ;repeat above 3 times to do all 9 rows
 2960 ADR      11, acollregs%
 2970 LDMIA    11, {0-5,12,13,14}
 2980 ADD      3, 3, #8            ; accelerate ball downwards
 2990 MOV      4, #0
 3000 MOV      PC, 14
 3010 .colladdrbuf%      EQUD 0:EQUD 0
 3020 .gotcoll%
 3030 ADR      11, acollregs%
 3040 LDMIA    11, {0-3}
 3050 SUB      0, 0, 2             ;reset position, moving it out of
 3060 SUB      1, 1, 3             ;collision
 3070 STMIA    11, {0,1}
 3080 MOV      6, #0               ;in my lin reg notes, n
 3090 MOV      7, #0                                   ; u
 3100 MOV      8, #0                                   ; v
 3110 MOV      9, #0                                   ; p
 3120 MOV      10, #0                                  ; q
 3130 ADR      2, colladdrbuf%
 3140 LDMIA    2, {0,1}            ;recall screen/data addrs for top
 3150 MOV      3, #0     ;row 0    ;left of sprite
 3160 .statloop1%
 3170 MOV      2, #0     ;col 0
 3180 .statloop2%
 3190 LDR      4, [0], #4          ;rescan each pixel in collision area
 3200 LDR      5, [1], #4          ;and for each collided pixel add its
 3210 AND      4, 4, 5             ;coords (relative to topleft sprite)
 3220 FNstatfrag(pass%, 255)       ;onto the regression statistics
 3230 ADD      2, 2, #1
 3240 FNstatfrag(pass%, 255<<8)
 3250 ADD      2, 2, #1
 3260 FNstatfrag(pass%, 255<<16)
 3270 ADD      2, 2, #1
 3280 FNstatfrag(pass%, 255<<24)
 3290 ADD      2, 2, #1
 3300 CMP      2, #12
 3310 BLT      statloop2%
 3320 ADD      0, 0, #hpix%-12
 3330 ADD      3, 3, #1
 3340 CMP      3, #9
 3350 BLT      statloop1%          ;when done, n, u & v computed
 3360 MUL      9, 6, 9
 3370 ADD      5, 7, 8
 3380 SUB      14, 7, 8
 3390 MLA      9, 5, 14, 9         ;p computed
 3400 MUL      10, 6, 10
 3410 MUL      14, 7, 8
 3420 SUB      10, 10, 14
 3430 ADD      10, 10, 10          ;q computed
 3440 MOVS     6, 9
 3450 RSBMI    6, 6, #0            ;ap = abs p
 3460 MOVS     7, 10
 3470 RSBMI    7, 7, #0            ;aq = abs q
 3480 CMP      6, 7
 3490 MOV      8, 6
 3500 MOVLT    8, 7                ; m = max {ap,aq}
 3510 CMP      8, #0               ;if have degenerate collision
 3520 BEQ      patch1%             ;(eg with single pixel), can't calc
 3530 .statloop3%                  ;a linear regression, so go patch1%
 3540 CMP      8, #1<<12           ;which simply reverses velocities!
 3550 MOVGE    8, 8, ASR #1
 3560 MOVGE    6, 6, ASR #1        ;proportionately reduce ap and aq in
 3570 MOVGE    7, 7, ASR #1        ;magnitude, until in necessary range
 3580 BGE      statloop3%
 3590 MUL      11, 6, 6            ;ap^2 in low range
 3600 MUL      12, 7, 7            ;aq^2 in low range
 3610 ADD      13, 11, 12          ;divisor ap^2+aq^2
 3620 MOV      0, 11, ASL #8
 3630 FNdiv(pass%, 0, 13, 11, 1)   ;t  in r11 = 256ap^2/(ap^2+aq^2)
 3640 MOV      0, 12, ASL #8
 3650 FNdiv(pass%, 0, 13, 12, 1)   ;tb in r12 = 256aq^2/(ap^2+aq^2)
 3660 LDR      13, asqrt%
 3670 LDR      7, [13, 11, LSL #2] ;square root t
 3680 LDR      8, [13, 12, LSL #2] ;and tb, via look-up-table
 3690 CMP      9, #0
 3700 RSBLT    7, 7, #0            ;final t  in r7
 3710 CMP      10, #0
 3720 RSBPL    8, 8, #0            ;final tb in r8
 3730 ADR      11, acollregs%
 3740 LDMIA    11, {0-5,12,13,14}
 3750 MUL      11, 7, 2            ;now modify velocity by
 3760 MLA      11, 8, 3, 11        ;reflecting it in the
 3770 RSB      11, 11, #0          ;line generated by the linear
 3780 MUL      6, 7, 3             ;regression calculation
 3790 MUL      9, 8, 2             ;(which we use to approximate the
 3800 SUB      6, 6, 9             ; tangent at the collision surface)
 3810 RSB      11, 11, 11, ASL #8
 3820 RSB      6, 6, 6, ASL #8     ;& then attenuate by factor 255/256
 3830 MOV      2, 11, ASR #16      ;(simulate energy loss on coll)
 3840 MOV      3, 6, ASR #16
 3850 ADD      4, 4, #1            ;track how many consecutive frames
 3860 :                            ;this ball has been stuck in a
 3870 CMP      4,#2                ;collision and if 2 or more, try to
 3880 BLT      movencheck%         ;escape it via a bodge:
 3890 .bodge1%                     ;bodge begin ...
 3900 ADR      7, seed%
 3910 LDMIA    7, {6, 11}
 3920 MOVS     11, 11, LSR #1      ;generate random 32-bit number
 3930 MOVS     8, 6, RRX
 3940 ADC      11, 11, 11
 3950 EOR      8, 8, 6, LSL #12
 3960 EOR      6, 8, 8, LSR #20
 3970 STMIA    7, {6, 11}
 3980 LDR      7, asincos%         ;when balls get stuck
 3990 AND      6, 6, #255          ;due to conflict between correct
 4000 ADD      7, 7, 6, ASL #3     ;reflection & small velocity or
 4010 LDMIA    7, {6, 11}          ;jagged overlap problems ...
 4020 MUL      7, 2, 6
 4030 MLA      7, 3, 11, 7         ;try a 'fix' - rotate velocity by
 4040 MUL      8, 2, 11            ;a random angle, so eventually
 4050 MUL      9, 3, 6             ;should pick some velocity that
 4060 SUB      8, 8, 9             ;extricates ball from stuck position
 4070 MOV      2, 7, ASR #8
 4080 MOV      3, 8, ASR #8        ;... bodge end
 4090 CMP      4, #16
 4100 BLT      movencheck%
 4110 MOV      PC, 14
 4120 :
 4130 .asincos%          EQUD sincos%
 4140 .seed%   EQUD -1:EQUD -1
 4150 .patch1%                     ;a patch to deal with collision case
 4160 ADR      11, acollregs%      ;where no linear regression exists
 4170 LDMIA    11, {0-5,12,13,14}  ;(eg where collision involves only
 4180 SUB      2, 2, 2, ASL #8     ; one pixel)
 4190 SUB      3, 3, 3, ASL #8     ;- simply reverse velocity!
 4200 MOV      2, 2, ASR #8
 4210 MOV      3, 3, ASR #8        ;nb also attenuate by factor 255/256
 4220 ADD      4, 4, #1            ;(simulate energy loss on coll)
 4230 CMP      4,#2
 4240 BLT      movencheck%
 4250 B        bodge1%             ;if been stuck in collision for >= 2
 4260 :                            ;frames go and apply bodged 'escape'
 4270 .asqrt%  EQUD sqrt%
 4280 .alrcls% EQUD 0
 4290 .aspcls% EQUD 0
 4300 .copyback%                   ;simple routine to clear screen to
 4310 STR      14, alrcls%         ;background as rapidly as possible -
 4320 STR      13, aspcls%         ;note the heavy use of LDM/STM.
 4330 LDR      0, ascrst%
 4340 LDR      1, abackdata%
 4350 MOV      2, #200
 4360 .clsloop%
 4370 LDMIA    1!, {3-14}
 4380 STMIA    0!, {3-14}
 4390 LDMIA    1!, {3-14}
 4400 STMIA    0!, {3-14}
 4410 LDMIA    1!, {3-14}
 4420 STMIA    0!, {3-14}
 4430 LDMIA    1!, {3-14}
 4440 STMIA    0!, {3-14}
 4450 LDMIA    1!, {3-14}
 4460 STMIA    0!, {3-14}
 4470 LDMIA    1!, {3-14}
 4480 STMIA    0!, {3-14}
 4490 ]
 4500 IF VGA% THEN
 4510 [OPT pass%
 4520 ADD      0, 0, #hadd%-hpix%
 4530 ]
 4540 ENDIF
 4550 [OPT pass%
 4560 SUBS     2, 2, #1
 4570 BNE      clsloop%
 4580 LDR      13, aspcls%
 4590 LDR      PC, alrcls%
 4600 ]
 4610NEXT
 4620ENDPROC
 4630:
 4640DEF FNplotfrag(pass%)    :REM macro to plot a row (12 pixels)
 4650[OPT pass%               :REM of our sprite
 4660LDMIA    0, {4-6}             ;read 3 words of screen (12 pixels)
 4670LDMIA    1!, {7-9}            ;read 12 sprite pixels
 4680LDMIA    3!, {10-12}          ;& 12 masks
 4690BIC      4, 4, 10             ;apply mask to screen, zeroing
 4700BIC      5, 5, 11             ; those bits where will write
 4710BIC      6, 6, 12             ; sprite image in a moment
 4720ORR      4, 4, 7              ;write in the sprite image
 4730ORR      5, 5, 8
 4740ORR      6, 6, 9
 4750STMIA    0!, {4-6}            ;restore the data back to screen
 4760]
 4770=pass%
 4780:
 4790DEF FNcollfrag(pass%)    :REM macro to coll check a row
 4800[OPT pass%               :REM (12 pixels) of our sprite
 4810LDMIA    0!, {3-5}            ;read 3 words of screen (12 pixels)
 4820LDMIA    1!, {8-10}           ;read 12 sprite pixel masks
 4830TST      3, 8
 4840TSTEQ    4, 9
 4850TSTEQ    5, 10
 4860BNE      gotcoll%             ;branch to gotcoll% if any overlap
 4870]                        :REM  else continue with code after macro
 4880=pass%
 4890:
 4900DEF FNstatfrag(pass%, m%):REM macro to add in regression stats
 4910[OPT pass%               :REM for one pixel (coords u(i),v(i))
 4920TST       4, #m%
 4930BEQ       P%+8*4
 4940ADDNE     6, 6, #1            ; n = n + 1
 4950ADDNE     7, 7, 2             ; u = u + u(i)
 4960ADDNE     8, 8, 3             ; v = v + v(i)
 4970ADDNE     5, 2, 3
 4980SUBNE     14, 3, 2
 4990MLANE     9, 5, 14, 9         ; p = p + v(i)^2-u(i)^2
 5000MLANE     10, 2, 3, 10        ; q = q + u(i)*v(i)
 5010]
 5020=pass%
 5030:
 5040DEF FNdiv(pass%, ra, rb, rc, rd) :REM macro to set rc=raDIVrb
 5050[OPT pass%
 5060MOV       rd, rb
 5070CMP       rd, ra, LSR #1
 5080MOVLS     rd, rd, LSL #1
 5090CMP       rd, ra, LSR #1
 5100BLS       P%-2*4
 5110MOV       rc, #0
 5120CMP       ra, rd
 5130SUBCS     ra, ra, rd
 5140ADC       rc, rc, rc
 5150MOV       rd, rd, LSR #1
 5160CMP       rd, rb
 5170BHS       P%-5*4
 5180]
 5190=pass%

� >Balls
�
:
(=� NB program will produce a beep if animation speed falls
2 � below the target fps rate.
<targetfps% = 50
FA� 100�targetfps%<>0 � 1, "Require targetfps divides into 100"
P:
Zș &20280, 0, -1 � ;flags%
d$� flags% � 1 � arm3%=� � arm3%=�
n:
x2� � ș 6,112,1:ș 6,113,1:� �$;" at line ";�:�
�D% = �(-�)
�:
��
�0� "                    B A L L S   D E M O"'
�\� "� Program will beep if animation speed falls below the target of ";targetfps%;" fps."
�>� "� Pressing any key during demo will add one more ball."
�'� "� Press Escape to end program."'
�9� "Please input Standard (0) or VGA (1) display";VGA%
�� VGA%<>1 VGA%=0
�:
�
hpix%=288
�
vpix%=200
�� VGA% �

 mode%=99
 avpix%=400
 hadd%=hpix%*2
"
 lhadd%=6
,
 lhpix%=5
6�
@
 mode%=98
J avpix%=200
T hadd%=hpix%
^
 lhadd%=5
h
 lhpix%=5
r�
|:
�� balldata% 864*3
�Fș "OS_File", 255, "<Balls$Dir>.Resources.BallrData", balldata%, 0
�Jș "OS_File", 255, "<Balls$Dir>.Resources.BallgData", balldata%+864, 0
�Lș "OS_File", 255, "<Balls$Dir>.Resources.BallbData", balldata%+864*2, 0
�� backdata% 57656
�Dș "OS_File", 255, "<Balls$Dir>.Resources.BackSpr", backdata%, 0
�� middata% 57656
�Bș "OS_File", 255, "<Balls$Dir>.Resources.MidSpr", middata%, 0
�:
�� vblin% 8, vblout% 8
�!vblin%=148:vblin%!4=-1
�� mode%+128
�-ș "OS_ReadVduVariables", vblin%, vblout%
scrst2%=!vblout%
� mode%
-ș "OS_ReadVduVariables", vblin%, vblout%
&scrst1%=!vblout%
0�
::
D
maxn%=200
N� b% maxn%*24
X3� NB b% stores array (of size n%) of structure:
bM� {x coord, y coord, x increment, y increment, sticking count, ball type}
l:
v�ass
�:
�ș 6,112,1:ș 6,113,1
�n%=1
�!an%=n%
�:
�,� initialise ball locations & velocities
�� i% = 0 � n%*24-1 � 24
�  b%!(i%+0)  = 259*256
�  b%!(i%+4)  = 174*256
�  b%!(i%+8)  = �(64)-32
�#  b%!(i%+12) = -4*256+�(128)-64
�  b%!(i%+16) = 0
�  b%!(i%+20) = �(3)-1
�
:
� makeback%
 :
*�
4 � anim%
> � n%<maxn% �
H  i%=24*n%
R  b%!(i%+0)  = 259*256
\  b%!(i%+4)  = 174*256
f  b%!(i%+8)  = �(64)-32
p#  b%!(i%+12) = -4*256+�(128)-64
z  b%!(i%+16) = 0
�  b%!(i%+20) = �(3)-1
�  n%+=1
�
  !an%=n%
� �
�� �
�:
��
�:
�
� �ass
�-� code% 10240, sqrt% 257*4, sincos% 256*8
�� i%=0 � 256
�! sqrt%!(4*i%) = 0.5+�(256*i%)
��
� i%=0 � 255
- sincos%!(8*i%  ) = 0.5+256*�(2*�*i%/256)
- sincos%!(8*i%+4) = 0.5+256*�(2*�*i%/256)
$�
.scrst%=scrst1%
8� pass% = 0 � 2 � 2
B
 P%=code%
L [OPT pass%
V .aspframe%         EQUD 0
`, .ascrstsum%        EQUD scrst1%+scrst2%
j .an%     EQUD 0
t .ab%     EQUD b%
~D .atime%  EQUD 0              ;time storage for frame speed calc
�0 .afc%    EQUD 0              ;frame counter
� .anim%
� STMFD    13!, {14}
�: STR      13, aspframe%       ;store sp to free up r13
� .nextframe%
� :
�> SWI      "OS_ReadMonotonicTime"        ;track frame speed
� STR      0, atime%
� :
� MOV      0, #19
�; SWI      "OS_Byte"                     ;wait for vsync
� MOV      0, #113
 LDR      1, abank%

 RSB      3, 1, #3
 STR      3, abank%
= SWI      "OS_Byte"           ;swap displayed screen bank
( LDR      0, ascrstsum%
2 LDR      1, ascrst%
< SUB      1, 0, 1
F9 STR      1, ascrst%          ;swap ptr to other bank
P> BL       copyback%           ;cls that bank to background
Z :
d LDR      12, ab%
n LDR      13, an%
x6 .framemoveloop%              ;then move each ball
�8 LDMIA    12, {0,1,2,3,4,5}   ; read x,y,xi,yi,sc,bt
� BL       movencheck%
�; STMIA    12!, {0,1,2,3,4,5}  ; restore x,y,xi,yi,sc,bt
� SUBS     13, 13, #1
�4 BNE      framemoveloop%      ;then do next ball
� :
� LDR      12, ab%
� LDR      13, an%
�6 .frameplotloop%              ;now plot each ball:
�= LDMIA    12, {0,1}           ; read x,y coords from data
� LDR      2, [12, #20]
� MOV      0, 0, ASR #8
� MOV      1, 1, ASR #8
4 BL       plot%               ; plot ball at x,y
 ADD      12, 12, #24
 SUBS     13, 13, #1
"4 BNE      frameplotloop%      ;then do next ball
, LDR      11, afc%
6 ADD      11, 11, #1
@5 STR      11, afc%            ;update frame count
J :
T ]
^
 � VGA% �
h [OPT pass%
rD LDR      14, ascrst%         ;if in VGA mode, fill in the extra
|B ADD      13, 14, #hadd%-hpix%;blank lines by copying the line
�( MOV      12, #vpix%          ;above
� .interlacel1%
� LDMIA    14!, {0-11}
� STMIA    13!, {0-11}
� LDMIA    14!, {0-11}
� STMIA    13!, {0-11}
� LDMIA    14!, {0-11}
� STMIA    13!, {0-11}
� LDMIA    14!, {0-11}
� STMIA    13!, {0-11}
� LDMIA    14!, {0-11}
� STMIA    13!, {0-11}
� LDMIA    14!, {0-11}
 STMIA    13!, {0-11}
" ADD      13, 13, #hadd%-hpix%
" ADD      14, 14, #hadd%-hpix%
& SUBS     12, 12, #1
0 BNE      interlacel1%
: ]
D �
N [OPT pass%
X :
bB SWI      "OS_ReadMonotonicTime"        ;calculate frame speed
l LDR      1, atime%
v SUB      0, 0, 1
�  CMP      0, #100/targetfps%
�D SWIGT    256+7               ;beep if it falls below target fps
� :
� MOV      0, #129
� MOV      1, #0
� MOV      2, #0
� SWI      "OS_Byte"
� CMP      2, #&FF
�C BEQ      nextframe%          ;if no key pressed, do next frame
�- LDR      13, aspframe%       ;restore sp
�2 LDMFD    13!, {PC}           ;return to BASIC
� :
� .makeback%
 LDR      0, abackdata%
 LDR      1, amiddata%
 MOV      2, #vpix%*hpix%
  MOV      4, #255
* .makebackloop%
4 LDRB     3, [1]
> CMP      3, #0
H STRNEB   3, [0]
R STRNEB   4, [1]
\ ADD      1, 1, #1
f ADD      0, 0, #1
p SUBS     2, 2, #1
z BNE      makebackloop%
� MOVS     PC, 14
� :
� .ascrst% EQUD scrst%
� .adata%  EQUD balldata%
�) .abackdata%        EQUD backdata%+56
�( .amiddata%         EQUD middata%+56
� .abank%  EQUD 1
�, .aplotregs%        EQUD 0:EQUD 0:EQUD 0
�3 .plot%   ;plot our ball sprite at coords r0,r1
�>          ;where 0,0 is top left & 287,199 is bottom right
�8          ;NB sprite MUST lie entirely within screen
� ADR      11, aplotregs%
� STMIA    11, {12,13,14}
	B �      4, 0, #3            ;calc which of 4 sprite alignments
	E ADD      3, 4, 4, ASL #1     ;we need via (xAND3)*12*2*9 + data%
	 ADD      3, 3, 3, ASL #3
	$< BIC      0, 0, #3            ;round x down to mult of 3
	. ADD      1, 1, 1, ASL #3
	8 LDR      4, ascrst%
	B" ADD      4, 4, 1, ASL #lhadd%
	LB ADD      0, 4, 0             ;calc (screen ptr + hadd%*y + x)
	V LDR      1, adata%
	` RSB      4, 2, 2, ASL #5
	j SUB      4, 4, 2, ASL #2
	t ADD      1, 1, 4, ASL #5
	~D ADD      1, 1, 3, ASL #3     ;finally calc (xAND3)*12*2*9+data%
	� MOV      2, #3
	� ADD      3, 1, #12*9
	�2 .loop1%                      ;now plot sprite
	�. �plotfrag(pass%)            ;plot 1st row
	�D ADD      0, 0, #hadd%-12     ;move screen ptr to start next row
	� �plotfrag(pass%)
	� ADD      0, 0, #hadd%-12
	�. �plotfrag(pass%)            ;plot 3rd row
	� ADD      0, 0, #hadd%-12
	� SUBS     2, 2, #1
	�D BNE      loop1%          ;repeat above 3 times to do all 9 rows
	�D ADR      11, aplotregs%      ;plot completed - return to caller
8 LDMIA    11, {12,13,PC}      ;preserving r12 & r13.

 :
/ .acollregs%    EQUD 0:EQUD 0:EQUD 0:EQUD 0
6                EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0
(4 .movencheck%     ;move then collision check our
22                  ;ball sprite at coords r0,r1
<F                  ;where 0,0 is top left & 287,199 is bottom right
F@                  ;NB sprite MUST lie entirely within screen
P ADR      11, acollregs%
Z ADD      0, 0, 2
d ADD      1, 1, 3
n  STMIA    11, {0-5,12,13,14}
x MOV      0, 0, ASR #8
� MOV      1, 1, ASR #8
�B �      2, 0, #3            ;calc which of 4 sprite alignments
�E ADD      3, 2, 2, ASL #1     ;we need via (xAND3)*12*2*9 + data%
� ADD      3, 3, 3, ASL #3
�< BIC      0, 0, #3            ;round x down to mult of 3
� ADD      1, 1, 1, ASL #3
� LDR      2, amiddata%
�" ADD      2, 2, 1, ASL #lhpix%
�E ADD      0, 2, 0             ;calc (back mask ptr + hpix%*y + x)
� LDR      1, adata%
� RSB      2, 5, 5, ASL #5
� SUB      2, 2, 5, ASL #2
�B ADD      1, 1, 2, ASL #5     ;add in to data ptr 864*balltype
D ADD      1, 1, 3, ASL #3     ;finally calc (xAND3)*12*2*9+data%
 ADD      1, 1, #12*9
C ADR      2, colladdrbuf%     ;store back and sprite data addrs
"D STMIA    2, {0,1}            ;corresponding to top left of ball
, MOV      2, #3
63 .collloop1%                  ;now check sprite
@D �collfrag(pass%)            ;check 1st row (if coll B gotcoll%)
JB ADD      0, 0, #hpix%-12     ;move back ptr to start next row
T �collfrag(pass%)
^ ADD      0, 0, #hpix%-12
h/ �collfrag(pass%)            ;check 4th row
r ADD      0, 0, #hpix%-12
| SUBS     2, 2, #1
�D BNE      collloop1%      ;repeat above 3 times to do all 9 rows
� ADR      11, acollregs%
�  LDMIA    11, {0-5,12,13,14}
�= ADD      3, 3, #8            ; accelerate ball downwards
� MOV      4, #0
� MOV      PC, 14
�% .colladdrbuf%      EQUD 0:EQUD 0
� .gotcoll%
� ADR      11, acollregs%
� LDMIA    11, {0-3}
�C SUB      0, 0, 2             ;reset position, moving it out of
�, SUB      1, 1, 3             ;collision
� STMIA    11, {0,1}
9 MOV      6, #0               ;in my lin reg notes, n
9 MOV      7, #0                                   ; u
9 MOV      8, #0                                   ; v
&9 MOV      9, #0                                   ; p
09 MOV      10, #0                                  ; q
: ADR      2, colladdrbuf%
DC LDMIA    2, {0,1}            ;recall screen/data addrs for top
N1 MOV      3, #0     ;row 0    ;left of sprite
X .statloop1%
b MOV      2, #0     ;col 0
l .statloop2%
vF LDR      4, [0], #4          ;rescan each pixel in collision area
�F LDR      5, [1], #4          ;and for each collided pixel add its
�D �      4, 4, 5             ;coords (relative to topleft sprite)
�@ �statfrag(pass%, 255)       ;onto the regression statistics
� ADD      2, 2, #1
� �statfrag(pass%, 255<<8)
� ADD      2, 2, #1
� �statfrag(pass%, 255<<16)
� ADD      2, 2, #1
� �statfrag(pass%, 255<<24)
� ADD      2, 2, #1
� CMP      2, #12
� BLT      statloop2%
� ADD      0, 0, #hpix%-12

 ADD      3, 3, #1

 CMP      3, #9

? BLT      statloop1%          ;when done, n, u & v computed

  MUL      9, 6, 9

* ADD      5, 7, 8

4 SUB      14, 7, 8

>- MLA      9, 5, 14, 9         ;p computed

H MUL      10, 6, 10

R MUL      14, 7, 8

\ SUB      10, 10, 14

f- ADD      10, 10, 10          ;q computed

p MOVS     6, 9

z- RSBMI    6, 6, #0            ;ap = abs p

� MOVS     7, 10

�- RSBMI    7, 7, #0            ;aq = abs q

� CMP      6, 7

� MOV      8, 6

�3 MOVLT    8, 7                ; m = max {ap,aq}

�? CMP      8, #0               ;if have degenerate collision

�E BEQ      patch1%             ;(eg with single pixel), can't calc

�E .statloop3%                  ;a linear regression, so go patch1%

�D CMP      8, #1<<12           ;which simply reverses velocities!

� MOVGE    8, 8, ASR #1

�F MOVGE    6, 6, ASR #1        ;proportionately reduce ap and aq in

�F MOVGE    7, 7, ASR #1        ;magnitude, until in necessary range

� BGE      statloop3%
4 MUL      11, 6, 6            ;ap^2 in low range
4 MUL      12, 7, 7            ;aq^2 in low range
4 ADD      13, 11, 12          ;divisor ap^2+aq^2
$ MOV      0, 11, ASL #8
.A �div(pass%, 0, 13, 11, 1)   ;t  in r11 = 256ap^2/(ap^2+aq^2)
8 MOV      0, 12, ASL #8
BA �div(pass%, 0, 13, 12, 1)   ;tb in r12 = 256aq^2/(ap^2+aq^2)
L LDR      13, asqrt%
V0 LDR      7, [13, 11, LSL #2] ;square root t
`< LDR      8, [13, 12, LSL #2] ;and tb, via look-up-table
j CMP      9, #0
t1 RSBLT    7, 7, #0            ;final t  in r7
~ CMP      10, #0
�1 RSBPL    8, 8, #0            ;final tb in r8
� ADR      11, acollregs%
�  LDMIA    11, {0-5,12,13,14}
�9 MUL      11, 7, 2            ;now modify velocity by
�7 MLA      11, 8, 3, 11        ;reflecting it in the
�? RSB      11, 11, #0          ;line generated by the linear
�9 MUL      6, 7, 3             ;regression calculation
�C MUL      9, 8, 2             ;(which we use to approximate the
�E SUB      6, 6, 9             ; tangent at the collision surface)
�  RSB      11, 11, 11, ASL #8
�E RSB      6, 6, 6, ASL #8     ;& then attenuate by factor 255/256
�A MOV      2, 11, ASR #16      ;(simulate energy loss on coll)
 MOV      3, 6, ASR #16

D ADD      4, 4, #1            ;track how many consecutive frames
@ :                            ;this ball has been stuck in a
E CMP      4,#2                ;collision and if 2 or more, try to
(9 BLT      movencheck%         ;escape it via a bodge:
22 .bodge1%                     ;bodge begin ...
< ADR      7, seed%
F LDMIA    7, {6, 11}
P@ MOVS     11, 11, LSR #1      ;generate random 32-bit number
Z MOVS     8, 6, RRX
d ADC      11, 11, 11
n �      8, 8, 6, LSL #12
x �      6, 8, 8, LSR #20
� STMIA    7, {6, 11}
�7 LDR      7, asincos%         ;when balls get stuck
�@ �      6, 6, #255          ;due to conflict between correct
�A ADD      7, 7, 6, ASL #3     ;reflection & small velocity or
�> LDMIA    7, {6, 11}          ;jagged overlap problems ...
� MUL      7, 2, 6
�C MLA      7, 3, 11, 7         ;try a 'fix' - rotate velocity by
�@ MUL      8, 2, 11            ;a random angle, so eventually
�A MUL      9, 3, 6             ;should pick some velocity that
�F SUB      8, 8, 9             ;extricates ball from stuck position
� MOV      2, 7, ASR #8
�0 MOV      3, 8, ASR #8        ;... bodge end
� CMP      4, #16
 BLT      movencheck%
 MOV      PC, 14
 :
"$ .asincos%          EQUD sincos%
, .seed%   EQUD -1:EQUD -1
6F .patch1%                     ;a patch to deal with collision case
@D ADR      11, acollregs%      ;where no linear regression exists
JD LDMIA    11, {0-5,12,13,14}  ;(eg where collision involves only
T. SUB      2, 2, 2, ASL #8     ; one pixel)
^= SUB      3, 3, 3, ASL #8     ;- simply reverse velocity!
h MOV      2, 2, ASR #8
rF MOV      3, 3, ASR #8        ;nb also attenuate by factor 255/256
|A ADD      4, 4, #1            ;(simulate energy loss on coll)
� CMP      4,#2
� BLT      movencheck%
�F B        bodge1%             ;if been stuck in collision for >= 2
�F :                            ;frames go and apply bodged 'escape'
� .asqrt%  EQUD sqrt%
� .alrcls% EQUD 0
� .aspcls% EQUD 0
�D .copyback%                   ;simple routine to clear screen to
�F STR      14, alrcls%         ;background as rapidly as possible -
�A STR      13, aspcls%         ;note the heavy use of LDM/STM.
� LDR      0, ascrst%
� LDR      1, abackdata%
� MOV      2, #200
 .clsloop%
 LDMIA    1!, {3-14}
 STMIA    0!, {3-14}
& LDMIA    1!, {3-14}
0 STMIA    0!, {3-14}
: LDMIA    1!, {3-14}
D STMIA    0!, {3-14}
N LDMIA    1!, {3-14}
X STMIA    0!, {3-14}
b LDMIA    1!, {3-14}
l STMIA    0!, {3-14}
v LDMIA    1!, {3-14}
� STMIA    0!, {3-14}
� ]
�
 � VGA% �
� [OPT pass%
�  ADD      0, 0, #hadd%-hpix%
� ]
� �
� [OPT pass%
� SUBS     2, 2, #1
� BNE      clsloop%
� LDR      13, aspcls%
� LDR      PC, alrcls%
� ]
�
�
:
 <� �plotfrag(pass%)    :� macro to plot a row (12 pixels)
*-[OPT pass%               :� of our sprite
4ELDMIA    0, {4-6}             ;read 3 words of screen (12 pixels)
>8LDMIA    1!, {7-9}            ;read 12 sprite pixels
H-LDMIA    3!, {10-12}          ;& 12 masks
R@BIC      4, 4, 10             ;apply mask to screen, zeroing
\?BIC      5, 5, 11             ; those bits where will write
f<BIC      6, 6, 12             ; sprite image in a moment
p;�R      4, 4, 7              ;write in the sprite image
z�R      5, 5, 8
��R      6, 6, 9
�BSTMIA    0!, {4-6}            ;restore the data back to screen
�]
�
=pass%
�:
�6� �collfrag(pass%)    :� macro to coll check a row
�9[OPT pass%               :� (12 pixels) of our sprite
�ELDMIA    0!, {3-5}            ;read 3 words of screen (12 pixels)
�=LDMIA    1!, {8-10}           ;read 12 sprite pixel masks
�TST      3, 8
�TSTEQ    4, 9
�TSTEQ    5, 10
�DBNE      gotcoll%             ;branch to gotcoll% if any overlap
D]                        :�  else continue with code after macro

=pass%
:
$=� �statfrag(pass%, m%):� macro to add in regression stats
.@[OPT pass%               :� for one pixel (coords u(i),v(i))
8TST       4, #m%
BBEQ       P%+8*4
L-ADDNE     6, 6, #1            ; n = n + 1
V0ADDNE     7, 7, 2             ; u = u + u(i)
`0ADDNE     8, 8, 3             ; v = v + v(i)
jADDNE     5, 2, 3
tSUBNE     14, 3, 2
~9MLANE     9, 5, 14, 9         ; p = p + v(i)^2-u(i)^2
�5MLANE     10, 2, 3, 10        ; q = q + u(i)*v(i)
�]
�
=pass%
�:
�<� �div(pass%, ra, rb, rc, rd) :� macro to set rc=raDIVrb
�[OPT pass%
�MOV       rd, rb
�CMP       rd, ra, LSR #1
�MOVLS     rd, rd, LSL #1
�CMP       rd, ra, LSR #1
�BLS       P%-2*4
�MOV       rc, #0
CMP       ra, rd

SUBCS     ra, ra, rd
ADC       rc, rc, rc
MOV       rd, rd, LSR #1
(CMP       rd, rb
2BHS       P%-5*4
<]
F
=pass%
�
00000000  0d 00 0a 0c f4 20 3e 42  61 6c 6c 73 0d 00 14 05  |..... >Balls....|
00000010  f4 0d 00 1e 05 3a 0d 00  28 3d f4 20 4e 42 20 70  |.....:..(=. NB p|
00000020  72 6f 67 72 61 6d 20 77  69 6c 6c 20 70 72 6f 64  |rogram will prod|
00000030  75 63 65 20 61 20 62 65  65 70 20 69 66 20 61 6e  |uce a beep if an|
00000040  69 6d 61 74 69 6f 6e 20  73 70 65 65 64 20 66 61  |imation speed fa|
00000050  6c 6c 73 0d 00 32 20 f4  20 62 65 6c 6f 77 20 74  |lls..2 . below t|
00000060  68 65 20 74 61 72 67 65  74 20 66 70 73 20 72 61  |he target fps ra|
00000070  74 65 2e 0d 00 3c 13 74  61 72 67 65 74 66 70 73  |te...<.targetfps|
00000080  25 20 3d 20 35 30 0d 00  46 41 e7 20 31 30 30 83  |% = 50..FA. 100.|
00000090  74 61 72 67 65 74 66 70  73 25 3c 3e 30 20 85 20  |targetfps%<>0 . |
000000a0  31 2c 20 22 52 65 71 75  69 72 65 20 74 61 72 67  |1, "Require targ|
000000b0  65 74 66 70 73 20 64 69  76 69 64 65 73 20 69 6e  |etfps divides in|
000000c0  74 6f 20 31 30 30 22 0d  00 50 05 3a 0d 00 5a 1e  |to 100"..P.:..Z.|
000000d0  c8 99 20 26 32 30 32 38  30 2c 20 30 2c 20 2d 31  |.. &20280, 0, -1|
000000e0  20 b8 20 3b 66 6c 61 67  73 25 0d 00 64 24 e7 20  | . ;flags%..d$. |
000000f0  66 6c 61 67 73 25 20 80  20 31 20 8c 20 61 72 6d  |flags% . 1 . arm|
00000100  33 25 3d a3 20 8b 20 61  72 6d 33 25 3d b9 0d 00  |3%=. . arm3%=...|
00000110  6e 05 3a 0d 00 78 32 ee  20 85 20 c8 99 20 36 2c  |n.:..x2. . .. 6,|
00000120  31 31 32 2c 31 3a c8 99  20 36 2c 31 31 33 2c 31  |112,1:.. 6,113,1|
00000130  3a f1 20 f6 24 3b 22 20  61 74 20 6c 69 6e 65 20  |:. .$;" at line |
00000140  22 3b 9e 3a e0 0d 00 82  0e 44 25 20 3d 20 b3 28  |";.:.....D% = .(|
00000150  2d 91 29 0d 00 8c 05 3a  0d 00 96 05 db 0d 00 a0  |-.)....:........|
00000160  30 f1 20 22 20 20 20 20  20 20 20 20 20 20 20 20  |0. "            |
00000170  20 20 20 20 20 20 20 20  42 20 41 20 4c 20 4c 20  |        B A L L |
00000180  53 20 20 20 44 20 45 20  4d 20 4f 22 27 0d 00 aa  |S   D E M O"'...|
00000190  5c f1 20 22 8f 20 50 72  6f 67 72 61 6d 20 77 69  |\. ". Program wi|
000001a0  6c 6c 20 62 65 65 70 20  69 66 20 61 6e 69 6d 61  |ll beep if anima|
000001b0  74 69 6f 6e 20 73 70 65  65 64 20 66 61 6c 6c 73  |tion speed falls|
000001c0  20 62 65 6c 6f 77 20 74  68 65 20 74 61 72 67 65  | below the targe|
000001d0  74 20 6f 66 20 22 3b 74  61 72 67 65 74 66 70 73  |t of ";targetfps|
000001e0  25 3b 22 20 66 70 73 2e  22 0d 00 b4 3e f1 20 22  |%;" fps."...>. "|
000001f0  8f 20 50 72 65 73 73 69  6e 67 20 61 6e 79 20 6b  |. Pressing any k|
00000200  65 79 20 64 75 72 69 6e  67 20 64 65 6d 6f 20 77  |ey during demo w|
00000210  69 6c 6c 20 61 64 64 20  6f 6e 65 20 6d 6f 72 65  |ill add one more|
00000220  20 62 61 6c 6c 2e 22 0d  00 be 27 f1 20 22 8f 20  | ball."...'. ". |
00000230  50 72 65 73 73 20 45 73  63 61 70 65 20 74 6f 20  |Press Escape to |
00000240  65 6e 64 20 70 72 6f 67  72 61 6d 2e 22 27 0d 00  |end program."'..|
00000250  c8 39 e8 20 22 50 6c 65  61 73 65 20 69 6e 70 75  |.9. "Please inpu|
00000260  74 20 53 74 61 6e 64 61  72 64 20 28 30 29 20 6f  |t Standard (0) o|
00000270  72 20 56 47 41 20 28 31  29 20 64 69 73 70 6c 61  |r VGA (1) displa|
00000280  79 22 3b 56 47 41 25 0d  00 d2 14 e7 20 56 47 41  |y";VGA%..... VGA|
00000290  25 3c 3e 31 20 56 47 41  25 3d 30 0d 00 dc 05 3a  |%<>1 VGA%=0....:|
000002a0  0d 00 e6 0d 68 70 69 78  25 3d 32 38 38 0d 00 f0  |....hpix%=288...|
000002b0  0d 76 70 69 78 25 3d 32  30 30 0d 00 fa 0c e7 20  |.vpix%=200..... |
000002c0  56 47 41 25 20 8c 0d 01  04 0d 20 6d 6f 64 65 25  |VGA% ..... mode%|
000002d0  3d 39 39 0d 01 0e 0f 20  61 76 70 69 78 25 3d 34  |=99.... avpix%=4|
000002e0  30 30 0d 01 18 12 20 68  61 64 64 25 3d 68 70 69  |00.... hadd%=hpi|
000002f0  78 25 2a 32 0d 01 22 0d  20 6c 68 61 64 64 25 3d  |x%*2..". lhadd%=|
00000300  36 0d 01 2c 0d 20 6c 68  70 69 78 25 3d 35 0d 01  |6..,. lhpix%=5..|
00000310  36 05 cc 0d 01 40 0d 20  6d 6f 64 65 25 3d 39 38  |6....@. mode%=98|
00000320  0d 01 4a 0f 20 61 76 70  69 78 25 3d 32 30 30 0d  |..J. avpix%=200.|
00000330  01 54 10 20 68 61 64 64  25 3d 68 70 69 78 25 0d  |.T. hadd%=hpix%.|
00000340  01 5e 0d 20 6c 68 61 64  64 25 3d 35 0d 01 68 0d  |.^. lhadd%=5..h.|
00000350  20 6c 68 70 69 78 25 3d  35 0d 01 72 05 cd 0d 01  | lhpix%=5..r....|
00000360  7c 05 3a 0d 01 86 15 de  20 62 61 6c 6c 64 61 74  ||.:..... balldat|
00000370  61 25 20 38 36 34 2a 33  0d 01 90 46 c8 99 20 22  |a% 864*3...F.. "|
00000380  4f 53 5f 46 69 6c 65 22  2c 20 32 35 35 2c 20 22  |OS_File", 255, "|
00000390  3c 42 61 6c 6c 73 24 44  69 72 3e 2e 52 65 73 6f  |<Balls$Dir>.Reso|
000003a0  75 72 63 65 73 2e 42 61  6c 6c 72 44 61 74 61 22  |urces.BallrData"|
000003b0  2c 20 62 61 6c 6c 64 61  74 61 25 2c 20 30 0d 01  |, balldata%, 0..|
000003c0  9a 4a c8 99 20 22 4f 53  5f 46 69 6c 65 22 2c 20  |.J.. "OS_File", |
000003d0  32 35 35 2c 20 22 3c 42  61 6c 6c 73 24 44 69 72  |255, "<Balls$Dir|
000003e0  3e 2e 52 65 73 6f 75 72  63 65 73 2e 42 61 6c 6c  |>.Resources.Ball|
000003f0  67 44 61 74 61 22 2c 20  62 61 6c 6c 64 61 74 61  |gData", balldata|
00000400  25 2b 38 36 34 2c 20 30  0d 01 a4 4c c8 99 20 22  |%+864, 0...L.. "|
00000410  4f 53 5f 46 69 6c 65 22  2c 20 32 35 35 2c 20 22  |OS_File", 255, "|
00000420  3c 42 61 6c 6c 73 24 44  69 72 3e 2e 52 65 73 6f  |<Balls$Dir>.Reso|
00000430  75 72 63 65 73 2e 42 61  6c 6c 62 44 61 74 61 22  |urces.BallbData"|
00000440  2c 20 62 61 6c 6c 64 61  74 61 25 2b 38 36 34 2a  |, balldata%+864*|
00000450  32 2c 20 30 0d 01 ae 15  de 20 62 61 63 6b 64 61  |2, 0..... backda|
00000460  74 61 25 20 35 37 36 35  36 0d 01 b8 44 c8 99 20  |ta% 57656...D.. |
00000470  22 4f 53 5f 46 69 6c 65  22 2c 20 32 35 35 2c 20  |"OS_File", 255, |
00000480  22 3c 42 61 6c 6c 73 24  44 69 72 3e 2e 52 65 73  |"<Balls$Dir>.Res|
00000490  6f 75 72 63 65 73 2e 42  61 63 6b 53 70 72 22 2c  |ources.BackSpr",|
000004a0  20 62 61 63 6b 64 61 74  61 25 2c 20 30 0d 01 c2  | backdata%, 0...|
000004b0  14 de 20 6d 69 64 64 61  74 61 25 20 35 37 36 35  |.. middata% 5765|
000004c0  36 0d 01 cc 42 c8 99 20  22 4f 53 5f 46 69 6c 65  |6...B.. "OS_File|
000004d0  22 2c 20 32 35 35 2c 20  22 3c 42 61 6c 6c 73 24  |", 255, "<Balls$|
000004e0  44 69 72 3e 2e 52 65 73  6f 75 72 63 65 73 2e 4d  |Dir>.Resources.M|
000004f0  69 64 53 70 72 22 2c 20  6d 69 64 64 61 74 61 25  |idSpr", middata%|
00000500  2c 20 30 0d 01 d6 05 3a  0d 01 e0 19 de 20 76 62  |, 0....:..... vb|
00000510  6c 69 6e 25 20 38 2c 20  76 62 6c 6f 75 74 25 20  |lin% 8, vblout% |
00000520  38 0d 01 ea 1b 21 76 62  6c 69 6e 25 3d 31 34 38  |8....!vblin%=148|
00000530  3a 76 62 6c 69 6e 25 21  34 3d 2d 31 0d 01 f4 0f  |:vblin%!4=-1....|
00000540  eb 20 6d 6f 64 65 25 2b  31 32 38 0d 01 fe 2d c8  |. mode%+128...-.|
00000550  99 20 22 4f 53 5f 52 65  61 64 56 64 75 56 61 72  |. "OS_ReadVduVar|
00000560  69 61 62 6c 65 73 22 2c  20 76 62 6c 69 6e 25 2c  |iables", vblin%,|
00000570  20 76 62 6c 6f 75 74 25  0d 02 08 14 73 63 72 73  | vblout%....scrs|
00000580  74 32 25 3d 21 76 62 6c  6f 75 74 25 0d 02 12 0b  |t2%=!vblout%....|
00000590  eb 20 6d 6f 64 65 25 0d  02 1c 2d c8 99 20 22 4f  |. mode%...-.. "O|
000005a0  53 5f 52 65 61 64 56 64  75 56 61 72 69 61 62 6c  |S_ReadVduVariabl|
000005b0  65 73 22 2c 20 76 62 6c  69 6e 25 2c 20 76 62 6c  |es", vblin%, vbl|
000005c0  6f 75 74 25 0d 02 26 14  73 63 72 73 74 31 25 3d  |out%..&.scrst1%=|
000005d0  21 76 62 6c 6f 75 74 25  0d 02 30 05 87 0d 02 3a  |!vblout%..0....:|
000005e0  05 3a 0d 02 44 0d 6d 61  78 6e 25 3d 32 30 30 0d  |.:..D.maxn%=200.|
000005f0  02 4e 11 de 20 62 25 20  6d 61 78 6e 25 2a 32 34  |.N.. b% maxn%*24|
00000600  0d 02 58 33 f4 20 4e 42  20 62 25 20 73 74 6f 72  |..X3. NB b% stor|
00000610  65 73 20 61 72 72 61 79  20 28 6f 66 20 73 69 7a  |es array (of siz|
00000620  65 20 6e 25 29 20 6f 66  20 73 74 72 75 63 74 75  |e n%) of structu|
00000630  72 65 3a 0d 02 62 4d f4  20 7b 78 20 63 6f 6f 72  |re:..bM. {x coor|
00000640  64 2c 20 79 20 63 6f 6f  72 64 2c 20 78 20 69 6e  |d, y coord, x in|
00000650  63 72 65 6d 65 6e 74 2c  20 79 20 69 6e 63 72 65  |crement, y incre|
00000660  6d 65 6e 74 2c 20 73 74  69 63 6b 69 6e 67 20 63  |ment, sticking c|
00000670  6f 75 6e 74 2c 20 62 61  6c 6c 20 74 79 70 65 7d  |ount, ball type}|
00000680  0d 02 6c 05 3a 0d 02 76  08 f2 61 73 73 0d 02 80  |..l.:..v..ass...|
00000690  05 3a 0d 02 8a 19 c8 99  20 36 2c 31 31 32 2c 31  |.:...... 6,112,1|
000006a0  3a c8 99 20 36 2c 31 31  33 2c 31 0d 02 94 08 6e  |:.. 6,113,1....n|
000006b0  25 3d 31 0d 02 9e 0b 21  61 6e 25 3d 6e 25 0d 02  |%=1....!an%=n%..|
000006c0  a8 05 3a 0d 02 b2 2c f4  20 69 6e 69 74 69 61 6c  |..:...,. initial|
000006d0  69 73 65 20 62 61 6c 6c  20 6c 6f 63 61 74 69 6f  |ise ball locatio|
000006e0  6e 73 20 26 20 76 65 6c  6f 63 69 74 69 65 73 0d  |ns & velocities.|
000006f0  02 bc 1b e3 20 69 25 20  3d 20 30 20 b8 20 6e 25  |.... i% = 0 . n%|
00000700  2a 32 34 2d 31 20 88 20  32 34 0d 02 c6 1a 20 20  |*24-1 . 24....  |
00000710  62 25 21 28 69 25 2b 30  29 20 20 3d 20 32 35 39  |b%!(i%+0)  = 259|
00000720  2a 32 35 36 0d 02 d0 1a  20 20 62 25 21 28 69 25  |*256....  b%!(i%|
00000730  2b 34 29 20 20 3d 20 31  37 34 2a 32 35 36 0d 02  |+4)  = 174*256..|
00000740  da 1b 20 20 62 25 21 28  69 25 2b 38 29 20 20 3d  |..  b%!(i%+8)  =|
00000750  20 b3 28 36 34 29 2d 33  32 0d 02 e4 23 20 20 62  | .(64)-32...#  b|
00000760  25 21 28 69 25 2b 31 32  29 20 3d 20 2d 34 2a 32  |%!(i%+12) = -4*2|
00000770  35 36 2b b3 28 31 32 38  29 2d 36 34 0d 02 ee 14  |56+.(128)-64....|
00000780  20 20 62 25 21 28 69 25  2b 31 36 29 20 3d 20 30  |  b%!(i%+16) = 0|
00000790  0d 02 f8 19 20 20 62 25  21 28 69 25 2b 32 30 29  |....  b%!(i%+20)|
000007a0  20 3d 20 b3 28 33 29 2d  31 0d 03 02 05 ed 0d 03  | = .(3)-1.......|
000007b0  0c 05 3a 0d 03 16 0f d6  20 6d 61 6b 65 62 61 63  |..:..... makebac|
000007c0  6b 25 0d 03 20 05 3a 0d  03 2a 05 f5 0d 03 34 0c  |k%.. .:..*....4.|
000007d0  20 d6 20 61 6e 69 6d 25  0d 03 3e 11 20 e7 20 6e  | . anim%..>. . n|
000007e0  25 3c 6d 61 78 6e 25 20  8c 0d 03 48 0e 20 20 69  |%<maxn% ...H.  i|
000007f0  25 3d 32 34 2a 6e 25 0d  03 52 1a 20 20 62 25 21  |%=24*n%..R.  b%!|
00000800  28 69 25 2b 30 29 20 20  3d 20 32 35 39 2a 32 35  |(i%+0)  = 259*25|
00000810  36 0d 03 5c 1a 20 20 62  25 21 28 69 25 2b 34 29  |6..\.  b%!(i%+4)|
00000820  20 20 3d 20 31 37 34 2a  32 35 36 0d 03 66 1b 20  |  = 174*256..f. |
00000830  20 62 25 21 28 69 25 2b  38 29 20 20 3d 20 b3 28  | b%!(i%+8)  = .(|
00000840  36 34 29 2d 33 32 0d 03  70 23 20 20 62 25 21 28  |64)-32..p#  b%!(|
00000850  69 25 2b 31 32 29 20 3d  20 2d 34 2a 32 35 36 2b  |i%+12) = -4*256+|
00000860  b3 28 31 32 38 29 2d 36  34 0d 03 7a 14 20 20 62  |.(128)-64..z.  b|
00000870  25 21 28 69 25 2b 31 36  29 20 3d 20 30 0d 03 84  |%!(i%+16) = 0...|
00000880  19 20 20 62 25 21 28 69  25 2b 32 30 29 20 3d 20  |.  b%!(i%+20) = |
00000890  b3 28 33 29 2d 31 0d 03  8e 0b 20 20 6e 25 2b 3d  |.(3)-1....  n%+=|
000008a0  31 0d 03 98 0d 20 20 21  61 6e 25 3d 6e 25 0d 03  |1....  !an%=n%..|
000008b0  a2 06 20 cd 0d 03 ac 07  fd 20 a3 0d 03 b6 05 3a  |.. ...... .....:|
000008c0  0d 03 c0 05 e0 0d 03 ca  05 3a 0d 03 d4 0a dd 20  |.........:..... |
000008d0  f2 61 73 73 0d 03 de 2d  de 20 63 6f 64 65 25 20  |.ass...-. code% |
000008e0  31 30 32 34 30 2c 20 73  71 72 74 25 20 32 35 37  |10240, sqrt% 257|
000008f0  2a 34 2c 20 73 69 6e 63  6f 73 25 20 32 35 36 2a  |*4, sincos% 256*|
00000900  38 0d 03 e8 10 e3 20 69  25 3d 30 20 b8 20 32 35  |8..... i%=0 . 25|
00000910  36 0d 03 f2 21 20 73 71  72 74 25 21 28 34 2a 69  |6...! sqrt%!(4*i|
00000920  25 29 20 3d 20 30 2e 35  2b b6 28 32 35 36 2a 69  |%) = 0.5+.(256*i|
00000930  25 29 0d 03 fc 05 ed 0d  04 06 10 e3 20 69 25 3d  |%).......... i%=|
00000940  30 20 b8 20 32 35 35 0d  04 10 2d 20 73 69 6e 63  |0 . 255...- sinc|
00000950  6f 73 25 21 28 38 2a 69  25 20 20 29 20 3d 20 30  |os%!(8*i%  ) = 0|
00000960  2e 35 2b 32 35 36 2a b5  28 32 2a af 2a 69 25 2f  |.5+256*.(2*.*i%/|
00000970  32 35 36 29 0d 04 1a 2d  20 73 69 6e 63 6f 73 25  |256)...- sincos%|
00000980  21 28 38 2a 69 25 2b 34  29 20 3d 20 30 2e 35 2b  |!(8*i%+4) = 0.5+|
00000990  32 35 36 2a 9b 28 32 2a  af 2a 69 25 2f 32 35 36  |256*.(2*.*i%/256|
000009a0  29 0d 04 24 05 ed 0d 04  2e 12 73 63 72 73 74 25  |)..$......scrst%|
000009b0  3d 73 63 72 73 74 31 25  0d 04 38 17 e3 20 70 61  |=scrst1%..8.. pa|
000009c0  73 73 25 20 3d 20 30 20  b8 20 32 20 88 20 32 0d  |ss% = 0 . 2 . 2.|
000009d0  04 42 0d 20 50 25 3d 63  6f 64 65 25 0d 04 4c 0f  |.B. P%=code%..L.|
000009e0  20 5b 4f 50 54 20 70 61  73 73 25 0d 04 56 1e 20  | [OPT pass%..V. |
000009f0  2e 61 73 70 66 72 61 6d  65 25 20 20 20 20 20 20  |.aspframe%      |
00000a00  20 20 20 45 51 55 44 20  30 0d 04 60 2c 20 2e 61  |   EQUD 0..`, .a|
00000a10  73 63 72 73 74 73 75 6d  25 20 20 20 20 20 20 20  |scrstsum%       |
00000a20  20 45 51 55 44 20 73 63  72 73 74 31 25 2b 73 63  | EQUD scrst1%+sc|
00000a30  72 73 74 32 25 0d 04 6a  14 20 2e 61 6e 25 20 20  |rst2%..j. .an%  |
00000a40  20 20 20 45 51 55 44 20  30 0d 04 74 15 20 2e 61  |   EQUD 0..t. .a|
00000a50  62 25 20 20 20 20 20 45  51 55 44 20 62 25 0d 04  |b%     EQUD b%..|
00000a60  7e 44 20 2e 61 74 69 6d  65 25 20 20 45 51 55 44  |~D .atime%  EQUD|
00000a70  20 30 20 20 20 20 20 20  20 20 20 20 20 20 20 20  | 0              |
00000a80  3b 74 69 6d 65 20 73 74  6f 72 61 67 65 20 66 6f  |;time storage fo|
00000a90  72 20 66 72 61 6d 65 20  73 70 65 65 64 20 63 61  |r frame speed ca|
00000aa0  6c 63 0d 04 88 30 20 2e  61 66 63 25 20 20 20 20  |lc...0 .afc%    |
00000ab0  45 51 55 44 20 30 20 20  20 20 20 20 20 20 20 20  |EQUD 0          |
00000ac0  20 20 20 20 3b 66 72 61  6d 65 20 63 6f 75 6e 74  |    ;frame count|
00000ad0  65 72 0d 04 92 0b 20 2e  61 6e 69 6d 25 0d 04 9c  |er.... .anim%...|
00000ae0  17 20 53 54 4d 46 44 20  20 20 20 31 33 21 2c 20  |. STMFD    13!, |
00000af0  7b 31 34 7d 0d 04 a6 3a  20 53 54 52 20 20 20 20  |{14}...: STR    |
00000b00  20 20 31 33 2c 20 61 73  70 66 72 61 6d 65 25 20  |  13, aspframe% |
00000b10  20 20 20 20 20 20 3b 73  74 6f 72 65 20 73 70 20  |      ;store sp |
00000b20  74 6f 20 66 72 65 65 20  75 70 20 72 31 33 0d 04  |to free up r13..|
00000b30  b0 10 20 2e 6e 65 78 74  66 72 61 6d 65 25 0d 04  |.. .nextframe%..|
00000b40  ba 06 20 3a 0d 04 c4 3e  20 53 57 49 20 20 20 20  |.. :...> SWI    |
00000b50  20 20 22 4f 53 5f 52 65  61 64 4d 6f 6e 6f 74 6f  |  "OS_ReadMonoto|
00000b60  6e 69 63 54 69 6d 65 22  20 20 20 20 20 20 20 20  |nicTime"        |
00000b70  3b 74 72 61 63 6b 20 66  72 61 6d 65 20 73 70 65  |;track frame spe|
00000b80  65 64 0d 04 ce 17 20 53  54 52 20 20 20 20 20 20  |ed.... STR      |
00000b90  30 2c 20 61 74 69 6d 65  25 0d 04 d8 06 20 3a 0d  |0, atime%.... :.|
00000ba0  04 e2 14 20 4d 4f 56 20  20 20 20 20 20 30 2c 20  |... MOV      0, |
00000bb0  23 31 39 0d 04 ec 3b 20  53 57 49 20 20 20 20 20  |#19...; SWI     |
00000bc0  20 22 4f 53 5f 42 79 74  65 22 20 20 20 20 20 20  | "OS_Byte"      |
00000bd0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00000be0  77 61 69 74 20 66 6f 72  20 76 73 79 6e 63 0d 04  |wait for vsync..|
00000bf0  f6 15 20 4d 4f 56 20 20  20 20 20 20 30 2c 20 23  |.. MOV      0, #|
00000c00  31 31 33 0d 05 00 17 20  4c 44 52 20 20 20 20 20  |113.... LDR     |
00000c10  20 31 2c 20 61 62 61 6e  6b 25 0d 05 0a 16 20 52  | 1, abank%.... R|
00000c20  53 42 20 20 20 20 20 20  33 2c 20 31 2c 20 23 33  |SB      3, 1, #3|
00000c30  0d 05 14 17 20 53 54 52  20 20 20 20 20 20 33 2c  |.... STR      3,|
00000c40  20 61 62 61 6e 6b 25 0d  05 1e 3d 20 53 57 49 20  | abank%...= SWI |
00000c50  20 20 20 20 20 22 4f 53  5f 42 79 74 65 22 20 20  |     "OS_Byte"  |
00000c60  20 20 20 20 20 20 20 20  20 3b 73 77 61 70 20 64  |         ;swap d|
00000c70  69 73 70 6c 61 79 65 64  20 73 63 72 65 65 6e 20  |isplayed screen |
00000c80  62 61 6e 6b 0d 05 28 1b  20 4c 44 52 20 20 20 20  |bank..(. LDR    |
00000c90  20 20 30 2c 20 61 73 63  72 73 74 73 75 6d 25 0d  |  0, ascrstsum%.|
00000ca0  05 32 18 20 4c 44 52 20  20 20 20 20 20 31 2c 20  |.2. LDR      1, |
00000cb0  61 73 63 72 73 74 25 0d  05 3c 15 20 53 55 42 20  |ascrst%..<. SUB |
00000cc0  20 20 20 20 20 31 2c 20  30 2c 20 31 0d 05 46 39  |     1, 0, 1..F9|
00000cd0  20 53 54 52 20 20 20 20  20 20 31 2c 20 61 73 63  | STR      1, asc|
00000ce0  72 73 74 25 20 20 20 20  20 20 20 20 20 20 3b 73  |rst%          ;s|
00000cf0  77 61 70 20 70 74 72 20  74 6f 20 6f 74 68 65 72  |wap ptr to other|
00000d00  20 62 61 6e 6b 0d 05 50  3e 20 42 4c 20 20 20 20  | bank..P> BL    |
00000d10  20 20 20 63 6f 70 79 62  61 63 6b 25 20 20 20 20  |   copyback%    |
00000d20  20 20 20 20 20 20 20 3b  63 6c 73 20 74 68 61 74  |       ;cls that|
00000d30  20 62 61 6e 6b 20 74 6f  20 62 61 63 6b 67 72 6f  | bank to backgro|
00000d40  75 6e 64 0d 05 5a 06 20  3a 0d 05 64 15 20 4c 44  |und..Z. :..d. LD|
00000d50  52 20 20 20 20 20 20 31  32 2c 20 61 62 25 0d 05  |R      12, ab%..|
00000d60  6e 15 20 4c 44 52 20 20  20 20 20 20 31 33 2c 20  |n. LDR      13, |
00000d70  61 6e 25 0d 05 78 36 20  2e 66 72 61 6d 65 6d 6f  |an%..x6 .framemo|
00000d80  76 65 6c 6f 6f 70 25 20  20 20 20 20 20 20 20 20  |veloop%         |
00000d90  20 20 20 20 20 3b 74 68  65 6e 20 6d 6f 76 65 20  |     ;then move |
00000da0  65 61 63 68 20 62 61 6c  6c 0d 05 82 38 20 4c 44  |each ball...8 LD|
00000db0  4d 49 41 20 20 20 20 31  32 2c 20 7b 30 2c 31 2c  |MIA    12, {0,1,|
00000dc0  32 2c 33 2c 34 2c 35 7d  20 20 20 3b 20 72 65 61  |2,3,4,5}   ; rea|
00000dd0  64 20 78 2c 79 2c 78 69  2c 79 69 2c 73 63 2c 62  |d x,y,xi,yi,sc,b|
00000de0  74 0d 05 8c 19 20 42 4c  20 20 20 20 20 20 20 6d  |t.... BL       m|
00000df0  6f 76 65 6e 63 68 65 63  6b 25 0d 05 96 3b 20 53  |ovencheck%...; S|
00000e00  54 4d 49 41 20 20 20 20  31 32 21 2c 20 7b 30 2c  |TMIA    12!, {0,|
00000e10  31 2c 32 2c 33 2c 34 2c  35 7d 20 20 3b 20 72 65  |1,2,3,4,5}  ; re|
00000e20  73 74 6f 72 65 20 78 2c  79 2c 78 69 2c 79 69 2c  |store x,y,xi,yi,|
00000e30  73 63 2c 62 74 0d 05 a0  18 20 53 55 42 53 20 20  |sc,bt.... SUBS  |
00000e40  20 20 20 31 33 2c 20 31  33 2c 20 23 31 0d 05 aa  |   13, 13, #1...|
00000e50  34 20 42 4e 45 20 20 20  20 20 20 66 72 61 6d 65  |4 BNE      frame|
00000e60  6d 6f 76 65 6c 6f 6f 70  25 20 20 20 20 20 20 3b  |moveloop%      ;|
00000e70  74 68 65 6e 20 64 6f 20  6e 65 78 74 20 62 61 6c  |then do next bal|
00000e80  6c 0d 05 b4 06 20 3a 0d  05 be 15 20 4c 44 52 20  |l.... :.... LDR |
00000e90  20 20 20 20 20 31 32 2c  20 61 62 25 0d 05 c8 15  |     12, ab%....|
00000ea0  20 4c 44 52 20 20 20 20  20 20 31 33 2c 20 61 6e  | LDR      13, an|
00000eb0  25 0d 05 d2 36 20 2e 66  72 61 6d 65 70 6c 6f 74  |%...6 .frameplot|
00000ec0  6c 6f 6f 70 25 20 20 20  20 20 20 20 20 20 20 20  |loop%           |
00000ed0  20 20 20 3b 6e 6f 77 20  70 6c 6f 74 20 65 61 63  |   ;now plot eac|
00000ee0  68 20 62 61 6c 6c 3a 0d  05 dc 3d 20 4c 44 4d 49  |h ball:...= LDMI|
00000ef0  41 20 20 20 20 31 32 2c  20 7b 30 2c 31 7d 20 20  |A    12, {0,1}  |
00000f00  20 20 20 20 20 20 20 20  20 3b 20 72 65 61 64 20  |         ; read |
00000f10  78 2c 79 20 63 6f 6f 72  64 73 20 66 72 6f 6d 20  |x,y coords from |
00000f20  64 61 74 61 0d 05 e6 1a  20 4c 44 52 20 20 20 20  |data.... LDR    |
00000f30  20 20 32 2c 20 5b 31 32  2c 20 23 32 30 5d 0d 05  |  2, [12, #20]..|
00000f40  f0 1a 20 4d 4f 56 20 20  20 20 20 20 30 2c 20 30  |.. MOV      0, 0|
00000f50  2c 20 41 53 52 20 23 38  0d 05 fa 1a 20 4d 4f 56  |, ASR #8.... MOV|
00000f60  20 20 20 20 20 20 31 2c  20 31 2c 20 41 53 52 20  |      1, 1, ASR |
00000f70  23 38 0d 06 04 34 20 42  4c 20 20 20 20 20 20 20  |#8...4 BL       |
00000f80  70 6c 6f 74 25 20 20 20  20 20 20 20 20 20 20 20  |plot%           |
00000f90  20 20 20 20 3b 20 70 6c  6f 74 20 62 61 6c 6c 20  |    ; plot ball |
00000fa0  61 74 20 78 2c 79 0d 06  0e 19 20 41 44 44 20 20  |at x,y.... ADD  |
00000fb0  20 20 20 20 31 32 2c 20  31 32 2c 20 23 32 34 0d  |    12, 12, #24.|
00000fc0  06 18 18 20 53 55 42 53  20 20 20 20 20 31 33 2c  |... SUBS     13,|
00000fd0  20 31 33 2c 20 23 31 0d  06 22 34 20 42 4e 45 20  | 13, #1.."4 BNE |
00000fe0  20 20 20 20 20 66 72 61  6d 65 70 6c 6f 74 6c 6f  |     frameplotlo|
00000ff0  6f 70 25 20 20 20 20 20  20 3b 74 68 65 6e 20 64  |op%      ;then d|
00001000  6f 20 6e 65 78 74 20 62  61 6c 6c 0d 06 2c 16 20  |o next ball..,. |
00001010  4c 44 52 20 20 20 20 20  20 31 31 2c 20 61 66 63  |LDR      11, afc|
00001020  25 0d 06 36 18 20 41 44  44 20 20 20 20 20 20 31  |%..6. ADD      1|
00001030  31 2c 20 31 31 2c 20 23  31 0d 06 40 35 20 53 54  |1, 11, #1..@5 ST|
00001040  52 20 20 20 20 20 20 31  31 2c 20 61 66 63 25 20  |R      11, afc% |
00001050  20 20 20 20 20 20 20 20  20 20 20 3b 75 70 64 61  |           ;upda|
00001060  74 65 20 66 72 61 6d 65  20 63 6f 75 6e 74 0d 06  |te frame count..|
00001070  4a 06 20 3a 0d 06 54 06  20 5d 0d 06 5e 0d 20 e7  |J. :..T. ]..^. .|
00001080  20 56 47 41 25 20 8c 0d  06 68 0f 20 5b 4f 50 54  | VGA% ...h. [OPT|
00001090  20 70 61 73 73 25 0d 06  72 44 20 4c 44 52 20 20  | pass%..rD LDR  |
000010a0  20 20 20 20 31 34 2c 20  61 73 63 72 73 74 25 20  |    14, ascrst% |
000010b0  20 20 20 20 20 20 20 20  3b 69 66 20 69 6e 20 56  |        ;if in V|
000010c0  47 41 20 6d 6f 64 65 2c  20 66 69 6c 6c 20 69 6e  |GA mode, fill in|
000010d0  20 74 68 65 20 65 78 74  72 61 0d 06 7c 42 20 41  | the extra..|B A|
000010e0  44 44 20 20 20 20 20 20  31 33 2c 20 31 34 2c 20  |DD      13, 14, |
000010f0  23 68 61 64 64 25 2d 68  70 69 78 25 3b 62 6c 61  |#hadd%-hpix%;bla|
00001100  6e 6b 20 6c 69 6e 65 73  20 62 79 20 63 6f 70 79  |nk lines by copy|
00001110  69 6e 67 20 74 68 65 20  6c 69 6e 65 0d 06 86 28  |ing the line...(|
00001120  20 4d 4f 56 20 20 20 20  20 20 31 32 2c 20 23 76  | MOV      12, #v|
00001130  70 69 78 25 20 20 20 20  20 20 20 20 20 20 3b 61  |pix%          ;a|
00001140  62 6f 76 65 0d 06 90 12  20 2e 69 6e 74 65 72 6c  |bove.... .interl|
00001150  61 63 65 6c 31 25 0d 06  9a 19 20 4c 44 4d 49 41  |acel1%.... LDMIA|
00001160  20 20 20 20 31 34 21 2c  20 7b 30 2d 31 31 7d 0d  |    14!, {0-11}.|
00001170  06 a4 19 20 53 54 4d 49  41 20 20 20 20 31 33 21  |... STMIA    13!|
00001180  2c 20 7b 30 2d 31 31 7d  0d 06 ae 19 20 4c 44 4d  |, {0-11}.... LDM|
00001190  49 41 20 20 20 20 31 34  21 2c 20 7b 30 2d 31 31  |IA    14!, {0-11|
000011a0  7d 0d 06 b8 19 20 53 54  4d 49 41 20 20 20 20 31  |}.... STMIA    1|
000011b0  33 21 2c 20 7b 30 2d 31  31 7d 0d 06 c2 19 20 4c  |3!, {0-11}.... L|
000011c0  44 4d 49 41 20 20 20 20  31 34 21 2c 20 7b 30 2d  |DMIA    14!, {0-|
000011d0  31 31 7d 0d 06 cc 19 20  53 54 4d 49 41 20 20 20  |11}.... STMIA   |
000011e0  20 31 33 21 2c 20 7b 30  2d 31 31 7d 0d 06 d6 19  | 13!, {0-11}....|
000011f0  20 4c 44 4d 49 41 20 20  20 20 31 34 21 2c 20 7b  | LDMIA    14!, {|
00001200  30 2d 31 31 7d 0d 06 e0  19 20 53 54 4d 49 41 20  |0-11}.... STMIA |
00001210  20 20 20 31 33 21 2c 20  7b 30 2d 31 31 7d 0d 06  |   13!, {0-11}..|
00001220  ea 19 20 4c 44 4d 49 41  20 20 20 20 31 34 21 2c  |.. LDMIA    14!,|
00001230  20 7b 30 2d 31 31 7d 0d  06 f4 19 20 53 54 4d 49  | {0-11}.... STMI|
00001240  41 20 20 20 20 31 33 21  2c 20 7b 30 2d 31 31 7d  |A    13!, {0-11}|
00001250  0d 06 fe 19 20 4c 44 4d  49 41 20 20 20 20 31 34  |.... LDMIA    14|
00001260  21 2c 20 7b 30 2d 31 31  7d 0d 07 08 19 20 53 54  |!, {0-11}.... ST|
00001270  4d 49 41 20 20 20 20 31  33 21 2c 20 7b 30 2d 31  |MIA    13!, {0-1|
00001280  31 7d 0d 07 12 22 20 41  44 44 20 20 20 20 20 20  |1}..." ADD      |
00001290  31 33 2c 20 31 33 2c 20  23 68 61 64 64 25 2d 68  |13, 13, #hadd%-h|
000012a0  70 69 78 25 0d 07 1c 22  20 41 44 44 20 20 20 20  |pix%..." ADD    |
000012b0  20 20 31 34 2c 20 31 34  2c 20 23 68 61 64 64 25  |  14, 14, #hadd%|
000012c0  2d 68 70 69 78 25 0d 07  26 18 20 53 55 42 53 20  |-hpix%..&. SUBS |
000012d0  20 20 20 20 31 32 2c 20  31 32 2c 20 23 31 0d 07  |    12, 12, #1..|
000012e0  30 1a 20 42 4e 45 20 20  20 20 20 20 69 6e 74 65  |0. BNE      inte|
000012f0  72 6c 61 63 65 6c 31 25  0d 07 3a 06 20 5d 0d 07  |rlacel1%..:. ]..|
00001300  44 06 20 cd 0d 07 4e 0f  20 5b 4f 50 54 20 70 61  |D. ...N. [OPT pa|
00001310  73 73 25 0d 07 58 06 20  3a 0d 07 62 42 20 53 57  |ss%..X. :..bB SW|
00001320  49 20 20 20 20 20 20 22  4f 53 5f 52 65 61 64 4d  |I      "OS_ReadM|
00001330  6f 6e 6f 74 6f 6e 69 63  54 69 6d 65 22 20 20 20  |onotonicTime"   |
00001340  20 20 20 20 20 3b 63 61  6c 63 75 6c 61 74 65 20  |     ;calculate |
00001350  66 72 61 6d 65 20 73 70  65 65 64 0d 07 6c 17 20  |frame speed..l. |
00001360  4c 44 52 20 20 20 20 20  20 31 2c 20 61 74 69 6d  |LDR      1, atim|
00001370  65 25 0d 07 76 15 20 53  55 42 20 20 20 20 20 20  |e%..v. SUB      |
00001380  30 2c 20 30 2c 20 31 0d  07 80 20 20 43 4d 50 20  |0, 0, 1...  CMP |
00001390  20 20 20 20 20 30 2c 20  23 31 30 30 2f 74 61 72  |     0, #100/tar|
000013a0  67 65 74 66 70 73 25 0d  07 8a 44 20 53 57 49 47  |getfps%...D SWIG|
000013b0  54 20 20 20 20 32 35 36  2b 37 20 20 20 20 20 20  |T    256+7      |
000013c0  20 20 20 20 20 20 20 20  20 3b 62 65 65 70 20 69  |         ;beep i|
000013d0  66 20 69 74 20 66 61 6c  6c 73 20 62 65 6c 6f 77  |f it falls below|
000013e0  20 74 61 72 67 65 74 20  66 70 73 0d 07 94 06 20  | target fps.... |
000013f0  3a 0d 07 9e 15 20 4d 4f  56 20 20 20 20 20 20 30  |:.... MOV      0|
00001400  2c 20 23 31 32 39 0d 07  a8 13 20 4d 4f 56 20 20  |, #129.... MOV  |
00001410  20 20 20 20 31 2c 20 23  30 0d 07 b2 13 20 4d 4f  |    1, #0.... MO|
00001420  56 20 20 20 20 20 20 32  2c 20 23 30 0d 07 bc 17  |V      2, #0....|
00001430  20 53 57 49 20 20 20 20  20 20 22 4f 53 5f 42 79  | SWI      "OS_By|
00001440  74 65 22 0d 07 c6 15 20  43 4d 50 20 20 20 20 20  |te".... CMP     |
00001450  20 32 2c 20 23 26 46 46  0d 07 d0 43 20 42 45 51  | 2, #&FF...C BEQ|
00001460  20 20 20 20 20 20 6e 65  78 74 66 72 61 6d 65 25  |      nextframe%|
00001470  20 20 20 20 20 20 20 20  20 20 3b 69 66 20 6e 6f  |          ;if no|
00001480  20 6b 65 79 20 70 72 65  73 73 65 64 2c 20 64 6f  | key pressed, do|
00001490  20 6e 65 78 74 20 66 72  61 6d 65 0d 07 da 2d 20  | next frame...- |
000014a0  4c 44 52 20 20 20 20 20  20 31 33 2c 20 61 73 70  |LDR      13, asp|
000014b0  66 72 61 6d 65 25 20 20  20 20 20 20 20 3b 72 65  |frame%       ;re|
000014c0  73 74 6f 72 65 20 73 70  0d 07 e4 32 20 4c 44 4d  |store sp...2 LDM|
000014d0  46 44 20 20 20 20 31 33  21 2c 20 7b 50 43 7d 20  |FD    13!, {PC} |
000014e0  20 20 20 20 20 20 20 20  20 20 3b 72 65 74 75 72  |          ;retur|
000014f0  6e 20 74 6f 20 42 41 53  49 43 0d 07 ee 06 20 3a  |n to BASIC.... :|
00001500  0d 07 f8 0f 20 2e 6d 61  6b 65 62 61 63 6b 25 0d  |.... .makeback%.|
00001510  08 02 1b 20 4c 44 52 20  20 20 20 20 20 30 2c 20  |... LDR      0, |
00001520  61 62 61 63 6b 64 61 74  61 25 0d 08 0c 1a 20 4c  |abackdata%.... L|
00001530  44 52 20 20 20 20 20 20  31 2c 20 61 6d 69 64 64  |DR      1, amidd|
00001540  61 74 61 25 0d 08 16 1d  20 4d 4f 56 20 20 20 20  |ata%.... MOV    |
00001550  20 20 32 2c 20 23 76 70  69 78 25 2a 68 70 69 78  |  2, #vpix%*hpix|
00001560  25 0d 08 20 15 20 4d 4f  56 20 20 20 20 20 20 34  |%.. . MOV      4|
00001570  2c 20 23 32 35 35 0d 08  2a 13 20 2e 6d 61 6b 65  |, #255..*. .make|
00001580  62 61 63 6b 6c 6f 6f 70  25 0d 08 34 14 20 4c 44  |backloop%..4. LD|
00001590  52 42 20 20 20 20 20 33  2c 20 5b 31 5d 0d 08 3e  |RB     3, [1]..>|
000015a0  13 20 43 4d 50 20 20 20  20 20 20 33 2c 20 23 30  |. CMP      3, #0|
000015b0  0d 08 48 14 20 53 54 52  4e 45 42 20 20 20 33 2c  |..H. STRNEB   3,|
000015c0  20 5b 30 5d 0d 08 52 14  20 53 54 52 4e 45 42 20  | [0]..R. STRNEB |
000015d0  20 20 34 2c 20 5b 31 5d  0d 08 5c 16 20 41 44 44  |  4, [1]..\. ADD|
000015e0  20 20 20 20 20 20 31 2c  20 31 2c 20 23 31 0d 08  |      1, 1, #1..|
000015f0  66 16 20 41 44 44 20 20  20 20 20 20 30 2c 20 30  |f. ADD      0, 0|
00001600  2c 20 23 31 0d 08 70 16  20 53 55 42 53 20 20 20  |, #1..p. SUBS   |
00001610  20 20 32 2c 20 32 2c 20  23 31 0d 08 7a 1b 20 42  |  2, 2, #1..z. B|
00001620  4e 45 20 20 20 20 20 20  6d 61 6b 65 62 61 63 6b  |NE      makeback|
00001630  6c 6f 6f 70 25 0d 08 84  14 20 4d 4f 56 53 20 20  |loop%.... MOVS  |
00001640  20 20 20 50 43 2c 20 31  34 0d 08 8e 06 20 3a 0d  |   PC, 14.... :.|
00001650  08 98 19 20 2e 61 73 63  72 73 74 25 20 45 51 55  |... .ascrst% EQU|
00001660  44 20 73 63 72 73 74 25  0d 08 a2 1c 20 2e 61 64  |D scrst%.... .ad|
00001670  61 74 61 25 20 20 45 51  55 44 20 62 61 6c 6c 64  |ata%  EQUD balld|
00001680  61 74 61 25 0d 08 ac 29  20 2e 61 62 61 63 6b 64  |ata%...) .abackd|
00001690  61 74 61 25 20 20 20 20  20 20 20 20 45 51 55 44  |ata%        EQUD|
000016a0  20 62 61 63 6b 64 61 74  61 25 2b 35 36 0d 08 b6  | backdata%+56...|
000016b0  28 20 2e 61 6d 69 64 64  61 74 61 25 20 20 20 20  |( .amiddata%    |
000016c0  20 20 20 20 20 45 51 55  44 20 6d 69 64 64 61 74  |     EQUD middat|
000016d0  61 25 2b 35 36 0d 08 c0  14 20 2e 61 62 61 6e 6b  |a%+56.... .abank|
000016e0  25 20 20 45 51 55 44 20  31 0d 08 ca 2c 20 2e 61  |%  EQUD 1..., .a|
000016f0  70 6c 6f 74 72 65 67 73  25 20 20 20 20 20 20 20  |plotregs%       |
00001700  20 45 51 55 44 20 30 3a  45 51 55 44 20 30 3a 45  | EQUD 0:EQUD 0:E|
00001710  51 55 44 20 30 0d 08 d4  33 20 2e 70 6c 6f 74 25  |QUD 0...3 .plot%|
00001720  20 20 20 3b 70 6c 6f 74  20 6f 75 72 20 62 61 6c  |   ;plot our bal|
00001730  6c 20 73 70 72 69 74 65  20 61 74 20 63 6f 6f 72  |l sprite at coor|
00001740  64 73 20 72 30 2c 72 31  0d 08 de 3e 20 20 20 20  |ds r0,r1...>    |
00001750  20 20 20 20 20 20 3b 77  68 65 72 65 20 30 2c 30  |      ;where 0,0|
00001760  20 69 73 20 74 6f 70 20  6c 65 66 74 20 26 20 32  | is top left & 2|
00001770  38 37 2c 31 39 39 20 69  73 20 62 6f 74 74 6f 6d  |87,199 is bottom|
00001780  20 72 69 67 68 74 0d 08  e8 38 20 20 20 20 20 20  | right...8      |
00001790  20 20 20 20 3b 4e 42 20  73 70 72 69 74 65 20 4d  |    ;NB sprite M|
000017a0  55 53 54 20 6c 69 65 20  65 6e 74 69 72 65 6c 79  |UST lie entirely|
000017b0  20 77 69 74 68 69 6e 20  73 63 72 65 65 6e 0d 08  | within screen..|
000017c0  f2 1c 20 41 44 52 20 20  20 20 20 20 31 31 2c 20  |.. ADR      11, |
000017d0  61 70 6c 6f 74 72 65 67  73 25 0d 08 fc 1c 20 53  |aplotregs%.... S|
000017e0  54 4d 49 41 20 20 20 20  31 31 2c 20 7b 31 32 2c  |TMIA    11, {12,|
000017f0  31 33 2c 31 34 7d 0d 09  06 42 20 80 20 20 20 20  |13,14}...B .    |
00001800  20 20 34 2c 20 30 2c 20  23 33 20 20 20 20 20 20  |  4, 0, #3      |
00001810  20 20 20 20 20 20 3b 63  61 6c 63 20 77 68 69 63  |      ;calc whic|
00001820  68 20 6f 66 20 34 20 73  70 72 69 74 65 20 61 6c  |h of 4 sprite al|
00001830  69 67 6e 6d 65 6e 74 73  0d 09 10 45 20 41 44 44  |ignments...E ADD|
00001840  20 20 20 20 20 20 33 2c  20 34 2c 20 34 2c 20 41  |      3, 4, 4, A|
00001850  53 4c 20 23 31 20 20 20  20 20 3b 77 65 20 6e 65  |SL #1     ;we ne|
00001860  65 64 20 76 69 61 20 28  78 41 4e 44 33 29 2a 31  |ed via (xAND3)*1|
00001870  32 2a 32 2a 39 20 2b 20  64 61 74 61 25 0d 09 1a  |2*2*9 + data%...|
00001880  1d 20 41 44 44 20 20 20  20 20 20 33 2c 20 33 2c  |. ADD      3, 3,|
00001890  20 33 2c 20 41 53 4c 20  23 33 0d 09 24 3c 20 42  | 3, ASL #3..$< B|
000018a0  49 43 20 20 20 20 20 20  30 2c 20 30 2c 20 23 33  |IC      0, 0, #3|
000018b0  20 20 20 20 20 20 20 20  20 20 20 20 3b 72 6f 75  |            ;rou|
000018c0  6e 64 20 78 20 64 6f 77  6e 20 74 6f 20 6d 75 6c  |nd x down to mul|
000018d0  74 20 6f 66 20 33 0d 09  2e 1d 20 41 44 44 20 20  |t of 3.... ADD  |
000018e0  20 20 20 20 31 2c 20 31  2c 20 31 2c 20 41 53 4c  |    1, 1, 1, ASL|
000018f0  20 23 33 0d 09 38 18 20  4c 44 52 20 20 20 20 20  | #3..8. LDR     |
00001900  20 34 2c 20 61 73 63 72  73 74 25 0d 09 42 22 20  | 4, ascrst%..B" |
00001910  41 44 44 20 20 20 20 20  20 34 2c 20 34 2c 20 31  |ADD      4, 4, 1|
00001920  2c 20 41 53 4c 20 23 6c  68 61 64 64 25 0d 09 4c  |, ASL #lhadd%..L|
00001930  42 20 41 44 44 20 20 20  20 20 20 30 2c 20 34 2c  |B ADD      0, 4,|
00001940  20 30 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  | 0             ;|
00001950  63 61 6c 63 20 28 73 63  72 65 65 6e 20 70 74 72  |calc (screen ptr|
00001960  20 2b 20 68 61 64 64 25  2a 79 20 2b 20 78 29 0d  | + hadd%*y + x).|
00001970  09 56 17 20 4c 44 52 20  20 20 20 20 20 31 2c 20  |.V. LDR      1, |
00001980  61 64 61 74 61 25 0d 09  60 1d 20 52 53 42 20 20  |adata%..`. RSB  |
00001990  20 20 20 20 34 2c 20 32  2c 20 32 2c 20 41 53 4c  |    4, 2, 2, ASL|
000019a0  20 23 35 0d 09 6a 1d 20  53 55 42 20 20 20 20 20  | #5..j. SUB     |
000019b0  20 34 2c 20 34 2c 20 32  2c 20 41 53 4c 20 23 32  | 4, 4, 2, ASL #2|
000019c0  0d 09 74 1d 20 41 44 44  20 20 20 20 20 20 31 2c  |..t. ADD      1,|
000019d0  20 31 2c 20 34 2c 20 41  53 4c 20 23 35 0d 09 7e  | 1, 4, ASL #5..~|
000019e0  44 20 41 44 44 20 20 20  20 20 20 31 2c 20 31 2c  |D ADD      1, 1,|
000019f0  20 33 2c 20 41 53 4c 20  23 33 20 20 20 20 20 3b  | 3, ASL #3     ;|
00001a00  66 69 6e 61 6c 6c 79 20  63 61 6c 63 20 28 78 41  |finally calc (xA|
00001a10  4e 44 33 29 2a 31 32 2a  32 2a 39 2b 64 61 74 61  |ND3)*12*2*9+data|
00001a20  25 0d 09 88 13 20 4d 4f  56 20 20 20 20 20 20 32  |%.... MOV      2|
00001a30  2c 20 23 33 0d 09 92 19  20 41 44 44 20 20 20 20  |, #3.... ADD    |
00001a40  20 20 33 2c 20 31 2c 20  23 31 32 2a 39 0d 09 9c  |  3, 1, #12*9...|
00001a50  32 20 2e 6c 6f 6f 70 31  25 20 20 20 20 20 20 20  |2 .loop1%       |
00001a60  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00001a70  6e 6f 77 20 70 6c 6f 74  20 73 70 72 69 74 65 0d  |now plot sprite.|
00001a80  09 a6 2e 20 a4 70 6c 6f  74 66 72 61 67 28 70 61  |... .plotfrag(pa|
00001a90  73 73 25 29 20 20 20 20  20 20 20 20 20 20 20 20  |ss%)            |
00001aa0  3b 70 6c 6f 74 20 31 73  74 20 72 6f 77 0d 09 b0  |;plot 1st row...|
00001ab0  44 20 41 44 44 20 20 20  20 20 20 30 2c 20 30 2c  |D ADD      0, 0,|
00001ac0  20 23 68 61 64 64 25 2d  31 32 20 20 20 20 20 3b  | #hadd%-12     ;|
00001ad0  6d 6f 76 65 20 73 63 72  65 65 6e 20 70 74 72 20  |move screen ptr |
00001ae0  74 6f 20 73 74 61 72 74  20 6e 65 78 74 20 72 6f  |to start next ro|
00001af0  77 0d 09 ba 15 20 a4 70  6c 6f 74 66 72 61 67 28  |w.... .plotfrag(|
00001b00  70 61 73 73 25 29 0d 09  c4 1d 20 41 44 44 20 20  |pass%).... ADD  |
00001b10  20 20 20 20 30 2c 20 30  2c 20 23 68 61 64 64 25  |    0, 0, #hadd%|
00001b20  2d 31 32 0d 09 ce 2e 20  a4 70 6c 6f 74 66 72 61  |-12.... .plotfra|
00001b30  67 28 70 61 73 73 25 29  20 20 20 20 20 20 20 20  |g(pass%)        |
00001b40  20 20 20 20 3b 70 6c 6f  74 20 33 72 64 20 72 6f  |    ;plot 3rd ro|
00001b50  77 0d 09 d8 1d 20 41 44  44 20 20 20 20 20 20 30  |w.... ADD      0|
00001b60  2c 20 30 2c 20 23 68 61  64 64 25 2d 31 32 0d 09  |, 0, #hadd%-12..|
00001b70  e2 16 20 53 55 42 53 20  20 20 20 20 32 2c 20 32  |.. SUBS     2, 2|
00001b80  2c 20 23 31 0d 09 ec 44  20 42 4e 45 20 20 20 20  |, #1...D BNE    |
00001b90  20 20 6c 6f 6f 70 31 25  20 20 20 20 20 20 20 20  |  loop1%        |
00001ba0  20 20 3b 72 65 70 65 61  74 20 61 62 6f 76 65 20  |  ;repeat above |
00001bb0  33 20 74 69 6d 65 73 20  74 6f 20 64 6f 20 61 6c  |3 times to do al|
00001bc0  6c 20 39 20 72 6f 77 73  0d 09 f6 44 20 41 44 52  |l 9 rows...D ADR|
00001bd0  20 20 20 20 20 20 31 31  2c 20 61 70 6c 6f 74 72  |      11, aplotr|
00001be0  65 67 73 25 20 20 20 20  20 20 3b 70 6c 6f 74 20  |egs%      ;plot |
00001bf0  63 6f 6d 70 6c 65 74 65  64 20 2d 20 72 65 74 75  |completed - retu|
00001c00  72 6e 20 74 6f 20 63 61  6c 6c 65 72 0d 0a 00 38  |rn to caller...8|
00001c10  20 4c 44 4d 49 41 20 20  20 20 31 31 2c 20 7b 31  | LDMIA    11, {1|
00001c20  32 2c 31 33 2c 50 43 7d  20 20 20 20 20 20 3b 70  |2,13,PC}      ;p|
00001c30  72 65 73 65 72 76 69 6e  67 20 72 31 32 20 26 20  |reserving r12 & |
00001c40  72 31 33 2e 0d 0a 0a 06  20 3a 0d 0a 14 2f 20 2e  |r13..... :.../ .|
00001c50  61 63 6f 6c 6c 72 65 67  73 25 20 20 20 20 45 51  |acollregs%    EQ|
00001c60  55 44 20 30 3a 45 51 55  44 20 30 3a 45 51 55 44  |UD 0:EQUD 0:EQUD|
00001c70  20 30 3a 45 51 55 44 20  30 0d 0a 1e 36 20 20 20  | 0:EQUD 0...6   |
00001c80  20 20 20 20 20 20 20 20  20 20 20 20 20 45 51 55  |             EQU|
00001c90  44 20 30 3a 45 51 55 44  20 30 3a 45 51 55 44 20  |D 0:EQUD 0:EQUD |
00001ca0  30 3a 45 51 55 44 20 30  3a 45 51 55 44 20 30 0d  |0:EQUD 0:EQUD 0.|
00001cb0  0a 28 34 20 2e 6d 6f 76  65 6e 63 68 65 63 6b 25  |.(4 .movencheck%|
00001cc0  20 20 20 20 20 3b 6d 6f  76 65 20 74 68 65 6e 20  |     ;move then |
00001cd0  63 6f 6c 6c 69 73 69 6f  6e 20 63 68 65 63 6b 20  |collision check |
00001ce0  6f 75 72 0d 0a 32 32 20  20 20 20 20 20 20 20 20  |our..22         |
00001cf0  20 20 20 20 20 20 20 20  20 3b 62 61 6c 6c 20 73  |         ;ball s|
00001d00  70 72 69 74 65 20 61 74  20 63 6f 6f 72 64 73 20  |prite at coords |
00001d10  72 30 2c 72 31 0d 0a 3c  46 20 20 20 20 20 20 20  |r0,r1..<F       |
00001d20  20 20 20 20 20 20 20 20  20 20 20 3b 77 68 65 72  |           ;wher|
00001d30  65 20 30 2c 30 20 69 73  20 74 6f 70 20 6c 65 66  |e 0,0 is top lef|
00001d40  74 20 26 20 32 38 37 2c  31 39 39 20 69 73 20 62  |t & 287,199 is b|
00001d50  6f 74 74 6f 6d 20 72 69  67 68 74 0d 0a 46 40 20  |ottom right..F@ |
00001d60  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00001d70  20 3b 4e 42 20 73 70 72  69 74 65 20 4d 55 53 54  | ;NB sprite MUST|
00001d80  20 6c 69 65 20 65 6e 74  69 72 65 6c 79 20 77 69  | lie entirely wi|
00001d90  74 68 69 6e 20 73 63 72  65 65 6e 0d 0a 50 1c 20  |thin screen..P. |
00001da0  41 44 52 20 20 20 20 20  20 31 31 2c 20 61 63 6f  |ADR      11, aco|
00001db0  6c 6c 72 65 67 73 25 0d  0a 5a 15 20 41 44 44 20  |llregs%..Z. ADD |
00001dc0  20 20 20 20 20 30 2c 20  30 2c 20 32 0d 0a 64 15  |     0, 0, 2..d.|
00001dd0  20 41 44 44 20 20 20 20  20 20 31 2c 20 31 2c 20  | ADD      1, 1, |
00001de0  33 0d 0a 6e 20 20 53 54  4d 49 41 20 20 20 20 31  |3..n  STMIA    1|
00001df0  31 2c 20 7b 30 2d 35 2c  31 32 2c 31 33 2c 31 34  |1, {0-5,12,13,14|
00001e00  7d 0d 0a 78 1a 20 4d 4f  56 20 20 20 20 20 20 30  |}..x. MOV      0|
00001e10  2c 20 30 2c 20 41 53 52  20 23 38 0d 0a 82 1a 20  |, 0, ASR #8.... |
00001e20  4d 4f 56 20 20 20 20 20  20 31 2c 20 31 2c 20 41  |MOV      1, 1, A|
00001e30  53 52 20 23 38 0d 0a 8c  42 20 80 20 20 20 20 20  |SR #8...B .     |
00001e40  20 32 2c 20 30 2c 20 23  33 20 20 20 20 20 20 20  | 2, 0, #3       |
00001e50  20 20 20 20 20 3b 63 61  6c 63 20 77 68 69 63 68  |     ;calc which|
00001e60  20 6f 66 20 34 20 73 70  72 69 74 65 20 61 6c 69  | of 4 sprite ali|
00001e70  67 6e 6d 65 6e 74 73 0d  0a 96 45 20 41 44 44 20  |gnments...E ADD |
00001e80  20 20 20 20 20 33 2c 20  32 2c 20 32 2c 20 41 53  |     3, 2, 2, AS|
00001e90  4c 20 23 31 20 20 20 20  20 3b 77 65 20 6e 65 65  |L #1     ;we nee|
00001ea0  64 20 76 69 61 20 28 78  41 4e 44 33 29 2a 31 32  |d via (xAND3)*12|
00001eb0  2a 32 2a 39 20 2b 20 64  61 74 61 25 0d 0a a0 1d  |*2*9 + data%....|
00001ec0  20 41 44 44 20 20 20 20  20 20 33 2c 20 33 2c 20  | ADD      3, 3, |
00001ed0  33 2c 20 41 53 4c 20 23  33 0d 0a aa 3c 20 42 49  |3, ASL #3...< BI|
00001ee0  43 20 20 20 20 20 20 30  2c 20 30 2c 20 23 33 20  |C      0, 0, #3 |
00001ef0  20 20 20 20 20 20 20 20  20 20 20 3b 72 6f 75 6e  |           ;roun|
00001f00  64 20 78 20 64 6f 77 6e  20 74 6f 20 6d 75 6c 74  |d x down to mult|
00001f10  20 6f 66 20 33 0d 0a b4  1d 20 41 44 44 20 20 20  | of 3.... ADD   |
00001f20  20 20 20 31 2c 20 31 2c  20 31 2c 20 41 53 4c 20  |   1, 1, 1, ASL |
00001f30  23 33 0d 0a be 1a 20 4c  44 52 20 20 20 20 20 20  |#3.... LDR      |
00001f40  32 2c 20 61 6d 69 64 64  61 74 61 25 0d 0a c8 22  |2, amiddata%..."|
00001f50  20 41 44 44 20 20 20 20  20 20 32 2c 20 32 2c 20  | ADD      2, 2, |
00001f60  31 2c 20 41 53 4c 20 23  6c 68 70 69 78 25 0d 0a  |1, ASL #lhpix%..|
00001f70  d2 45 20 41 44 44 20 20  20 20 20 20 30 2c 20 32  |.E ADD      0, 2|
00001f80  2c 20 30 20 20 20 20 20  20 20 20 20 20 20 20 20  |, 0             |
00001f90  3b 63 61 6c 63 20 28 62  61 63 6b 20 6d 61 73 6b  |;calc (back mask|
00001fa0  20 70 74 72 20 2b 20 68  70 69 78 25 2a 79 20 2b  | ptr + hpix%*y +|
00001fb0  20 78 29 0d 0a dc 17 20  4c 44 52 20 20 20 20 20  | x).... LDR     |
00001fc0  20 31 2c 20 61 64 61 74  61 25 0d 0a e6 1d 20 52  | 1, adata%.... R|
00001fd0  53 42 20 20 20 20 20 20  32 2c 20 35 2c 20 35 2c  |SB      2, 5, 5,|
00001fe0  20 41 53 4c 20 23 35 0d  0a f0 1d 20 53 55 42 20  | ASL #5.... SUB |
00001ff0  20 20 20 20 20 32 2c 20  32 2c 20 35 2c 20 41 53  |     2, 2, 5, AS|
00002000  4c 20 23 32 0d 0a fa 42  20 41 44 44 20 20 20 20  |L #2...B ADD    |
00002010  20 20 31 2c 20 31 2c 20  32 2c 20 41 53 4c 20 23  |  1, 1, 2, ASL #|
00002020  35 20 20 20 20 20 3b 61  64 64 20 69 6e 20 74 6f  |5     ;add in to|
00002030  20 64 61 74 61 20 70 74  72 20 38 36 34 2a 62 61  | data ptr 864*ba|
00002040  6c 6c 74 79 70 65 0d 0b  04 44 20 41 44 44 20 20  |lltype...D ADD  |
00002050  20 20 20 20 31 2c 20 31  2c 20 33 2c 20 41 53 4c  |    1, 1, 3, ASL|
00002060  20 23 33 20 20 20 20 20  3b 66 69 6e 61 6c 6c 79  | #3     ;finally|
00002070  20 63 61 6c 63 20 28 78  41 4e 44 33 29 2a 31 32  | calc (xAND3)*12|
00002080  2a 32 2a 39 2b 64 61 74  61 25 0d 0b 0e 19 20 41  |*2*9+data%.... A|
00002090  44 44 20 20 20 20 20 20  31 2c 20 31 2c 20 23 31  |DD      1, 1, #1|
000020a0  32 2a 39 0d 0b 18 43 20  41 44 52 20 20 20 20 20  |2*9...C ADR     |
000020b0  20 32 2c 20 63 6f 6c 6c  61 64 64 72 62 75 66 25  | 2, colladdrbuf%|
000020c0  20 20 20 20 20 3b 73 74  6f 72 65 20 62 61 63 6b  |     ;store back|
000020d0  20 61 6e 64 20 73 70 72  69 74 65 20 64 61 74 61  | and sprite data|
000020e0  20 61 64 64 72 73 0d 0b  22 44 20 53 54 4d 49 41  | addrs.."D STMIA|
000020f0  20 20 20 20 32 2c 20 7b  30 2c 31 7d 20 20 20 20  |    2, {0,1}    |
00002100  20 20 20 20 20 20 20 20  3b 63 6f 72 72 65 73 70  |        ;corresp|
00002110  6f 6e 64 69 6e 67 20 74  6f 20 74 6f 70 20 6c 65  |onding to top le|
00002120  66 74 20 6f 66 20 62 61  6c 6c 0d 0b 2c 13 20 4d  |ft of ball..,. M|
00002130  4f 56 20 20 20 20 20 20  32 2c 20 23 33 0d 0b 36  |OV      2, #3..6|
00002140  33 20 2e 63 6f 6c 6c 6c  6f 6f 70 31 25 20 20 20  |3 .collloop1%   |
00002150  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00002160  6e 6f 77 20 63 68 65 63  6b 20 73 70 72 69 74 65  |now check sprite|
00002170  0d 0b 40 44 20 a4 63 6f  6c 6c 66 72 61 67 28 70  |..@D .collfrag(p|
00002180  61 73 73 25 29 20 20 20  20 20 20 20 20 20 20 20  |ass%)           |
00002190  20 3b 63 68 65 63 6b 20  31 73 74 20 72 6f 77 20  | ;check 1st row |
000021a0  28 69 66 20 63 6f 6c 6c  20 42 20 67 6f 74 63 6f  |(if coll B gotco|
000021b0  6c 6c 25 29 0d 0b 4a 42  20 41 44 44 20 20 20 20  |ll%)..JB ADD    |
000021c0  20 20 30 2c 20 30 2c 20  23 68 70 69 78 25 2d 31  |  0, 0, #hpix%-1|
000021d0  32 20 20 20 20 20 3b 6d  6f 76 65 20 62 61 63 6b  |2     ;move back|
000021e0  20 70 74 72 20 74 6f 20  73 74 61 72 74 20 6e 65  | ptr to start ne|
000021f0  78 74 20 72 6f 77 0d 0b  54 15 20 a4 63 6f 6c 6c  |xt row..T. .coll|
00002200  66 72 61 67 28 70 61 73  73 25 29 0d 0b 5e 1d 20  |frag(pass%)..^. |
00002210  41 44 44 20 20 20 20 20  20 30 2c 20 30 2c 20 23  |ADD      0, 0, #|
00002220  68 70 69 78 25 2d 31 32  0d 0b 68 2f 20 a4 63 6f  |hpix%-12..h/ .co|
00002230  6c 6c 66 72 61 67 28 70  61 73 73 25 29 20 20 20  |llfrag(pass%)   |
00002240  20 20 20 20 20 20 20 20  20 3b 63 68 65 63 6b 20  |         ;check |
00002250  34 74 68 20 72 6f 77 0d  0b 72 1d 20 41 44 44 20  |4th row..r. ADD |
00002260  20 20 20 20 20 30 2c 20  30 2c 20 23 68 70 69 78  |     0, 0, #hpix|
00002270  25 2d 31 32 0d 0b 7c 16  20 53 55 42 53 20 20 20  |%-12..|. SUBS   |
00002280  20 20 32 2c 20 32 2c 20  23 31 0d 0b 86 44 20 42  |  2, 2, #1...D B|
00002290  4e 45 20 20 20 20 20 20  63 6f 6c 6c 6c 6f 6f 70  |NE      collloop|
000022a0  31 25 20 20 20 20 20 20  3b 72 65 70 65 61 74 20  |1%      ;repeat |
000022b0  61 62 6f 76 65 20 33 20  74 69 6d 65 73 20 74 6f  |above 3 times to|
000022c0  20 64 6f 20 61 6c 6c 20  39 20 72 6f 77 73 0d 0b  | do all 9 rows..|
000022d0  90 1c 20 41 44 52 20 20  20 20 20 20 31 31 2c 20  |.. ADR      11, |
000022e0  61 63 6f 6c 6c 72 65 67  73 25 0d 0b 9a 20 20 4c  |acollregs%...  L|
000022f0  44 4d 49 41 20 20 20 20  31 31 2c 20 7b 30 2d 35  |DMIA    11, {0-5|
00002300  2c 31 32 2c 31 33 2c 31  34 7d 0d 0b a4 3d 20 41  |,12,13,14}...= A|
00002310  44 44 20 20 20 20 20 20  33 2c 20 33 2c 20 23 38  |DD      3, 3, #8|
00002320  20 20 20 20 20 20 20 20  20 20 20 20 3b 20 61 63  |            ; ac|
00002330  63 65 6c 65 72 61 74 65  20 62 61 6c 6c 20 64 6f  |celerate ball do|
00002340  77 6e 77 61 72 64 73 0d  0b ae 13 20 4d 4f 56 20  |wnwards.... MOV |
00002350  20 20 20 20 20 34 2c 20  23 30 0d 0b b8 14 20 4d  |     4, #0.... M|
00002360  4f 56 20 20 20 20 20 20  50 43 2c 20 31 34 0d 0b  |OV      PC, 14..|
00002370  c2 25 20 2e 63 6f 6c 6c  61 64 64 72 62 75 66 25  |.% .colladdrbuf%|
00002380  20 20 20 20 20 20 45 51  55 44 20 30 3a 45 51 55  |      EQUD 0:EQU|
00002390  44 20 30 0d 0b cc 0e 20  2e 67 6f 74 63 6f 6c 6c  |D 0.... .gotcoll|
000023a0  25 0d 0b d6 1c 20 41 44  52 20 20 20 20 20 20 31  |%.... ADR      1|
000023b0  31 2c 20 61 63 6f 6c 6c  72 65 67 73 25 0d 0b e0  |1, acollregs%...|
000023c0  17 20 4c 44 4d 49 41 20  20 20 20 31 31 2c 20 7b  |. LDMIA    11, {|
000023d0  30 2d 33 7d 0d 0b ea 43  20 53 55 42 20 20 20 20  |0-3}...C SUB    |
000023e0  20 20 30 2c 20 30 2c 20  32 20 20 20 20 20 20 20  |  0, 0, 2       |
000023f0  20 20 20 20 20 20 3b 72  65 73 65 74 20 70 6f 73  |      ;reset pos|
00002400  69 74 69 6f 6e 2c 20 6d  6f 76 69 6e 67 20 69 74  |ition, moving it|
00002410  20 6f 75 74 20 6f 66 0d  0b f4 2c 20 53 55 42 20  | out of..., SUB |
00002420  20 20 20 20 20 31 2c 20  31 2c 20 33 20 20 20 20  |     1, 1, 3    |
00002430  20 20 20 20 20 20 20 20  20 3b 63 6f 6c 6c 69 73  |         ;collis|
00002440  69 6f 6e 0d 0b fe 17 20  53 54 4d 49 41 20 20 20  |ion.... STMIA   |
00002450  20 31 31 2c 20 7b 30 2c  31 7d 0d 0c 08 39 20 4d  | 11, {0,1}...9 M|
00002460  4f 56 20 20 20 20 20 20  36 2c 20 23 30 20 20 20  |OV      6, #0   |
00002470  20 20 20 20 20 20 20 20  20 20 20 20 3b 69 6e 20  |            ;in |
00002480  6d 79 20 6c 69 6e 20 72  65 67 20 6e 6f 74 65 73  |my lin reg notes|
00002490  2c 20 6e 0d 0c 12 39 20  4d 4f 56 20 20 20 20 20  |, n...9 MOV     |
000024a0  20 37 2c 20 23 30 20 20  20 20 20 20 20 20 20 20  | 7, #0          |
000024b0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000024c0  20 20 20 20 20 20 20 20  20 3b 20 75 0d 0c 1c 39  |         ; u...9|
000024d0  20 4d 4f 56 20 20 20 20  20 20 38 2c 20 23 30 20  | MOV      8, #0 |
000024e0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
*
00002500  20 20 3b 20 76 0d 0c 26  39 20 4d 4f 56 20 20 20  |  ; v..&9 MOV   |
00002510  20 20 20 39 2c 20 23 30  20 20 20 20 20 20 20 20  |   9, #0        |
00002520  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00002530  20 20 20 20 20 20 20 20  20 20 20 3b 20 70 0d 0c  |           ; p..|
00002540  30 39 20 4d 4f 56 20 20  20 20 20 20 31 30 2c 20  |09 MOV      10, |
00002550  23 30 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |#0              |
00002560  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00002570  20 20 20 20 3b 20 71 0d  0c 3a 1d 20 41 44 52 20  |    ; q..:. ADR |
00002580  20 20 20 20 20 32 2c 20  63 6f 6c 6c 61 64 64 72  |     2, colladdr|
00002590  62 75 66 25 0d 0c 44 43  20 4c 44 4d 49 41 20 20  |buf%..DC LDMIA  |
000025a0  20 20 32 2c 20 7b 30 2c  31 7d 20 20 20 20 20 20  |  2, {0,1}      |
000025b0  20 20 20 20 20 20 3b 72  65 63 61 6c 6c 20 73 63  |      ;recall sc|
000025c0  72 65 65 6e 2f 64 61 74  61 20 61 64 64 72 73 20  |reen/data addrs |
000025d0  66 6f 72 20 74 6f 70 0d  0c 4e 31 20 4d 4f 56 20  |for top..N1 MOV |
000025e0  20 20 20 20 20 33 2c 20  23 30 20 20 20 20 20 3b  |     3, #0     ;|
000025f0  72 6f 77 20 30 20 20 20  20 3b 6c 65 66 74 20 6f  |row 0    ;left o|
00002600  66 20 73 70 72 69 74 65  0d 0c 58 10 20 2e 73 74  |f sprite..X. .st|
00002610  61 74 6c 6f 6f 70 31 25  0d 0c 62 1e 20 4d 4f 56  |atloop1%..b. MOV|
00002620  20 20 20 20 20 20 32 2c  20 23 30 20 20 20 20 20  |      2, #0     |
00002630  3b 63 6f 6c 20 30 0d 0c  6c 10 20 2e 73 74 61 74  |;col 0..l. .stat|
00002640  6c 6f 6f 70 32 25 0d 0c  76 46 20 4c 44 52 20 20  |loop2%..vF LDR  |
00002650  20 20 20 20 34 2c 20 5b  30 5d 2c 20 23 34 20 20  |    4, [0], #4  |
00002660  20 20 20 20 20 20 20 20  3b 72 65 73 63 61 6e 20  |        ;rescan |
00002670  65 61 63 68 20 70 69 78  65 6c 20 69 6e 20 63 6f  |each pixel in co|
00002680  6c 6c 69 73 69 6f 6e 20  61 72 65 61 0d 0c 80 46  |llision area...F|
00002690  20 4c 44 52 20 20 20 20  20 20 35 2c 20 5b 31 5d  | LDR      5, [1]|
000026a0  2c 20 23 34 20 20 20 20  20 20 20 20 20 20 3b 61  |, #4          ;a|
000026b0  6e 64 20 66 6f 72 20 65  61 63 68 20 63 6f 6c 6c  |nd for each coll|
000026c0  69 64 65 64 20 70 69 78  65 6c 20 61 64 64 20 69  |ided pixel add i|
000026d0  74 73 0d 0c 8a 44 20 80  20 20 20 20 20 20 34 2c  |ts...D .      4,|
000026e0  20 34 2c 20 35 20 20 20  20 20 20 20 20 20 20 20  | 4, 5           |
000026f0  20 20 3b 63 6f 6f 72 64  73 20 28 72 65 6c 61 74  |  ;coords (relat|
00002700  69 76 65 20 74 6f 20 74  6f 70 6c 65 66 74 20 73  |ive to topleft s|
00002710  70 72 69 74 65 29 0d 0c  94 40 20 a4 73 74 61 74  |prite)...@ .stat|
00002720  66 72 61 67 28 70 61 73  73 25 2c 20 32 35 35 29  |frag(pass%, 255)|
00002730  20 20 20 20 20 20 20 3b  6f 6e 74 6f 20 74 68 65  |       ;onto the|
00002740  20 72 65 67 72 65 73 73  69 6f 6e 20 73 74 61 74  | regression stat|
00002750  69 73 74 69 63 73 0d 0c  9e 16 20 41 44 44 20 20  |istics.... ADD  |
00002760  20 20 20 20 32 2c 20 32  2c 20 23 31 0d 0c a8 1d  |    2, 2, #1....|
00002770  20 a4 73 74 61 74 66 72  61 67 28 70 61 73 73 25  | .statfrag(pass%|
00002780  2c 20 32 35 35 3c 3c 38  29 0d 0c b2 16 20 41 44  |, 255<<8).... AD|
00002790  44 20 20 20 20 20 20 32  2c 20 32 2c 20 23 31 0d  |D      2, 2, #1.|
000027a0  0c bc 1e 20 a4 73 74 61  74 66 72 61 67 28 70 61  |... .statfrag(pa|
000027b0  73 73 25 2c 20 32 35 35  3c 3c 31 36 29 0d 0c c6  |ss%, 255<<16)...|
000027c0  16 20 41 44 44 20 20 20  20 20 20 32 2c 20 32 2c  |. ADD      2, 2,|
000027d0  20 23 31 0d 0c d0 1e 20  a4 73 74 61 74 66 72 61  | #1.... .statfra|
000027e0  67 28 70 61 73 73 25 2c  20 32 35 35 3c 3c 32 34  |g(pass%, 255<<24|
000027f0  29 0d 0c da 16 20 41 44  44 20 20 20 20 20 20 32  |).... ADD      2|
00002800  2c 20 32 2c 20 23 31 0d  0c e4 14 20 43 4d 50 20  |, 2, #1.... CMP |
00002810  20 20 20 20 20 32 2c 20  23 31 32 0d 0c ee 18 20  |     2, #12.... |
00002820  42 4c 54 20 20 20 20 20  20 73 74 61 74 6c 6f 6f  |BLT      statloo|
00002830  70 32 25 0d 0c f8 1d 20  41 44 44 20 20 20 20 20  |p2%.... ADD     |
00002840  20 30 2c 20 30 2c 20 23  68 70 69 78 25 2d 31 32  | 0, 0, #hpix%-12|
00002850  0d 0d 02 16 20 41 44 44  20 20 20 20 20 20 33 2c  |.... ADD      3,|
00002860  20 33 2c 20 23 31 0d 0d  0c 13 20 43 4d 50 20 20  | 3, #1.... CMP  |
00002870  20 20 20 20 33 2c 20 23  39 0d 0d 16 3f 20 42 4c  |    3, #9...? BL|
00002880  54 20 20 20 20 20 20 73  74 61 74 6c 6f 6f 70 31  |T      statloop1|
00002890  25 20 20 20 20 20 20 20  20 20 20 3b 77 68 65 6e  |%          ;when|
000028a0  20 64 6f 6e 65 2c 20 6e  2c 20 75 20 26 20 76 20  | done, n, u & v |
000028b0  63 6f 6d 70 75 74 65 64  0d 0d 20 15 20 4d 55 4c  |computed.. . MUL|
000028c0  20 20 20 20 20 20 39 2c  20 36 2c 20 39 0d 0d 2a  |      9, 6, 9..*|
000028d0  15 20 41 44 44 20 20 20  20 20 20 35 2c 20 37 2c  |. ADD      5, 7,|
000028e0  20 38 0d 0d 34 16 20 53  55 42 20 20 20 20 20 20  | 8..4. SUB      |
000028f0  31 34 2c 20 37 2c 20 38  0d 0d 3e 2d 20 4d 4c 41  |14, 7, 8..>- MLA|
00002900  20 20 20 20 20 20 39 2c  20 35 2c 20 31 34 2c 20  |      9, 5, 14, |
00002910  39 20 20 20 20 20 20 20  20 20 3b 70 20 63 6f 6d  |9         ;p com|
00002920  70 75 74 65 64 0d 0d 48  17 20 4d 55 4c 20 20 20  |puted..H. MUL   |
00002930  20 20 20 31 30 2c 20 36  2c 20 31 30 0d 0d 52 16  |   10, 6, 10..R.|
00002940  20 4d 55 4c 20 20 20 20  20 20 31 34 2c 20 37 2c  | MUL      14, 7,|
00002950  20 38 0d 0d 5c 18 20 53  55 42 20 20 20 20 20 20  | 8..\. SUB      |
00002960  31 30 2c 20 31 30 2c 20  31 34 0d 0d 66 2d 20 41  |10, 10, 14..f- A|
00002970  44 44 20 20 20 20 20 20  31 30 2c 20 31 30 2c 20  |DD      10, 10, |
00002980  31 30 20 20 20 20 20 20  20 20 20 20 3b 71 20 63  |10          ;q c|
00002990  6f 6d 70 75 74 65 64 0d  0d 70 12 20 4d 4f 56 53  |omputed..p. MOVS|
000029a0  20 20 20 20 20 36 2c 20  39 0d 0d 7a 2d 20 52 53  |     6, 9..z- RS|
000029b0  42 4d 49 20 20 20 20 36  2c 20 36 2c 20 23 30 20  |BMI    6, 6, #0 |
000029c0  20 20 20 20 20 20 20 20  20 20 20 3b 61 70 20 3d  |           ;ap =|
000029d0  20 61 62 73 20 70 0d 0d  84 13 20 4d 4f 56 53 20  | abs p.... MOVS |
000029e0  20 20 20 20 37 2c 20 31  30 0d 0d 8e 2d 20 52 53  |    7, 10...- RS|
000029f0  42 4d 49 20 20 20 20 37  2c 20 37 2c 20 23 30 20  |BMI    7, 7, #0 |
00002a00  20 20 20 20 20 20 20 20  20 20 20 3b 61 71 20 3d  |           ;aq =|
00002a10  20 61 62 73 20 71 0d 0d  98 12 20 43 4d 50 20 20  | abs q.... CMP  |
00002a20  20 20 20 20 36 2c 20 37  0d 0d a2 12 20 4d 4f 56  |    6, 7.... MOV|
00002a30  20 20 20 20 20 20 38 2c  20 36 0d 0d ac 33 20 4d  |      8, 6...3 M|
00002a40  4f 56 4c 54 20 20 20 20  38 2c 20 37 20 20 20 20  |OVLT    8, 7    |
00002a50  20 20 20 20 20 20 20 20  20 20 20 20 3b 20 6d 20  |            ; m |
00002a60  3d 20 6d 61 78 20 7b 61  70 2c 61 71 7d 0d 0d b6  |= max {ap,aq}...|
00002a70  3f 20 43 4d 50 20 20 20  20 20 20 38 2c 20 23 30  |? CMP      8, #0|
00002a80  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |               ;|
00002a90  69 66 20 68 61 76 65 20  64 65 67 65 6e 65 72 61  |if have degenera|
00002aa0  74 65 20 63 6f 6c 6c 69  73 69 6f 6e 0d 0d c0 45  |te collision...E|
00002ab0  20 42 45 51 20 20 20 20  20 20 70 61 74 63 68 31  | BEQ      patch1|
00002ac0  25 20 20 20 20 20 20 20  20 20 20 20 20 20 3b 28  |%             ;(|
00002ad0  65 67 20 77 69 74 68 20  73 69 6e 67 6c 65 20 70  |eg with single p|
00002ae0  69 78 65 6c 29 2c 20 63  61 6e 27 74 20 63 61 6c  |ixel), can't cal|
00002af0  63 0d 0d ca 45 20 2e 73  74 61 74 6c 6f 6f 70 33  |c...E .statloop3|
00002b00  25 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |%               |
00002b10  20 20 20 3b 61 20 6c 69  6e 65 61 72 20 72 65 67  |   ;a linear reg|
00002b20  72 65 73 73 69 6f 6e 2c  20 73 6f 20 67 6f 20 70  |ression, so go p|
00002b30  61 74 63 68 31 25 0d 0d  d4 44 20 43 4d 50 20 20  |atch1%...D CMP  |
00002b40  20 20 20 20 38 2c 20 23  31 3c 3c 31 32 20 20 20  |    8, #1<<12   |
00002b50  20 20 20 20 20 20 20 20  3b 77 68 69 63 68 20 73  |        ;which s|
00002b60  69 6d 70 6c 79 20 72 65  76 65 72 73 65 73 20 76  |imply reverses v|
00002b70  65 6c 6f 63 69 74 69 65  73 21 0d 0d de 1a 20 4d  |elocities!.... M|
00002b80  4f 56 47 45 20 20 20 20  38 2c 20 38 2c 20 41 53  |OVGE    8, 8, AS|
00002b90  52 20 23 31 0d 0d e8 46  20 4d 4f 56 47 45 20 20  |R #1...F MOVGE  |
00002ba0  20 20 36 2c 20 36 2c 20  41 53 52 20 23 31 20 20  |  6, 6, ASR #1  |
00002bb0  20 20 20 20 20 20 3b 70  72 6f 70 6f 72 74 69 6f  |      ;proportio|
00002bc0  6e 61 74 65 6c 79 20 72  65 64 75 63 65 20 61 70  |nately reduce ap|
00002bd0  20 61 6e 64 20 61 71 20  69 6e 0d 0d f2 46 20 4d  | and aq in...F M|
00002be0  4f 56 47 45 20 20 20 20  37 2c 20 37 2c 20 41 53  |OVGE    7, 7, AS|
00002bf0  52 20 23 31 20 20 20 20  20 20 20 20 3b 6d 61 67  |R #1        ;mag|
00002c00  6e 69 74 75 64 65 2c 20  75 6e 74 69 6c 20 69 6e  |nitude, until in|
00002c10  20 6e 65 63 65 73 73 61  72 79 20 72 61 6e 67 65  | necessary range|
00002c20  0d 0d fc 18 20 42 47 45  20 20 20 20 20 20 73 74  |.... BGE      st|
00002c30  61 74 6c 6f 6f 70 33 25  0d 0e 06 34 20 4d 55 4c  |atloop3%...4 MUL|
00002c40  20 20 20 20 20 20 31 31  2c 20 36 2c 20 36 20 20  |      11, 6, 6  |
00002c50  20 20 20 20 20 20 20 20  20 20 3b 61 70 5e 32 20  |          ;ap^2 |
00002c60  69 6e 20 6c 6f 77 20 72  61 6e 67 65 0d 0e 10 34  |in low range...4|
00002c70  20 4d 55 4c 20 20 20 20  20 20 31 32 2c 20 37 2c  | MUL      12, 7,|
00002c80  20 37 20 20 20 20 20 20  20 20 20 20 20 20 3b 61  | 7            ;a|
00002c90  71 5e 32 20 69 6e 20 6c  6f 77 20 72 61 6e 67 65  |q^2 in low range|
00002ca0  0d 0e 1a 34 20 41 44 44  20 20 20 20 20 20 31 33  |...4 ADD      13|
00002cb0  2c 20 31 31 2c 20 31 32  20 20 20 20 20 20 20 20  |, 11, 12        |
00002cc0  20 20 3b 64 69 76 69 73  6f 72 20 61 70 5e 32 2b  |  ;divisor ap^2+|
00002cd0  61 71 5e 32 0d 0e 24 1b  20 4d 4f 56 20 20 20 20  |aq^2..$. MOV    |
00002ce0  20 20 30 2c 20 31 31 2c  20 41 53 4c 20 23 38 0d  |  0, 11, ASL #8.|
00002cf0  0e 2e 41 20 a4 64 69 76  28 70 61 73 73 25 2c 20  |..A .div(pass%, |
00002d00  30 2c 20 31 33 2c 20 31  31 2c 20 31 29 20 20 20  |0, 13, 11, 1)   |
00002d10  3b 74 20 20 69 6e 20 72  31 31 20 3d 20 32 35 36  |;t  in r11 = 256|
00002d20  61 70 5e 32 2f 28 61 70  5e 32 2b 61 71 5e 32 29  |ap^2/(ap^2+aq^2)|
00002d30  0d 0e 38 1b 20 4d 4f 56  20 20 20 20 20 20 30 2c  |..8. MOV      0,|
00002d40  20 31 32 2c 20 41 53 4c  20 23 38 0d 0e 42 41 20  | 12, ASL #8..BA |
00002d50  a4 64 69 76 28 70 61 73  73 25 2c 20 30 2c 20 31  |.div(pass%, 0, 1|
00002d60  33 2c 20 31 32 2c 20 31  29 20 20 20 3b 74 62 20  |3, 12, 1)   ;tb |
00002d70  69 6e 20 72 31 32 20 3d  20 32 35 36 61 71 5e 32  |in r12 = 256aq^2|
00002d80  2f 28 61 70 5e 32 2b 61  71 5e 32 29 0d 0e 4c 18  |/(ap^2+aq^2)..L.|
00002d90  20 4c 44 52 20 20 20 20  20 20 31 33 2c 20 61 73  | LDR      13, as|
00002da0  71 72 74 25 0d 0e 56 30  20 4c 44 52 20 20 20 20  |qrt%..V0 LDR    |
00002db0  20 20 37 2c 20 5b 31 33  2c 20 31 31 2c 20 4c 53  |  7, [13, 11, LS|
00002dc0  4c 20 23 32 5d 20 3b 73  71 75 61 72 65 20 72 6f  |L #2] ;square ro|
00002dd0  6f 74 20 74 0d 0e 60 3c  20 4c 44 52 20 20 20 20  |ot t..`< LDR    |
00002de0  20 20 38 2c 20 5b 31 33  2c 20 31 32 2c 20 4c 53  |  8, [13, 12, LS|
00002df0  4c 20 23 32 5d 20 3b 61  6e 64 20 74 62 2c 20 76  |L #2] ;and tb, v|
00002e00  69 61 20 6c 6f 6f 6b 2d  75 70 2d 74 61 62 6c 65  |ia look-up-table|
00002e10  0d 0e 6a 13 20 43 4d 50  20 20 20 20 20 20 39 2c  |..j. CMP      9,|
00002e20  20 23 30 0d 0e 74 31 20  52 53 42 4c 54 20 20 20  | #0..t1 RSBLT   |
00002e30  20 37 2c 20 37 2c 20 23  30 20 20 20 20 20 20 20  | 7, 7, #0       |
00002e40  20 20 20 20 20 3b 66 69  6e 61 6c 20 74 20 20 69  |     ;final t  i|
00002e50  6e 20 72 37 0d 0e 7e 14  20 43 4d 50 20 20 20 20  |n r7..~. CMP    |
00002e60  20 20 31 30 2c 20 23 30  0d 0e 88 31 20 52 53 42  |  10, #0...1 RSB|
00002e70  50 4c 20 20 20 20 38 2c  20 38 2c 20 23 30 20 20  |PL    8, 8, #0  |
00002e80  20 20 20 20 20 20 20 20  20 20 3b 66 69 6e 61 6c  |          ;final|
00002e90  20 74 62 20 69 6e 20 72  38 0d 0e 92 1c 20 41 44  | tb in r8.... AD|
00002ea0  52 20 20 20 20 20 20 31  31 2c 20 61 63 6f 6c 6c  |R      11, acoll|
00002eb0  72 65 67 73 25 0d 0e 9c  20 20 4c 44 4d 49 41 20  |regs%...  LDMIA |
00002ec0  20 20 20 31 31 2c 20 7b  30 2d 35 2c 31 32 2c 31  |   11, {0-5,12,1|
00002ed0  33 2c 31 34 7d 0d 0e a6  39 20 4d 55 4c 20 20 20  |3,14}...9 MUL   |
00002ee0  20 20 20 31 31 2c 20 37  2c 20 32 20 20 20 20 20  |   11, 7, 2     |
00002ef0  20 20 20 20 20 20 20 3b  6e 6f 77 20 6d 6f 64 69  |       ;now modi|
00002f00  66 79 20 76 65 6c 6f 63  69 74 79 20 62 79 0d 0e  |fy velocity by..|
00002f10  b0 37 20 4d 4c 41 20 20  20 20 20 20 31 31 2c 20  |.7 MLA      11, |
00002f20  38 2c 20 33 2c 20 31 31  20 20 20 20 20 20 20 20  |8, 3, 11        |
00002f30  3b 72 65 66 6c 65 63 74  69 6e 67 20 69 74 20 69  |;reflecting it i|
00002f40  6e 20 74 68 65 0d 0e ba  3f 20 52 53 42 20 20 20  |n the...? RSB   |
00002f50  20 20 20 31 31 2c 20 31  31 2c 20 23 30 20 20 20  |   11, 11, #0   |
00002f60  20 20 20 20 20 20 20 3b  6c 69 6e 65 20 67 65 6e  |       ;line gen|
00002f70  65 72 61 74 65 64 20 62  79 20 74 68 65 20 6c 69  |erated by the li|
00002f80  6e 65 61 72 0d 0e c4 39  20 4d 55 4c 20 20 20 20  |near...9 MUL    |
00002f90  20 20 36 2c 20 37 2c 20  33 20 20 20 20 20 20 20  |  6, 7, 3       |
00002fa0  20 20 20 20 20 20 3b 72  65 67 72 65 73 73 69 6f  |      ;regressio|
00002fb0  6e 20 63 61 6c 63 75 6c  61 74 69 6f 6e 0d 0e ce  |n calculation...|
00002fc0  43 20 4d 55 4c 20 20 20  20 20 20 39 2c 20 38 2c  |C MUL      9, 8,|
00002fd0  20 32 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  | 2             ;|
00002fe0  28 77 68 69 63 68 20 77  65 20 75 73 65 20 74 6f  |(which we use to|
00002ff0  20 61 70 70 72 6f 78 69  6d 61 74 65 20 74 68 65  | approximate the|
00003000  0d 0e d8 45 20 53 55 42  20 20 20 20 20 20 36 2c  |...E SUB      6,|
00003010  20 36 2c 20 39 20 20 20  20 20 20 20 20 20 20 20  | 6, 9           |
00003020  20 20 3b 20 74 61 6e 67  65 6e 74 20 61 74 20 74  |  ; tangent at t|
00003030  68 65 20 63 6f 6c 6c 69  73 69 6f 6e 20 73 75 72  |he collision sur|
00003040  66 61 63 65 29 0d 0e e2  20 20 52 53 42 20 20 20  |face)...  RSB   |
00003050  20 20 20 31 31 2c 20 31  31 2c 20 31 31 2c 20 41  |   11, 11, 11, A|
00003060  53 4c 20 23 38 0d 0e ec  45 20 52 53 42 20 20 20  |SL #8...E RSB   |
00003070  20 20 20 36 2c 20 36 2c  20 36 2c 20 41 53 4c 20  |   6, 6, 6, ASL |
00003080  23 38 20 20 20 20 20 3b  26 20 74 68 65 6e 20 61  |#8     ;& then a|
00003090  74 74 65 6e 75 61 74 65  20 62 79 20 66 61 63 74  |ttenuate by fact|
000030a0  6f 72 20 32 35 35 2f 32  35 36 0d 0e f6 41 20 4d  |or 255/256...A M|
000030b0  4f 56 20 20 20 20 20 20  32 2c 20 31 31 2c 20 41  |OV      2, 11, A|
000030c0  53 52 20 23 31 36 20 20  20 20 20 20 3b 28 73 69  |SR #16      ;(si|
000030d0  6d 75 6c 61 74 65 20 65  6e 65 72 67 79 20 6c 6f  |mulate energy lo|
000030e0  73 73 20 6f 6e 20 63 6f  6c 6c 29 0d 0f 00 1b 20  |ss on coll).... |
000030f0  4d 4f 56 20 20 20 20 20  20 33 2c 20 36 2c 20 41  |MOV      3, 6, A|
00003100  53 52 20 23 31 36 0d 0f  0a 44 20 41 44 44 20 20  |SR #16...D ADD  |
00003110  20 20 20 20 34 2c 20 34  2c 20 23 31 20 20 20 20  |    4, 4, #1    |
00003120  20 20 20 20 20 20 20 20  3b 74 72 61 63 6b 20 68  |        ;track h|
00003130  6f 77 20 6d 61 6e 79 20  63 6f 6e 73 65 63 75 74  |ow many consecut|
00003140  69 76 65 20 66 72 61 6d  65 73 0d 0f 14 40 20 3a  |ive frames...@ :|
00003150  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00003160  20 20 20 20 20 20 20 20  20 20 20 20 3b 74 68 69  |            ;thi|
00003170  73 20 62 61 6c 6c 20 68  61 73 20 62 65 65 6e 20  |s ball has been |
00003180  73 74 75 63 6b 20 69 6e  20 61 0d 0f 1e 45 20 43  |stuck in a...E C|
00003190  4d 50 20 20 20 20 20 20  34 2c 23 32 20 20 20 20  |MP      4,#2    |
000031a0  20 20 20 20 20 20 20 20  20 20 20 20 3b 63 6f 6c  |            ;col|
000031b0  6c 69 73 69 6f 6e 20 61  6e 64 20 69 66 20 32 20  |lision and if 2 |
000031c0  6f 72 20 6d 6f 72 65 2c  20 74 72 79 20 74 6f 0d  |or more, try to.|
000031d0  0f 28 39 20 42 4c 54 20  20 20 20 20 20 6d 6f 76  |.(9 BLT      mov|
000031e0  65 6e 63 68 65 63 6b 25  20 20 20 20 20 20 20 20  |encheck%        |
000031f0  20 3b 65 73 63 61 70 65  20 69 74 20 76 69 61 20  | ;escape it via |
00003200  61 20 62 6f 64 67 65 3a  0d 0f 32 32 20 2e 62 6f  |a bodge:..22 .bo|
00003210  64 67 65 31 25 20 20 20  20 20 20 20 20 20 20 20  |dge1%           |
00003220  20 20 20 20 20 20 20 20  20 20 3b 62 6f 64 67 65  |          ;bodge|
00003230  20 62 65 67 69 6e 20 2e  2e 2e 0d 0f 3c 16 20 41  | begin .....<. A|
00003240  44 52 20 20 20 20 20 20  37 2c 20 73 65 65 64 25  |DR      7, seed%|
00003250  0d 0f 46 18 20 4c 44 4d  49 41 20 20 20 20 37 2c  |..F. LDMIA    7,|
00003260  20 7b 36 2c 20 31 31 7d  0d 0f 50 40 20 4d 4f 56  | {6, 11}..P@ MOV|
00003270  53 20 20 20 20 20 31 31  2c 20 31 31 2c 20 4c 53  |S     11, 11, LS|
00003280  52 20 23 31 20 20 20 20  20 20 3b 67 65 6e 65 72  |R #1      ;gener|
00003290  61 74 65 20 72 61 6e 64  6f 6d 20 33 32 2d 62 69  |ate random 32-bi|
000032a0  74 20 6e 75 6d 62 65 72  0d 0f 5a 17 20 4d 4f 56  |t number..Z. MOV|
000032b0  53 20 20 20 20 20 38 2c  20 36 2c 20 52 52 58 0d  |S     8, 6, RRX.|
000032c0  0f 64 18 20 41 44 43 20  20 20 20 20 20 31 31 2c  |.d. ADC      11,|
000032d0  20 31 31 2c 20 31 31 0d  0f 6e 1c 20 82 20 20 20  | 11, 11..n. .   |
000032e0  20 20 20 38 2c 20 38 2c  20 36 2c 20 4c 53 4c 20  |   8, 8, 6, LSL |
000032f0  23 31 32 0d 0f 78 1c 20  82 20 20 20 20 20 20 36  |#12..x. .      6|
00003300  2c 20 38 2c 20 38 2c 20  4c 53 52 20 23 32 30 0d  |, 8, 8, LSR #20.|
00003310  0f 82 18 20 53 54 4d 49  41 20 20 20 20 37 2c 20  |... STMIA    7, |
00003320  7b 36 2c 20 31 31 7d 0d  0f 8c 37 20 4c 44 52 20  |{6, 11}...7 LDR |
00003330  20 20 20 20 20 37 2c 20  61 73 69 6e 63 6f 73 25  |     7, asincos%|
00003340  20 20 20 20 20 20 20 20  20 3b 77 68 65 6e 20 62  |         ;when b|
00003350  61 6c 6c 73 20 67 65 74  20 73 74 75 63 6b 0d 0f  |alls get stuck..|
00003360  96 40 20 80 20 20 20 20  20 20 36 2c 20 36 2c 20  |.@ .      6, 6, |
00003370  23 32 35 35 20 20 20 20  20 20 20 20 20 20 3b 64  |#255          ;d|
00003380  75 65 20 74 6f 20 63 6f  6e 66 6c 69 63 74 20 62  |ue to conflict b|
00003390  65 74 77 65 65 6e 20 63  6f 72 72 65 63 74 0d 0f  |etween correct..|
000033a0  a0 41 20 41 44 44 20 20  20 20 20 20 37 2c 20 37  |.A ADD      7, 7|
000033b0  2c 20 36 2c 20 41 53 4c  20 23 33 20 20 20 20 20  |, 6, ASL #3     |
000033c0  3b 72 65 66 6c 65 63 74  69 6f 6e 20 26 20 73 6d  |;reflection & sm|
000033d0  61 6c 6c 20 76 65 6c 6f  63 69 74 79 20 6f 72 0d  |all velocity or.|
000033e0  0f aa 3e 20 4c 44 4d 49  41 20 20 20 20 37 2c 20  |..> LDMIA    7, |
000033f0  7b 36 2c 20 31 31 7d 20  20 20 20 20 20 20 20 20  |{6, 11}         |
00003400  20 3b 6a 61 67 67 65 64  20 6f 76 65 72 6c 61 70  | ;jagged overlap|
00003410  20 70 72 6f 62 6c 65 6d  73 20 2e 2e 2e 0d 0f b4  | problems ......|
00003420  15 20 4d 55 4c 20 20 20  20 20 20 37 2c 20 32 2c  |. MUL      7, 2,|
00003430  20 36 0d 0f be 43 20 4d  4c 41 20 20 20 20 20 20  | 6...C MLA      |
00003440  37 2c 20 33 2c 20 31 31  2c 20 37 20 20 20 20 20  |7, 3, 11, 7     |
00003450  20 20 20 20 3b 74 72 79  20 61 20 27 66 69 78 27  |    ;try a 'fix'|
00003460  20 2d 20 72 6f 74 61 74  65 20 76 65 6c 6f 63 69  | - rotate veloci|
00003470  74 79 20 62 79 0d 0f c8  40 20 4d 55 4c 20 20 20  |ty by...@ MUL   |
00003480  20 20 20 38 2c 20 32 2c  20 31 31 20 20 20 20 20  |   8, 2, 11     |
00003490  20 20 20 20 20 20 20 3b  61 20 72 61 6e 64 6f 6d  |       ;a random|
000034a0  20 61 6e 67 6c 65 2c 20  73 6f 20 65 76 65 6e 74  | angle, so event|
000034b0  75 61 6c 6c 79 0d 0f d2  41 20 4d 55 4c 20 20 20  |ually...A MUL   |
000034c0  20 20 20 39 2c 20 33 2c  20 36 20 20 20 20 20 20  |   9, 3, 6      |
000034d0  20 20 20 20 20 20 20 3b  73 68 6f 75 6c 64 20 70  |       ;should p|
000034e0  69 63 6b 20 73 6f 6d 65  20 76 65 6c 6f 63 69 74  |ick some velocit|
000034f0  79 20 74 68 61 74 0d 0f  dc 46 20 53 55 42 20 20  |y that...F SUB  |
00003500  20 20 20 20 38 2c 20 38  2c 20 39 20 20 20 20 20  |    8, 8, 9     |
00003510  20 20 20 20 20 20 20 20  3b 65 78 74 72 69 63 61  |        ;extrica|
00003520  74 65 73 20 62 61 6c 6c  20 66 72 6f 6d 20 73 74  |tes ball from st|
00003530  75 63 6b 20 70 6f 73 69  74 69 6f 6e 0d 0f e6 1a  |uck position....|
00003540  20 4d 4f 56 20 20 20 20  20 20 32 2c 20 37 2c 20  | MOV      2, 7, |
00003550  41 53 52 20 23 38 0d 0f  f0 30 20 4d 4f 56 20 20  |ASR #8...0 MOV  |
00003560  20 20 20 20 33 2c 20 38  2c 20 41 53 52 20 23 38  |    3, 8, ASR #8|
00003570  20 20 20 20 20 20 20 20  3b 2e 2e 2e 20 62 6f 64  |        ;... bod|
00003580  67 65 20 65 6e 64 0d 0f  fa 14 20 43 4d 50 20 20  |ge end.... CMP  |
00003590  20 20 20 20 34 2c 20 23  31 36 0d 10 04 19 20 42  |    4, #16.... B|
000035a0  4c 54 20 20 20 20 20 20  6d 6f 76 65 6e 63 68 65  |LT      movenche|
000035b0  63 6b 25 0d 10 0e 14 20  4d 4f 56 20 20 20 20 20  |ck%.... MOV     |
000035c0  20 50 43 2c 20 31 34 0d  10 18 06 20 3a 0d 10 22  | PC, 14.... :.."|
000035d0  24 20 2e 61 73 69 6e 63  6f 73 25 20 20 20 20 20  |$ .asincos%     |
000035e0  20 20 20 20 20 45 51 55  44 20 73 69 6e 63 6f 73  |     EQUD sincos|
000035f0  25 0d 10 2c 1d 20 2e 73  65 65 64 25 20 20 20 45  |%..,. .seed%   E|
00003600  51 55 44 20 2d 31 3a 45  51 55 44 20 2d 31 0d 10  |QUD -1:EQUD -1..|
00003610  36 46 20 2e 70 61 74 63  68 31 25 20 20 20 20 20  |6F .patch1%     |
00003620  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00003630  3b 61 20 70 61 74 63 68  20 74 6f 20 64 65 61 6c  |;a patch to deal|
00003640  20 77 69 74 68 20 63 6f  6c 6c 69 73 69 6f 6e 20  | with collision |
00003650  63 61 73 65 0d 10 40 44  20 41 44 52 20 20 20 20  |case..@D ADR    |
00003660  20 20 31 31 2c 20 61 63  6f 6c 6c 72 65 67 73 25  |  11, acollregs%|
00003670  20 20 20 20 20 20 3b 77  68 65 72 65 20 6e 6f 20  |      ;where no |
00003680  6c 69 6e 65 61 72 20 72  65 67 72 65 73 73 69 6f  |linear regressio|
00003690  6e 20 65 78 69 73 74 73  0d 10 4a 44 20 4c 44 4d  |n exists..JD LDM|
000036a0  49 41 20 20 20 20 31 31  2c 20 7b 30 2d 35 2c 31  |IA    11, {0-5,1|
000036b0  32 2c 31 33 2c 31 34 7d  20 20 3b 28 65 67 20 77  |2,13,14}  ;(eg w|
000036c0  68 65 72 65 20 63 6f 6c  6c 69 73 69 6f 6e 20 69  |here collision i|
000036d0  6e 76 6f 6c 76 65 73 20  6f 6e 6c 79 0d 10 54 2e  |nvolves only..T.|
000036e0  20 53 55 42 20 20 20 20  20 20 32 2c 20 32 2c 20  | SUB      2, 2, |
000036f0  32 2c 20 41 53 4c 20 23  38 20 20 20 20 20 3b 20  |2, ASL #8     ; |
00003700  6f 6e 65 20 70 69 78 65  6c 29 0d 10 5e 3d 20 53  |one pixel)..^= S|
00003710  55 42 20 20 20 20 20 20  33 2c 20 33 2c 20 33 2c  |UB      3, 3, 3,|
00003720  20 41 53 4c 20 23 38 20  20 20 20 20 3b 2d 20 73  | ASL #8     ;- s|
00003730  69 6d 70 6c 79 20 72 65  76 65 72 73 65 20 76 65  |imply reverse ve|
00003740  6c 6f 63 69 74 79 21 0d  10 68 1a 20 4d 4f 56 20  |locity!..h. MOV |
00003750  20 20 20 20 20 32 2c 20  32 2c 20 41 53 52 20 23  |     2, 2, ASR #|
00003760  38 0d 10 72 46 20 4d 4f  56 20 20 20 20 20 20 33  |8..rF MOV      3|
00003770  2c 20 33 2c 20 41 53 52  20 23 38 20 20 20 20 20  |, 3, ASR #8     |
00003780  20 20 20 3b 6e 62 20 61  6c 73 6f 20 61 74 74 65  |   ;nb also atte|
00003790  6e 75 61 74 65 20 62 79  20 66 61 63 74 6f 72 20  |nuate by factor |
000037a0  32 35 35 2f 32 35 36 0d  10 7c 41 20 41 44 44 20  |255/256..|A ADD |
000037b0  20 20 20 20 20 34 2c 20  34 2c 20 23 31 20 20 20  |     4, 4, #1   |
000037c0  20 20 20 20 20 20 20 20  20 3b 28 73 69 6d 75 6c  |         ;(simul|
000037d0  61 74 65 20 65 6e 65 72  67 79 20 6c 6f 73 73 20  |ate energy loss |
000037e0  6f 6e 20 63 6f 6c 6c 29  0d 10 86 12 20 43 4d 50  |on coll).... CMP|
000037f0  20 20 20 20 20 20 34 2c  23 32 0d 10 90 19 20 42  |      4,#2.... B|
00003800  4c 54 20 20 20 20 20 20  6d 6f 76 65 6e 63 68 65  |LT      movenche|
00003810  63 6b 25 0d 10 9a 46 20  42 20 20 20 20 20 20 20  |ck%...F B       |
00003820  20 62 6f 64 67 65 31 25  20 20 20 20 20 20 20 20  | bodge1%        |
00003830  20 20 20 20 20 3b 69 66  20 62 65 65 6e 20 73 74  |     ;if been st|
00003840  75 63 6b 20 69 6e 20 63  6f 6c 6c 69 73 69 6f 6e  |uck in collision|
00003850  20 66 6f 72 20 3e 3d 20  32 0d 10 a4 46 20 3a 20  | for >= 2...F : |
00003860  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00003870  20 20 20 20 20 20 20 20  20 20 20 3b 66 72 61 6d  |           ;fram|
00003880  65 73 20 67 6f 20 61 6e  64 20 61 70 70 6c 79 20  |es go and apply |
00003890  62 6f 64 67 65 64 20 27  65 73 63 61 70 65 27 0d  |bodged 'escape'.|
000038a0  10 ae 18 20 2e 61 73 71  72 74 25 20 20 45 51 55  |... .asqrt%  EQU|
000038b0  44 20 73 71 72 74 25 0d  10 b8 14 20 2e 61 6c 72  |D sqrt%.... .alr|
000038c0  63 6c 73 25 20 45 51 55  44 20 30 0d 10 c2 14 20  |cls% EQUD 0.... |
000038d0  2e 61 73 70 63 6c 73 25  20 45 51 55 44 20 30 0d  |.aspcls% EQUD 0.|
000038e0  10 cc 44 20 2e 63 6f 70  79 62 61 63 6b 25 20 20  |..D .copyback%  |
000038f0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00003900  20 3b 73 69 6d 70 6c 65  20 72 6f 75 74 69 6e 65  | ;simple routine|
00003910  20 74 6f 20 63 6c 65 61  72 20 73 63 72 65 65 6e  | to clear screen|
00003920  20 74 6f 0d 10 d6 46 20  53 54 52 20 20 20 20 20  | to...F STR     |
00003930  20 31 34 2c 20 61 6c 72  63 6c 73 25 20 20 20 20  | 14, alrcls%    |
00003940  20 20 20 20 20 3b 62 61  63 6b 67 72 6f 75 6e 64  |     ;background|
00003950  20 61 73 20 72 61 70 69  64 6c 79 20 61 73 20 70  | as rapidly as p|
00003960  6f 73 73 69 62 6c 65 20  2d 0d 10 e0 41 20 53 54  |ossible -...A ST|
00003970  52 20 20 20 20 20 20 31  33 2c 20 61 73 70 63 6c  |R      13, aspcl|
00003980  73 25 20 20 20 20 20 20  20 20 20 3b 6e 6f 74 65  |s%         ;note|
00003990  20 74 68 65 20 68 65 61  76 79 20 75 73 65 20 6f  | the heavy use o|
000039a0  66 20 4c 44 4d 2f 53 54  4d 2e 0d 10 ea 18 20 4c  |f LDM/STM..... L|
000039b0  44 52 20 20 20 20 20 20  30 2c 20 61 73 63 72 73  |DR      0, ascrs|
000039c0  74 25 0d 10 f4 1b 20 4c  44 52 20 20 20 20 20 20  |t%.... LDR      |
000039d0  31 2c 20 61 62 61 63 6b  64 61 74 61 25 0d 10 fe  |1, abackdata%...|
000039e0  15 20 4d 4f 56 20 20 20  20 20 20 32 2c 20 23 32  |. MOV      2, #2|
000039f0  30 30 0d 11 08 0e 20 2e  63 6c 73 6c 6f 6f 70 25  |00.... .clsloop%|
00003a00  0d 11 12 18 20 4c 44 4d  49 41 20 20 20 20 31 21  |.... LDMIA    1!|
00003a10  2c 20 7b 33 2d 31 34 7d  0d 11 1c 18 20 53 54 4d  |, {3-14}.... STM|
00003a20  49 41 20 20 20 20 30 21  2c 20 7b 33 2d 31 34 7d  |IA    0!, {3-14}|
00003a30  0d 11 26 18 20 4c 44 4d  49 41 20 20 20 20 31 21  |..&. LDMIA    1!|
00003a40  2c 20 7b 33 2d 31 34 7d  0d 11 30 18 20 53 54 4d  |, {3-14}..0. STM|
00003a50  49 41 20 20 20 20 30 21  2c 20 7b 33 2d 31 34 7d  |IA    0!, {3-14}|
00003a60  0d 11 3a 18 20 4c 44 4d  49 41 20 20 20 20 31 21  |..:. LDMIA    1!|
00003a70  2c 20 7b 33 2d 31 34 7d  0d 11 44 18 20 53 54 4d  |, {3-14}..D. STM|
00003a80  49 41 20 20 20 20 30 21  2c 20 7b 33 2d 31 34 7d  |IA    0!, {3-14}|
00003a90  0d 11 4e 18 20 4c 44 4d  49 41 20 20 20 20 31 21  |..N. LDMIA    1!|
00003aa0  2c 20 7b 33 2d 31 34 7d  0d 11 58 18 20 53 54 4d  |, {3-14}..X. STM|
00003ab0  49 41 20 20 20 20 30 21  2c 20 7b 33 2d 31 34 7d  |IA    0!, {3-14}|
00003ac0  0d 11 62 18 20 4c 44 4d  49 41 20 20 20 20 31 21  |..b. LDMIA    1!|
00003ad0  2c 20 7b 33 2d 31 34 7d  0d 11 6c 18 20 53 54 4d  |, {3-14}..l. STM|
00003ae0  49 41 20 20 20 20 30 21  2c 20 7b 33 2d 31 34 7d  |IA    0!, {3-14}|
00003af0  0d 11 76 18 20 4c 44 4d  49 41 20 20 20 20 31 21  |..v. LDMIA    1!|
00003b00  2c 20 7b 33 2d 31 34 7d  0d 11 80 18 20 53 54 4d  |, {3-14}.... STM|
00003b10  49 41 20 20 20 20 30 21  2c 20 7b 33 2d 31 34 7d  |IA    0!, {3-14}|
00003b20  0d 11 8a 06 20 5d 0d 11  94 0d 20 e7 20 56 47 41  |.... ].... . VGA|
00003b30  25 20 8c 0d 11 9e 0f 20  5b 4f 50 54 20 70 61 73  |% ..... [OPT pas|
00003b40  73 25 0d 11 a8 20 20 41  44 44 20 20 20 20 20 20  |s%...  ADD      |
00003b50  30 2c 20 30 2c 20 23 68  61 64 64 25 2d 68 70 69  |0, 0, #hadd%-hpi|
00003b60  78 25 0d 11 b2 06 20 5d  0d 11 bc 06 20 cd 0d 11  |x%.... ].... ...|
00003b70  c6 0f 20 5b 4f 50 54 20  70 61 73 73 25 0d 11 d0  |.. [OPT pass%...|
00003b80  16 20 53 55 42 53 20 20  20 20 20 32 2c 20 32 2c  |. SUBS     2, 2,|
00003b90  20 23 31 0d 11 da 16 20  42 4e 45 20 20 20 20 20  | #1.... BNE     |
00003ba0  20 63 6c 73 6c 6f 6f 70  25 0d 11 e4 19 20 4c 44  | clsloop%.... LD|
00003bb0  52 20 20 20 20 20 20 31  33 2c 20 61 73 70 63 6c  |R      13, aspcl|
00003bc0  73 25 0d 11 ee 19 20 4c  44 52 20 20 20 20 20 20  |s%.... LDR      |
00003bd0  50 43 2c 20 61 6c 72 63  6c 73 25 0d 11 f8 06 20  |PC, alrcls%.... |
00003be0  5d 0d 12 02 05 ed 0d 12  0c 05 e1 0d 12 16 05 3a  |]..............:|
00003bf0  0d 12 20 3c dd 20 a4 70  6c 6f 74 66 72 61 67 28  |.. <. .plotfrag(|
00003c00  70 61 73 73 25 29 20 20  20 20 3a f4 20 6d 61 63  |pass%)    :. mac|
00003c10  72 6f 20 74 6f 20 70 6c  6f 74 20 61 20 72 6f 77  |ro to plot a row|
00003c20  20 28 31 32 20 70 69 78  65 6c 73 29 0d 12 2a 2d  | (12 pixels)..*-|
00003c30  5b 4f 50 54 20 70 61 73  73 25 20 20 20 20 20 20  |[OPT pass%      |
00003c40  20 20 20 20 20 20 20 20  20 3a f4 20 6f 66 20 6f  |         :. of o|
00003c50  75 72 20 73 70 72 69 74  65 0d 12 34 45 4c 44 4d  |ur sprite..4ELDM|
00003c60  49 41 20 20 20 20 30 2c  20 7b 34 2d 36 7d 20 20  |IA    0, {4-6}  |
00003c70  20 20 20 20 20 20 20 20  20 20 20 3b 72 65 61 64  |           ;read|
00003c80  20 33 20 77 6f 72 64 73  20 6f 66 20 73 63 72 65  | 3 words of scre|
00003c90  65 6e 20 28 31 32 20 70  69 78 65 6c 73 29 0d 12  |en (12 pixels)..|
00003ca0  3e 38 4c 44 4d 49 41 20  20 20 20 31 21 2c 20 7b  |>8LDMIA    1!, {|
00003cb0  37 2d 39 7d 20 20 20 20  20 20 20 20 20 20 20 20  |7-9}            |
00003cc0  3b 72 65 61 64 20 31 32  20 73 70 72 69 74 65 20  |;read 12 sprite |
00003cd0  70 69 78 65 6c 73 0d 12  48 2d 4c 44 4d 49 41 20  |pixels..H-LDMIA |
00003ce0  20 20 20 33 21 2c 20 7b  31 30 2d 31 32 7d 20 20  |   3!, {10-12}  |
00003cf0  20 20 20 20 20 20 20 20  3b 26 20 31 32 20 6d 61  |        ;& 12 ma|
00003d00  73 6b 73 0d 12 52 40 42  49 43 20 20 20 20 20 20  |sks..R@BIC      |
00003d10  34 2c 20 34 2c 20 31 30  20 20 20 20 20 20 20 20  |4, 4, 10        |
00003d20  20 20 20 20 20 3b 61 70  70 6c 79 20 6d 61 73 6b  |     ;apply mask|
00003d30  20 74 6f 20 73 63 72 65  65 6e 2c 20 7a 65 72 6f  | to screen, zero|
00003d40  69 6e 67 0d 12 5c 3f 42  49 43 20 20 20 20 20 20  |ing..\?BIC      |
00003d50  35 2c 20 35 2c 20 31 31  20 20 20 20 20 20 20 20  |5, 5, 11        |
00003d60  20 20 20 20 20 3b 20 74  68 6f 73 65 20 62 69 74  |     ; those bit|
00003d70  73 20 77 68 65 72 65 20  77 69 6c 6c 20 77 72 69  |s where will wri|
00003d80  74 65 0d 12 66 3c 42 49  43 20 20 20 20 20 20 36  |te..f<BIC      6|
00003d90  2c 20 36 2c 20 31 32 20  20 20 20 20 20 20 20 20  |, 6, 12         |
00003da0  20 20 20 20 3b 20 73 70  72 69 74 65 20 69 6d 61  |    ; sprite ima|
00003db0  67 65 20 69 6e 20 61 20  6d 6f 6d 65 6e 74 0d 12  |ge in a moment..|
00003dc0  70 3b 84 52 20 20 20 20  20 20 34 2c 20 34 2c 20  |p;.R      4, 4, |
00003dd0  37 20 20 20 20 20 20 20  20 20 20 20 20 20 20 3b  |7              ;|
00003de0  77 72 69 74 65 20 69 6e  20 74 68 65 20 73 70 72  |write in the spr|
00003df0  69 74 65 20 69 6d 61 67  65 0d 12 7a 13 84 52 20  |ite image..z..R |
00003e00  20 20 20 20 20 35 2c 20  35 2c 20 38 0d 12 84 13  |     5, 5, 8....|
00003e10  84 52 20 20 20 20 20 20  36 2c 20 36 2c 20 39 0d  |.R      6, 6, 9.|
00003e20  12 8e 42 53 54 4d 49 41  20 20 20 20 30 21 2c 20  |..BSTMIA    0!, |
00003e30  7b 34 2d 36 7d 20 20 20  20 20 20 20 20 20 20 20  |{4-6}           |
00003e40  20 3b 72 65 73 74 6f 72  65 20 74 68 65 20 64 61  | ;restore the da|
00003e50  74 61 20 62 61 63 6b 20  74 6f 20 73 63 72 65 65  |ta back to scree|
00003e60  6e 0d 12 98 05 5d 0d 12  a2 0a 3d 70 61 73 73 25  |n....]....=pass%|
00003e70  0d 12 ac 05 3a 0d 12 b6  36 dd 20 a4 63 6f 6c 6c  |....:...6. .coll|
00003e80  66 72 61 67 28 70 61 73  73 25 29 20 20 20 20 3a  |frag(pass%)    :|
00003e90  f4 20 6d 61 63 72 6f 20  74 6f 20 63 6f 6c 6c 20  |. macro to coll |
00003ea0  63 68 65 63 6b 20 61 20  72 6f 77 0d 12 c0 39 5b  |check a row...9[|
00003eb0  4f 50 54 20 70 61 73 73  25 20 20 20 20 20 20 20  |OPT pass%       |
00003ec0  20 20 20 20 20 20 20 20  3a f4 20 28 31 32 20 70  |        :. (12 p|
00003ed0  69 78 65 6c 73 29 20 6f  66 20 6f 75 72 20 73 70  |ixels) of our sp|
00003ee0  72 69 74 65 0d 12 ca 45  4c 44 4d 49 41 20 20 20  |rite...ELDMIA   |
00003ef0  20 30 21 2c 20 7b 33 2d  35 7d 20 20 20 20 20 20  | 0!, {3-5}      |
00003f00  20 20 20 20 20 20 3b 72  65 61 64 20 33 20 77 6f  |      ;read 3 wo|
00003f10  72 64 73 20 6f 66 20 73  63 72 65 65 6e 20 28 31  |rds of screen (1|
00003f20  32 20 70 69 78 65 6c 73  29 0d 12 d4 3d 4c 44 4d  |2 pixels)...=LDM|
00003f30  49 41 20 20 20 20 31 21  2c 20 7b 38 2d 31 30 7d  |IA    1!, {8-10}|
00003f40  20 20 20 20 20 20 20 20  20 20 20 3b 72 65 61 64  |           ;read|
00003f50  20 31 32 20 73 70 72 69  74 65 20 70 69 78 65 6c  | 12 sprite pixel|
00003f60  20 6d 61 73 6b 73 0d 12  de 11 54 53 54 20 20 20  | masks....TST   |
00003f70  20 20 20 33 2c 20 38 0d  12 e8 11 54 53 54 45 51  |   3, 8....TSTEQ|
00003f80  20 20 20 20 34 2c 20 39  0d 12 f2 12 54 53 54 45  |    4, 9....TSTE|
00003f90  51 20 20 20 20 35 2c 20  31 30 0d 12 fc 44 42 4e  |Q    5, 10...DBN|
00003fa0  45 20 20 20 20 20 20 67  6f 74 63 6f 6c 6c 25 20  |E      gotcoll% |
00003fb0  20 20 20 20 20 20 20 20  20 20 20 20 3b 62 72 61  |            ;bra|
00003fc0  6e 63 68 20 74 6f 20 67  6f 74 63 6f 6c 6c 25 20  |nch to gotcoll% |
00003fd0  69 66 20 61 6e 79 20 6f  76 65 72 6c 61 70 0d 13  |if any overlap..|
00003fe0  06 44 5d 20 20 20 20 20  20 20 20 20 20 20 20 20  |.D]             |
00003ff0  20 20 20 20 20 20 20 20  20 20 20 3a f4 20 20 65  |           :.  e|
00004000  6c 73 65 20 63 6f 6e 74  69 6e 75 65 20 77 69 74  |lse continue wit|
00004010  68 20 63 6f 64 65 20 61  66 74 65 72 20 6d 61 63  |h code after mac|
00004020  72 6f 0d 13 10 0a 3d 70  61 73 73 25 0d 13 1a 05  |ro....=pass%....|
00004030  3a 0d 13 24 3d dd 20 a4  73 74 61 74 66 72 61 67  |:..$=. .statfrag|
00004040  28 70 61 73 73 25 2c 20  6d 25 29 3a f4 20 6d 61  |(pass%, m%):. ma|
00004050  63 72 6f 20 74 6f 20 61  64 64 20 69 6e 20 72 65  |cro to add in re|
00004060  67 72 65 73 73 69 6f 6e  20 73 74 61 74 73 0d 13  |gression stats..|
00004070  2e 40 5b 4f 50 54 20 70  61 73 73 25 20 20 20 20  |.@[OPT pass%    |
00004080  20 20 20 20 20 20 20 20  20 20 20 3a f4 20 66 6f  |           :. fo|
00004090  72 20 6f 6e 65 20 70 69  78 65 6c 20 28 63 6f 6f  |r one pixel (coo|
000040a0  72 64 73 20 75 28 69 29  2c 76 28 69 29 29 0d 13  |rds u(i),v(i))..|
000040b0  38 14 54 53 54 20 20 20  20 20 20 20 34 2c 20 23  |8.TST       4, #|
000040c0  6d 25 0d 13 42 14 42 45  51 20 20 20 20 20 20 20  |m%..B.BEQ       |
000040d0  50 25 2b 38 2a 34 0d 13  4c 2d 41 44 44 4e 45 20  |P%+8*4..L-ADDNE |
000040e0  20 20 20 20 36 2c 20 36  2c 20 23 31 20 20 20 20  |    6, 6, #1    |
000040f0  20 20 20 20 20 20 20 20  3b 20 6e 20 3d 20 6e 20  |        ; n = n |
00004100  2b 20 31 0d 13 56 30 41  44 44 4e 45 20 20 20 20  |+ 1..V0ADDNE    |
00004110  20 37 2c 20 37 2c 20 32  20 20 20 20 20 20 20 20  | 7, 7, 2        |
00004120  20 20 20 20 20 3b 20 75  20 3d 20 75 20 2b 20 75  |     ; u = u + u|
00004130  28 69 29 0d 13 60 30 41  44 44 4e 45 20 20 20 20  |(i)..`0ADDNE    |
00004140  20 38 2c 20 38 2c 20 33  20 20 20 20 20 20 20 20  | 8, 8, 3        |
00004150  20 20 20 20 20 3b 20 76  20 3d 20 76 20 2b 20 76  |     ; v = v + v|
00004160  28 69 29 0d 13 6a 15 41  44 44 4e 45 20 20 20 20  |(i)..j.ADDNE    |
00004170  20 35 2c 20 32 2c 20 33  0d 13 74 16 53 55 42 4e  | 5, 2, 3..t.SUBN|
00004180  45 20 20 20 20 20 31 34  2c 20 33 2c 20 32 0d 13  |E     14, 3, 2..|
00004190  7e 39 4d 4c 41 4e 45 20  20 20 20 20 39 2c 20 35  |~9MLANE     9, 5|
000041a0  2c 20 31 34 2c 20 39 20  20 20 20 20 20 20 20 20  |, 14, 9         |
000041b0  3b 20 70 20 3d 20 70 20  2b 20 76 28 69 29 5e 32  |; p = p + v(i)^2|
000041c0  2d 75 28 69 29 5e 32 0d  13 88 35 4d 4c 41 4e 45  |-u(i)^2...5MLANE|
000041d0  20 20 20 20 20 31 30 2c  20 32 2c 20 33 2c 20 31  |     10, 2, 3, 1|
000041e0  30 20 20 20 20 20 20 20  20 3b 20 71 20 3d 20 71  |0        ; q = q|
000041f0  20 2b 20 75 28 69 29 2a  76 28 69 29 0d 13 92 05  | + u(i)*v(i)....|
00004200  5d 0d 13 9c 0a 3d 70 61  73 73 25 0d 13 a6 05 3a  |]....=pass%....:|
00004210  0d 13 b0 3c dd 20 a4 64  69 76 28 70 61 73 73 25  |...<. .div(pass%|
00004220  2c 20 72 61 2c 20 72 62  2c 20 72 63 2c 20 72 64  |, ra, rb, rc, rd|
00004230  29 20 3a f4 20 6d 61 63  72 6f 20 74 6f 20 73 65  |) :. macro to se|
00004240  74 20 72 63 3d 72 61 44  49 56 72 62 0d 13 ba 0e  |t rc=raDIVrb....|
00004250  5b 4f 50 54 20 70 61 73  73 25 0d 13 c4 14 4d 4f  |[OPT pass%....MO|
00004260  56 20 20 20 20 20 20 20  72 64 2c 20 72 62 0d 13  |V       rd, rb..|
00004270  ce 1c 43 4d 50 20 20 20  20 20 20 20 72 64 2c 20  |..CMP       rd, |
00004280  72 61 2c 20 4c 53 52 20  23 31 0d 13 d8 1c 4d 4f  |ra, LSR #1....MO|
00004290  56 4c 53 20 20 20 20 20  72 64 2c 20 72 64 2c 20  |VLS     rd, rd, |
000042a0  4c 53 4c 20 23 31 0d 13  e2 1c 43 4d 50 20 20 20  |LSL #1....CMP   |
000042b0  20 20 20 20 72 64 2c 20  72 61 2c 20 4c 53 52 20  |    rd, ra, LSR |
000042c0  23 31 0d 13 ec 14 42 4c  53 20 20 20 20 20 20 20  |#1....BLS       |
000042d0  50 25 2d 32 2a 34 0d 13  f6 14 4d 4f 56 20 20 20  |P%-2*4....MOV   |
000042e0  20 20 20 20 72 63 2c 20  23 30 0d 14 00 14 43 4d  |    rc, #0....CM|
000042f0  50 20 20 20 20 20 20 20  72 61 2c 20 72 64 0d 14  |P       ra, rd..|
00004300  0a 18 53 55 42 43 53 20  20 20 20 20 72 61 2c 20  |..SUBCS     ra, |
00004310  72 61 2c 20 72 64 0d 14  14 18 41 44 43 20 20 20  |ra, rd....ADC   |
00004320  20 20 20 20 72 63 2c 20  72 63 2c 20 72 63 0d 14  |    rc, rc, rc..|
00004330  1e 1c 4d 4f 56 20 20 20  20 20 20 20 72 64 2c 20  |..MOV       rd, |
00004340  72 64 2c 20 4c 53 52 20  23 31 0d 14 28 14 43 4d  |rd, LSR #1..(.CM|
00004350  50 20 20 20 20 20 20 20  72 64 2c 20 72 62 0d 14  |P       rd, rb..|
00004360  32 14 42 48 53 20 20 20  20 20 20 20 50 25 2d 35  |2.BHS       P%-5|
00004370  2a 34 0d 14 3c 05 5d 0d  14 46 0a 3d 70 61 73 73  |*4..<.]..F.=pass|
00004380  25 0d ff                                          |%..|
00004383