Index

Here is the plain version with ECMA-48 color control functions, the game itself, and the game metadata.

This is documentation for the breakout game provided in the sixth edition of VIPER magazine. Firstly, follows is a view of the program when it is first loaded into the tool:

200-201 0512-0513 █▄▀ ▄▄▀  A2CC 41676                 I ← 0716
202-203 0514-0515  ▀▀ ▀▄█  6A06 27142                 VA ← 006
204-205 0516-0517  ▀▀   ▄█ 6103 24835                 V1 ← 003
206-207 0518-0519  ▀▀ █ ▀▀ 6B08 27400                 VB ← 008
208-209 0520-0521  ▀▀      6000 24576                 V0 ← 000
20A-20B 0522-0523 ▀▀ █   ▄ D011 53265                 Draw 08×01 at V0,V1; VF ← XOR
20C-20D 0524-0525  ▀▀▀▄    7008 28680                 V0 ← V0 + 008
20E-20F 0526-0527 ▄████▄██ 7BFF 31743                 VB ← VB + 255
210-211 0528-0529   ▀▀▀ ▀▀ 3B00 15104                 Skip next if VB = 000
212-213 0530-0531    ▀▄ █  120A 04618                 Jump to 0522
214-215 0532-0533  ▀▀▀  ▄▀ 7102 28930                 V1 ← V1 + 002
216-217 0534-0535 ▄████▄█▄ 7AFF 31487                 VA ← VA + 255
218-219 0536-0537   ▀▀▀ ▀  3A00 14848                 Skip next if VA = 000
21A-21B 0538-0539    ▀ ▄█  1206 04614                 Jump to 0518
21C-21D 0540-0541  ▀▀  ▀▀  6600 26112                 V6 ← 000
21E-21F 0542-0543  ▀▀▄ █▀▀ 6714 26388                 V7 ← 020
220-221 0544-0545 █▄▀ ▄▄▀▄ A2CD 41677                 I ← 0717
222-223 0546-0547  ▀█      6020 24608                 V0 ← 032
224-225 0548-0549  ▀▀▄▄▄▄▀ 611E 24862                 V1 ← 030
226-227 0550-0551 ▀▀ █   ▄ D011 53265                 Draw 08×01 at V0,V1; VF ← XOR
228-229 0552-0553  ▀▀▄▄▄▀█ 631D 25373                 V3 ← 029
22A-22B 0554-0555  ▀█▄▄▄█▄ 623F 25151                 V2 ← 063
22C-22D 0556-0557 ▀     █  8202 33282                 V2 ← V2 AND V0
22E-22F 0558-0559 ▄███▄███ 77FF 30719                 V7 ← V7 + 255
230-231 0560-0561  ▀   ▀▀▀ 4700 18176                 Skip next if V7 <> 000
232-233 0562-0563 ▄ ▄▀▄ █  12AA 04778                 Jump to 0682
234-235 0564-0565 ▀▀▀▀█▀█▀ FF0A 65290                 VF ← key
236-237 0566-0567 █▄▀ ▄ █▄ A2CB 41675                 I ← 0715
238-239 0568-0569 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
23A-23B 0570-0571 ▄██▄▄█▄█ 65FF 26111                 V5 ← 255
23C-23D 0572-0573 ▀▀   ▀ ▄ C401 50177                 V4 ← ??? AND 001
23E-23F 0574-0575   ▀▀ ▀ ▄ 3401 13313                 Skip next if V4 = 001
240-241 0576-0577 ▄██▄▄█▄▄ 64FF 25855                 V4 ← 255
242-243 0578-0579 █▄▀ ▄▄▀▄ A2CD 41677                 I ← 0717
244-245 0580-0581  ▀▀ ▀▀   6C00 27648                 VC ← 000
246-247 0582-0583  ▀▀ ▀█▀  6E04 28164                 VE ← 004
248-249 0584-0585 █▀█ ▀▀▀▄ EEA1 61089                 Skip next if VE <> key
24A-24B 0586-0587 ▄██▄██▄  6CFE 27902                 VC ← 254
24C-24D 0588-0589  ▀▀ ▀██  6E06 28166                 VE ← 006
24E-24F 0590-0591 █▀█ ▀▀▀▄ EEA1 61089                 Skip next if VE <> key
250-251 0592-0593  ▀▀ ▀▀▄  6C02 27650                 VC ← 002
252-253 0594-0595 ▀▀ █   ▄ D011 53265                 Draw 08×01 at V0,V1; VF ← XOR
254-255 0596-0597 █▄   ▄   80C4 32964                 V0 ← V0 + VC; VF ← overflow
256-257 0598-0599 ▀▀ █   ▄ D011 53265                 Draw 08×01 at V0,V1; VF ← XOR
258-259 0600-0601  ▀  ▀▀▀█ 4F01 20225                 Skip next if VF <> 001
25A-25B 0602-0603 ▄  █▄ ▀  1298 04760                 Jump to 0664
25C-25D 0604-0605  ▀    ▀  4200 16896                 Skip next if V2 <> 000
25E-25F 0606-0607  ▀▀  ▀ ▄ 6401 25601                 V4 ← 001
260-261 0608-0609  ▀▄▄▄▄█▄ 423F 16959                 Skip next if V2 <> 063
262-263 0610-0611 ▄██▄▄█▄▄ 64FF 25855                 V4 ← 255
264-265 0612-0613  ▀    ▀▀ 4300 17152                 Skip next if V3 <> 000
266-267 0614-0615 ▄▄ ▀▄▄█  12CE 04814                 Jump to 0718
268-269 0616-0617  ▀ ▄▄▄██ 431F 17183                 Skip next if V3 <> 031
26A-26B 0618-0619 ▄ ▄▀ ▄▀  12A4 04772                 Jump to 0676
26C-26D 0620-0621 █▄▀ ▄ █▄ A2CB 41675                 I ← 0715
26E-26F 0622-0623 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
270-271 0624-0625 ▀▄   ▄▀  8244 33348                 V2 ← V2 + V4; VF ← overflow
272-273 0626-0627 ▀▄ ▄ ▄▀▀ 8354 33620                 V3 ← V3 + V5; VF ← overflow
274-275 0628-0629 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
276-277 0630-0631   ▀▀▀▀▀█ 3F01 16129                 Skip next if VF = 001
278-279 0632-0633  ▄ ▀  █  1242 04674                 Jump to 0578
27A-27B 0634-0635  ▀ ▄▄▄█▀ 431E 17182                 Skip next if V3 <> 030
27C-27D 0636-0637 ▄  █▄ ▀  1298 04760                 Jump to 0664
27E-27F 0638-0639  ▀▀ ▀ █  6A02 27138                 VA ← 002
280-281 0640-0641 ▀▀▀██ ▀  FA18 64024                 sound ← VA
282-283 0642-0643  ▀▀▀ ▀▀▄ 7601 30209                 V6 ← V6 + 001
284-285 0644-0645 █▄▀ ▄ █  A2CA 41674                 I ← 0714
286-287 0646-0647 ▄  ▀▄ ▀  1288 04744                 Jump to 0648
288-289 0648-0649 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
28A-28B 0650-0651 ▀▀   ▀ ▄ C401 50177                 V4 ← ??? AND 001
28C-28D 0652-0653   ▀▀ ▀ ▄ 3401 13313                 Skip next if V4 = 001
28E-28F 0654-0655 ▄██▄▄█▄▄ 64FF 25855                 V4 ← 255
290-291 0656-0657 ▀▀   ▀ █ C501 50433                 V5 ← ??? AND 001
292-293 0658-0659   ▀▀ ▀ █ 3501 13569                 Skip next if V5 = 001
294-295 0660-0661  ▀▀  ▀ █ 6501 25857                 V5 ← 001
296-297 0662-0663  ▄ ▀  █  1242 04674                 Jump to 0578
298-299 0664-0665  ▀▀ ▀ █▄ 6A03 27139                 VA ← 003
29A-29B 0666-0667 ▀▀▀██ ▀  FA18 64024                 sound ← VA
29C-29D 0668-0669 █▄▀ ▄ █▄ A2CB 41675                 I ← 0715
29E-29F 0670-0671 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
2A0-2A1 0672-0673 ▄███▄▄██ 73FF 29695                 V3 ← V3 + 255
2A2-2A3 0674-0675   ▄█ ▄█  1236 04662                 Jump to 0566
2A4-2A5 0676-0677 █▄▀ ▄ █▄ A2CB 41675                 I ← 0715
2A6-2A7 0678-0679 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
2A8-2A9 0680-0681   ▄▀▄ ▀  1228 04648                 Jump to 0552
2AA-2AB 0682-0683 █▄▀ ▄▄▀▄ A2CD 41677                 I ← 0717
2AC-2AD 0684-0685 ▀▀ █   ▄ D011 53265                 Draw 08×01 at V0,V1; VF ← XOR
2AE-2AF 0686-0687 █▄█▄  ▀  A2F0 41712                 I ← 0752
2B0-2B1 0688-0689 ▀▀██ ▀█▄ F633 63027                 V6 as BCD stored from I
2B2-2B3 0690-0691 ▀██▀ ▄▀▄ F265 62053                 Load V0→V2; I ← I + 03
2B4-2B5 0692-0693  ▀▀▄▄ ▀▀ 6318 25368                 V3 ← 024
2B6-2B7 0694-0695  ▀▀▄▄▀▄▄ 641B 25627                 V4 ← 027
2B8-2B9 0696-0697 ▀▀█▀▄  ▄ F029 61481                 I ← digit sprite of V0
2BA-2BB 0698-0699 ▀█ ▀ ▄▀█ D345 54085                 Draw 08×05 at V3,V4; VF ← XOR
2BC-2BD 0700-0701  ▀▀▀ ▄▀█ 7305 29445                 V3 ← V3 + 005
2BE-2BF 0702-0703 ▀▀█▀▄  █ F129 61737                 I ← digit sprite of V1
2C0-2C1 0704-0705 ▀█ ▀ ▄▀█ D345 54085                 Draw 08×05 at V3,V4; VF ← XOR
2C2-2C3 0706-0707  ▀▀▀ ▄▀█ 7305 29445                 V3 ← V3 + 005
2C4-2C5 0708-0709 ▀▀█▀▄ ▀▄ F229 61993                 I ← digit sprite of V2
2C6-2C7 0710-0711 ▀█ ▀ ▄▀█ D345 54085                 Draw 08×05 at V3,V4; VF ← XOR
2C8-2C9 0712-0713 ▄▄ ▀▄ ▀  12C8 04808                 Jump to 0712
2CA-2CB 0714-0715 █▀▀▀     F080 61568
2CC-2CD 0716-0717 ████████ FFFF 65535
2CE-2CF 0718-0719 █▄▀▄▄▄█  A2DE 41694                 I ← 0734
2D0-2D1 0720-0721  ▀▀▄ ▄▀█ 6315 25365                 V3 ← 021
2D2-2D3 0722-0723  ▀▀▄  ▀  6210 25104                 V2 ← 016
2D4-2D5 0724-0725 ▀▀▄▀ ▄▀█ D325 54053                 Draw 08×05 at V3,V2; VF ← XOR
2D6-2D7 0726-0727 █▄█   █▄ A2E3 41699                 I ← 0739
2D8-2D9 0728-0729  ▀▀▄▄▄▀█ 631D 25373                 V3 ← 029
2DA-2DB 0730-0731 ▀▀▄▀ ▄▀█ D325 54053                 Draw 08×05 at V3,V2; VF ← XOR
2DC-2DD 0732-0733 ▄ ▄▀▄ █  12AA 04778                 Jump to 0682
2DE-2DF 0734-0735 █▀▀ █▀█  EE8A 61066
2E0-2E1 0736-0737 █▀  ██▀  CE8C 52876                 VE ← ??? AND 140
2E2-2E3 0738-0739 █▄▄ █▄█  8AEE 35566                 VA ← VE × 2; VF ← MSB
2E4-2E5 0740-0741 █▄  █▄   88CC 35020
2E6-2E7 0742-0743 █▄▄ █▄▄  88EE 35054                 V8 ← VE × 2; VF ← MSB

Follows now is the fully annotated view of the program when it is loaded into the tool:

200-201 0512-0513 █▄▀ ▄▄▀  A2CC 41676                 I ← wall
202-203 0514-0515  ▀▀ ▀▄█  6A06 27142                 VA ← 006
204-205 0516-0517  ▀▀   ▄█ 6103 24835                 V1 ← 003
206-207 0518-0519  ▀▀ █ ▀▀ 6B08 27400       start row VB ← 008
208-209 0520-0521  ▀▀      6000 24576                 V0 ← 000
20A-20B 0522-0523 ▀▀ █   ▄ D011 53265        draw row Draw 08×01 at V0,V1; VF ← XOR
20C-20D 0524-0525  ▀▀▀▄    7008 28680                 V0 ← V0 + 008
20E-20F 0526-0527 ▄████▄██ 7BFF 31743                 VB ← VB + 255
210-211 0528-0529   ▀▀▀ ▀▀ 3B00 15104                 Skip next if VB = 000
212-213 0530-0531    ▀▄ █  120A 04618                 Jump to draw row
214-215 0532-0533  ▀▀▀  ▄▀ 7102 28930                 V1 ← V1 + 002
216-217 0534-0535 ▄████▄█▄ 7AFF 31487                 VA ← VA + 255
218-219 0536-0537   ▀▀▀ ▀  3A00 14848                 Skip next if VA = 000
21A-21B 0538-0539    ▀ ▄█  1206 04614                 Jump to start row
21C-21D 0540-0541  ▀▀  ▀▀  6600 26112                 V6 ← 000
21E-21F 0542-0543  ▀▀▄ █▀▀ 6714 26388                 V7 ← 020
220-221 0544-0545 █▄▀ ▄▄▀▄ A2CD 41677                 I ← paddle
222-223 0546-0547  ▀█      6020 24608                 V0 ← 032
224-225 0548-0549  ▀▀▄▄▄▄▀ 611E 24862                 V1 ← 030
226-227 0550-0551 ▀▀ █   ▄ D011 53265                 Draw 08×01 at V0,V1; VF ← XOR
228-229 0552-0553  ▀▀▄▄▄▀█ 631D 25373           serve V3 ← 029
22A-22B 0554-0555  ▀█▄▄▄█▄ 623F 25151                 V2 ← 063
22C-22D 0556-0557 ▀     █  8202 33282                 V2 ← V2 AND V0
22E-22F 0558-0559 ▄███▄███ 77FF 30719                 V7 ← V7 + 255
230-231 0560-0561  ▀   ▀▀▀ 4700 18176                 Skip next if V7 <> 000
232-233 0562-0563 ▄ ▄▀▄ █  12AA 04778                 Jump to end
234-235 0564-0565 ▀▀▀▀█▀█▀ FF0A 65290                 VF ← key
236-237 0566-0567 █▄▀ ▄ █▄ A2CB 41675            play I ← ball
238-239 0568-0569 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
23A-23B 0570-0571 ▄██▄▄█▄█ 65FF 26111                 V5 ← 255
23C-23D 0572-0573 ▀▀   ▀ ▄ C401 50177                 V4 ← ??? AND 001
23E-23F 0574-0575   ▀▀ ▀ ▄ 3401 13313                 Skip next if V4 = 001
240-241 0576-0577 ▄██▄▄█▄▄ 64FF 25855                 V4 ← 255
242-243 0578-0579 █▄▀ ▄▄▀▄ A2CD 41677            move I ← paddle
244-245 0580-0581  ▀▀ ▀▀   6C00 27648                 VC ← 000
246-247 0582-0583  ▀▀ ▀█▀  6E04 28164                 VE ← 004
248-249 0584-0585 █▀█ ▀▀▀▄ EEA1 61089                 Skip next if VE <> key
24A-24B 0586-0587 ▄██▄██▄  6CFE 27902                 VC ← 254
24C-24D 0588-0589  ▀▀ ▀██  6E06 28166                 VE ← 006
24E-24F 0590-0591 █▀█ ▀▀▀▄ EEA1 61089                 Skip next if VE <> key
250-251 0592-0593  ▀▀ ▀▀▄  6C02 27650                 VC ← 002
252-253 0594-0595 ▀▀ █   ▄ D011 53265                 Draw 08×01 at V0,V1; VF ← XOR
254-255 0596-0597 █▄   ▄   80C4 32964                 V0 ← V0 + VC; VF ← overflow
256-257 0598-0599 ▀▀ █   ▄ D011 53265                 Draw 08×01 at V0,V1; VF ← XOR
258-259 0600-0601  ▀  ▀▀▀█ 4F01 20225                 Skip next if VF <> 001
25A-25B 0602-0603 ▄  █▄ ▀  1298 04760                 Jump to hit
25C-25D 0604-0605  ▀    ▀  4200 16896                 Skip next if V2 <> 000
25E-25F 0606-0607  ▀▀  ▀ ▄ 6401 25601                 V4 ← 001
260-261 0608-0609  ▀▄▄▄▄█▄ 423F 16959                 Skip next if V2 <> 063
262-263 0610-0611 ▄██▄▄█▄▄ 64FF 25855                 V4 ← 255
264-265 0612-0613  ▀    ▀▀ 4300 17152                 Skip next if V3 <> 000
266-267 0614-0615 ▄▄ ▀▄▄█  12CE 04814                 Jump to draw free
268-269 0616-0617  ▀ ▄▄▄██ 431F 17183                 Skip next if V3 <> 031
26A-26B 0618-0619 ▄ ▄▀ ▄▀  12A4 04772                 Jump to dropped
26C-26D 0620-0621 █▄▀ ▄ █▄ A2CB 41675                 I ← ball
26E-26F 0622-0623 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
270-271 0624-0625 ▀▄   ▄▀  8244 33348                 V2 ← V2 + V4; VF ← overflow
272-273 0626-0627 ▀▄ ▄ ▄▀▀ 8354 33620                 V3 ← V3 + V5; VF ← overflow
274-275 0628-0629 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
276-277 0630-0631   ▀▀▀▀▀█ 3F01 16129                 Skip next if VF = 001
278-279 0632-0633  ▄ ▀  █  1242 04674                 Jump to move
27A-27B 0634-0635  ▀ ▄▄▄█▀ 431E 17182                 Skip next if V3 <> 030
27C-27D 0636-0637 ▄  █▄ ▀  1298 04760                 Jump to hit
27E-27F 0638-0639  ▀▀ ▀ █  6A02 27138                 VA ← 002
280-281 0640-0641 ▀▀▀██ ▀  FA18 64024                 sound ← VA
282-283 0642-0643  ▀▀▀ ▀▀▄ 7601 30209                 V6 ← V6 + 001
284-285 0644-0645 █▄▀ ▄ █  A2CA 41674                 I ← damage
286-287 0646-0647 ▄  ▀▄ ▀  1288 04744                 Jump to next
288-289 0648-0649 ▀▀▄█  ▀▄ D231 53809            next Draw 08×01 at V2,V3; VF ← XOR
28A-28B 0650-0651 ▀▀   ▀ ▄ C401 50177                 V4 ← ??? AND 001
28C-28D 0652-0653   ▀▀ ▀ ▄ 3401 13313                 Skip next if V4 = 001
28E-28F 0654-0655 ▄██▄▄█▄▄ 64FF 25855                 V4 ← 255
290-291 0656-0657 ▀▀   ▀ █ C501 50433                 V5 ← ??? AND 001
292-293 0658-0659   ▀▀ ▀ █ 3501 13569                 Skip next if V5 = 001
294-295 0660-0661  ▀▀  ▀ █ 6501 25857                 V5 ← 001
296-297 0662-0663  ▄ ▀  █  1242 04674                 Jump to move
298-299 0664-0665  ▀▀ ▀ █▄ 6A03 27139             hit VA ← 003
29A-29B 0666-0667 ▀▀▀██ ▀  FA18 64024                 sound ← VA
29C-29D 0668-0669 █▄▀ ▄ █▄ A2CB 41675                 I ← ball
29E-29F 0670-0671 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
2A0-2A1 0672-0673 ▄███▄▄██ 73FF 29695                 V3 ← V3 + 255
2A2-2A3 0674-0675   ▄█ ▄█  1236 04662                 Jump to play
2A4-2A5 0676-0677 █▄▀ ▄ █▄ A2CB 41675         dropped I ← ball
2A6-2A7 0678-0679 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
2A8-2A9 0680-0681   ▄▀▄ ▀  1228 04648                 Jump to serve
2AA-2AB 0682-0683 █▄▀ ▄▄▀▄ A2CD 41677             end I ← paddle
2AC-2AD 0684-0685 ▀▀ █   ▄ D011 53265                 Draw 08×01 at V0,V1; VF ← XOR
2AE-2AF 0686-0687 █▄█▄  ▀  A2F0 41712                 I ← 0752
2B0-2B1 0688-0689 ▀▀██ ▀█▄ F633 63027                 V6 as BCD stored from I
2B2-2B3 0690-0691 ▀██▀ ▄▀▄ F265 62053                 Load V0→V2; I ← I + 03
2B4-2B5 0692-0693  ▀▀▄▄ ▀▀ 6318 25368                 V3 ← 024
2B6-2B7 0694-0695  ▀▀▄▄▀▄▄ 641B 25627                 V4 ← 027
2B8-2B9 0696-0697 ▀▀█▀▄  ▄ F029 61481                 I ← digit sprite of V0
2BA-2BB 0698-0699 ▀█ ▀ ▄▀█ D345 54085                 Draw 08×05 at V3,V4; VF ← XOR
2BC-2BD 0700-0701  ▀▀▀ ▄▀█ 7305 29445                 V3 ← V3 + 005
2BE-2BF 0702-0703 ▀▀█▀▄  █ F129 61737                 I ← digit sprite of V1
2C0-2C1 0704-0705 ▀█ ▀ ▄▀█ D345 54085                 Draw 08×05 at V3,V4; VF ← XOR
2C2-2C3 0706-0707  ▀▀▀ ▄▀█ 7305 29445                 V3 ← V3 + 005
2C4-2C5 0708-0709 ▀▀█▀▄ ▀▄ F229 61993                 I ← digit sprite of V2
2C6-2C7 0710-0711 ▀█ ▀ ▄▀█ D345 54085                 Draw 08×05 at V3,V4; VF ← XOR
2C8-2C9 0712-0713 ▄▄ ▀▄ ▀  12C8 04808            self Jump to self
2CA     0714      ████       F0   240          damage
2CB     0715      █          80   128            ball
2CC     0716      ████████   FF   255            wall
2CD     0717      ████████   FF   255          paddle
2CE-2CF 0718-0719 █▄▀▄▄▄█  A2DE 41694       draw free I ← fr
2D0-2D1 0720-0721  ▀▀▄ ▄▀█ 6315 25365                 V3 ← 021
2D2-2D3 0722-0723  ▀▀▄  ▀  6210 25104                 V2 ← 016
2D4-2D5 0724-0725 ▀▀▄▀ ▄▀█ D325 54053                 Draw 08×05 at V3,V2; VF ← XOR
2D6-2D7 0726-0727 █▄█   █▄ A2E3 41699                 I ← ee
2D8-2D9 0728-0729  ▀▀▄▄▄▀█ 631D 25373                 V3 ← 029
2DA-2DB 0730-0731 ▀▀▄▀ ▄▀█ D325 54053                 Draw 08×05 at V3,V2; VF ← XOR
2DC-2DD 0732-0733 ▄ ▄▀▄ █  12AA 04778                 Jump to end
2DE     0734      ███ ███    EE   238              fr
2DF     0735      █   █ █    8A   138
2E0     0736      ██  ███    CE   206
2E1     0737      █   ██     8C   140
2E2     0738      █   █ █    8A   138
2E3     0739      ███ ███    EE   238              ee
2E4     0740      █   █      88   136
2E5     0741      ██  ██     CC   204
2E6     0742      █   █      88   136
2E7     0743      ███ ███    EE   238

The register usage is as follows:

  1. V0 Contain horizontal coordinates to draw a row across the screen; contain the horizontal position of the paddle.
  2. V1 Contain vertical coordinates to draw a row on the screen; contain the vertical position of the paddle.
  3. V2 Contain the horizontal position of the ball; contain the vertical position of the free message.
  4. V3 Contain the vertical position of the ball; contain the horizontal position of the score and the free message.
  5. V4 Contain the horizontal movement of the ball; contain the vertical position of the score.
  6. V5 Contain the vertical movement of the ball.
  7. V6 Contain the score.
  8. V7 Contain the number of permitted tries.
  9. V8 Unused.
  10. V9 Unused.
  11. VA Contain the number of breakable rows; manipulating the sound register.
  12. VB Contain a count used to draw a row across the screen.
  13. VC Contain horizontal movement information for the paddle.
  14. VD Unused.
  15. VE Contain key codes for input.
  16. VF Contain unused input; collision detection.

The game begins by drawing the walls; it does so by initializing registers one and ten and then begins a loop to draw each individual row by initializing registers zero and eleven:

200-201 0512-0513 █▄▀ ▄▄▀  A2CC 41676                 I ← wall
202-203 0514-0515  ▀▀ ▀▄█  6A06 27142                 VA ← 006
204-205 0516-0517  ▀▀   ▄█ 6103 24835                 V1 ← 003
206-207 0518-0519  ▀▀ █ ▀▀ 6B08 27400       start row VB ← 008
208-209 0520-0521  ▀▀      6000 24576                 V0 ← 000

This loop draws a single row of the walls:

20A-20B 0522-0523 ▀▀ █   ▄ D011 53265        draw row Draw 08×01 at V0,V1; VF ← XOR
20C-20D 0524-0525  ▀▀▀▄    7008 28680                 V0 ← V0 + 008
20E-20F 0526-0527 ▄████▄██ 7BFF 31743                 VB ← VB + 255
210-211 0528-0529   ▀▀▀ ▀▀ 3B00 15104                 Skip next if VB = 000
212-213 0530-0531    ▀▄ █  120A 04618                 Jump to draw row

Walls have space between them and this outer loop draws any remaining rows:

214-215 0532-0533  ▀▀▀  ▄▀ 7102 28930                 V1 ← V1 + 002
216-217 0534-0535 ▄████▄█▄ 7AFF 31487                 VA ← VA + 255
218-219 0536-0537   ▀▀▀ ▀  3A00 14848                 Skip next if VA = 000
21A-21B 0538-0539    ▀ ▄█  1206 04614                 Jump to start row

The score and remaining tries are initialized and the paddle is put in place appropriately:

21C-21D 0540-0541  ▀▀  ▀▀  6600 26112                 V6 ← 000
21E-21F 0542-0543  ▀▀▄ █▀▀ 6714 26388                 V7 ← 020
220-221 0544-0545 █▄▀ ▄▄▀▄ A2CD 41677                 I ← paddle
222-223 0546-0547  ▀█      6020 24608                 V0 ← 032
224-225 0548-0549  ▀▀▄▄▄▄▀ 611E 24862                 V1 ← 030
226-227 0550-0551 ▀▀ █   ▄ D011 53265                 Draw 08×01 at V0,V1; VF ← XOR

The ball's coordinates are initialized; note that the ball is always placed with horizontal coordinates equal to those of the paddle. A try is lost and a test is then done to determine if the game is finished. Lastly, the game hangs waiting for any key press, to begin:

228-229 0552-0553  ▀▀▄▄▄▀█ 631D 25373           serve V3 ← 029
22A-22B 0554-0555  ▀█▄▄▄█▄ 623F 25151                 V2 ← 063
22C-22D 0556-0557 ▀     █  8202 33282                 V2 ← V2 AND V0
22E-22F 0558-0559 ▄███▄███ 77FF 30719                 V7 ← V7 + 255
230-231 0560-0561  ▀   ▀▀▀ 4700 18176                 Skip next if V7 <> 000
232-233 0562-0563 ▄ ▄▀▄ █  12AA 04778                 Jump to end
234-235 0564-0565 ▀▀▀▀█▀█▀ FF0A 65290                 VF ← key

The ball is then drawn and set to go upwards, but left or right by chance. The ball moves in units of one:

236-237 0566-0567 █▄▀ ▄ █▄ A2CB 41675            play I ← ball
238-239 0568-0569 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
23A-23B 0570-0571 ▄██▄▄█▄█ 65FF 26111                 V5 ← 255
23C-23D 0572-0573 ▀▀   ▀ ▄ C401 50177                 V4 ← ??? AND 001
23E-23F 0574-0575   ▀▀ ▀ ▄ 3401 13313                 Skip next if V4 = 001
240-241 0576-0577 ▄██▄▄█▄▄ 64FF 25855                 V4 ← 255

Next, the paddle's horizontal delta is obtained by testing for keys four and six to move left and right, respectively. The paddle moves in units of two, meaning it moves twice as fast as the ball. In the case of neither key, there is no movement:

242-243 0578-0579 █▄▀ ▄▄▀▄ A2CD 41677            move I ← paddle
244-245 0580-0581  ▀▀ ▀▀   6C00 27648                 VC ← 000
246-247 0582-0583  ▀▀ ▀█▀  6E04 28164                 VE ← 004
248-249 0584-0585 █▀█ ▀▀▀▄ EEA1 61089                 Skip next if VE <> key
24A-24B 0586-0587 ▄██▄██▄  6CFE 27902                 VC ← 254
24C-24D 0588-0589  ▀▀ ▀██  6E06 28166                 VE ← 006
24E-24F 0590-0591 █▀█ ▀▀▀▄ EEA1 61089                 Skip next if VE <> key
250-251 0592-0593  ▀▀ ▀▀▄  6C02 27650                 VC ← 002

The paddle is then drawn to erase it, the horizontal delta is added, and it is drawn in its new position:

252-253 0594-0595 ▀▀ █   ▄ D011 53265                 Draw 08×01 at V0,V1; VF ← XOR
254-255 0596-0597 █▄   ▄   80C4 32964                 V0 ← V0 + VC; VF ← overflow
256-257 0598-0599 ▀▀ █   ▄ D011 53265                 Draw 08×01 at V0,V1; VF ← XOR

If the paddle hit the ball, the hit routine is entered. It's noteworthy that 3F00, and so skipping if register fifteen was zero, would have been the better instruction to use here, as some CHIP-8 implementations don't necessarily return one under collision:

258-259 0600-0601  ▀  ▀▀▀█ 4F01 20225                 Skip next if VF <> 001
25A-25B 0602-0603 ▄  █▄ ▀  1298 04760                 Jump to hit

The horizontal bounds of the ball are then checked and the horizontal delta is adjusted accordingly to send it towards the other:

25C-25D 0604-0605  ▀    ▀  4200 16896                 Skip next if V2 <> 000
25E-25F 0606-0607  ▀▀  ▀ ▄ 6401 25601                 V4 ← 001
260-261 0608-0609  ▀▄▄▄▄█▄ 423F 16959                 Skip next if V2 <> 063
262-263 0610-0611 ▄██▄▄█▄▄ 64FF 25855                 V4 ← 255

The vertical bounds of the ball are then checked; if the ball titularly breaks out, the draw free routine is entered; if the ball goes to the sole row below the paddle, the dropped routine is entered, instead:

264-265 0612-0613  ▀    ▀▀ 4300 17152                 Skip next if V3 <> 000
266-267 0614-0615 ▄▄ ▀▄▄█  12CE 04814                 Jump to draw free
268-269 0616-0617  ▀ ▄▄▄██ 431F 17183                 Skip next if V3 <> 031
26A-26B 0618-0619 ▄ ▄▀ ▄▀  12A4 04772                 Jump to dropped

If neither case applies, the ball is then drawn to erase it, the deltas are added, and it is drawn in its new position:

26C-26D 0620-0621 █▄▀ ▄ █▄ A2CB 41675                 I ← ball
26E-26F 0622-0623 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
270-271 0624-0625 ▀▄   ▄▀  8244 33348                 V2 ← V2 + V4; VF ← overflow
272-273 0626-0627 ▀▄ ▄ ▄▀▀ 8354 33620                 V3 ← V3 + V5; VF ← overflow
274-275 0628-0629 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR

The ball is then checked for collision with the paddle, the game again checking for equivalence with one instead of unequality with zero. If there's no collision, the move routine is re-entered. If the vertical position of the ball is thirty, that means it hit the paddle and so the hit routine is entered:

276-277 0630-0631   ▀▀▀▀▀█ 3F01 16129                 Skip next if VF = 001
278-279 0632-0633  ▄ ▀  █  1242 04674                 Jump to move
27A-27B 0634-0635  ▀ ▄▄▄█▀ 431E 17182                 Skip next if V3 <> 030
27C-27D 0636-0637 ▄  █▄ ▀  1298 04760                 Jump to hit

If neither case applies, the ball hit a wall. A sound lasting 1/30 of a second is used, the score is incremented, and the game wastes space by jumping to the following instruction:

27E-27F 0638-0639  ▀▀ ▀ █  6A02 27138                 VA ← 002
280-281 0640-0641 ▀▀▀██ ▀  FA18 64024                 sound ← VA
282-283 0642-0643  ▀▀▀ ▀▀▄ 7601 30209                 V6 ← V6 + 001
284-285 0644-0645 █▄▀ ▄ █  A2CA 41674                 I ← damage
286-287 0646-0647 ▄  ▀▄ ▀  1288 04744                 Jump to next

The damage to the wall is drawn where the ball is located. The horizontal delta of the ball is again randomly selected in the same manner; space could be saved by having this as a routine or arranging it where only one copy need exist:

288-289 0648-0649 ▀▀▄█  ▀▄ D231 53809            next Draw 08×01 at V2,V3; VF ← XOR
28A-28B 0650-0651 ▀▀   ▀ ▄ C401 50177                 V4 ← ??? AND 001
28C-28D 0652-0653   ▀▀ ▀ ▄ 3401 13313                 Skip next if V4 = 001
28E-28F 0654-0655 ▄██▄▄█▄▄ 64FF 25855                 V4 ← 255

Register five is then wastefully set to one and the move routine is re-entered; unconditional flow would have made this easier to understand as being wastful:

290-291 0656-0657 ▀▀   ▀ █ C501 50433                 V5 ← ??? AND 001
292-293 0658-0659   ▀▀ ▀ █ 3501 13569                 Skip next if V5 = 001
294-295 0660-0661  ▀▀  ▀ █ 6501 25857                 V5 ← 001
296-297 0662-0663  ▄ ▀  █  1242 04674                 Jump to move

The hit routine sounds for 1/20 of a second, draws the ball to erase it, and adjusts the ball to be one higher before re-entering the play routine:

298-299 0664-0665  ▀▀ ▀ █▄ 6A03 27139             hit VA ← 003
29A-29B 0666-0667 ▀▀▀██ ▀  FA18 64024                 sound ← VA
29C-29D 0668-0669 █▄▀ ▄ █▄ A2CB 41675                 I ← ball
29E-29F 0670-0671 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
2A0-2A1 0672-0673 ▄███▄▄██ 73FF 29695                 V3 ← V3 + 255
2A2-2A3 0674-0675   ▄█ ▄█  1236 04662                 Jump to play

The dropped routine erases the ball and re-enters the serve routine to begin anew:

2A4-2A5 0676-0677 █▄▀ ▄ █▄ A2CB 41675         dropped I ← ball
2A6-2A7 0678-0679 ▀▀▄█  ▀▄ D231 53809                 Draw 08×01 at V2,V3; VF ← XOR
2A8-2A9 0680-0681   ▄▀▄ ▀  1228 04648                 Jump to serve

The end routine erases the paddle, uses an area a small ways beyond the program as scratch space, and displays the score in the middle of the screen before entering an infinite loop to finish:

2AA-2AB 0682-0683 █▄▀ ▄▄▀▄ A2CD 41677             end I ← paddle
2AC-2AD 0684-0685 ▀▀ █   ▄ D011 53265                 Draw 08×01 at V0,V1; VF ← XOR
2AE-2AF 0686-0687 █▄█▄  ▀  A2F0 41712                 I ← 0752
2B0-2B1 0688-0689 ▀▀██ ▀█▄ F633 63027                 V6 as BCD stored from I
2B2-2B3 0690-0691 ▀██▀ ▄▀▄ F265 62053                 Load V0→V2; I ← I + 03
2B4-2B5 0692-0693  ▀▀▄▄ ▀▀ 6318 25368                 V3 ← 024
2B6-2B7 0694-0695  ▀▀▄▄▀▄▄ 641B 25627                 V4 ← 027
2B8-2B9 0696-0697 ▀▀█▀▄  ▄ F029 61481                 I ← digit sprite of V0
2BA-2BB 0698-0699 ▀█ ▀ ▄▀█ D345 54085                 Draw 08×05 at V3,V4; VF ← XOR
2BC-2BD 0700-0701  ▀▀▀ ▄▀█ 7305 29445                 V3 ← V3 + 005
2BE-2BF 0702-0703 ▀▀█▀▄  █ F129 61737                 I ← digit sprite of V1
2C0-2C1 0704-0705 ▀█ ▀ ▄▀█ D345 54085                 Draw 08×05 at V3,V4; VF ← XOR
2C2-2C3 0706-0707  ▀▀▀ ▄▀█ 7305 29445                 V3 ← V3 + 005
2C4-2C5 0708-0709 ▀▀█▀▄ ▀▄ F229 61993                 I ← digit sprite of V2
2C6-2C7 0710-0711 ▀█ ▀ ▄▀█ D345 54085                 Draw 08×05 at V3,V4; VF ← XOR
2C8-2C9 0712-0713 ▄▄ ▀▄ ▀  12C8 04808            self Jump to self

The game is followed by the sprite data for damage, the ball, the wall, and the paddle. It is figured that the wall and paddle were made distinct to permit easy customization. It is noteworthy that space could be saved by drawing the entirety of the wall in one loop, with a repetitive and taller wall sprite, rather than two loops with the single high that is used; this would also permit easy customization of the wall pattern:

2CA     0714      ████       F0   240          damage
2CB     0715      █          80   128            ball
2CC     0716      ████████   FF   255            wall
2CD     0717      ████████   FF   255          paddle

The draw free routine is only entered if the player has won by freeing the ball. The word free is drawn to be placed above the score when the routine jumps to the end routine. It is noteworthy that the program could be made smaller by simply moving draw free to fall into end, instead:

2CE-2CF 0718-0719 █▄▀▄▄▄█  A2DE 41694       draw free I ← fr
2D0-2D1 0720-0721  ▀▀▄ ▄▀█ 6315 25365                 V3 ← 021
2D2-2D3 0722-0723  ▀▀▄  ▀  6210 25104                 V2 ← 016
2D4-2D5 0724-0725 ▀▀▄▀ ▄▀█ D325 54053                 Draw 08×05 at V3,V2; VF ← XOR
2D6-2D7 0726-0727 █▄█   █▄ A2E3 41699                 I ← ee
2D8-2D9 0728-0729  ▀▀▄▄▄▀█ 631D 25373                 V3 ← 029
2DA-2DB 0730-0731 ▀▀▄▀ ▄▀█ D325 54053                 Draw 08×05 at V3,V2; VF ← XOR
2DC-2DD 0732-0733 ▄ ▄▀▄ █  12AA 04778                 Jump to end

The game ends with the fr and ee sprites:

2DE     0734      ███ ███    EE   238              fr
2DF     0735      █   █ █    8A   138
2E0     0736      ██  ███    CE   206
2E1     0737      █   ██     8C   140
2E2     0738      █   █ █    8A   138
2E3     0739      ███ ███    EE   238              ee
2E4     0740      █   █      88   136
2E5     0741      ██  ██     CC   204
2E6     0742      █   █      88   136
2E7     0743      ███ ███    EE   238