Index  Comments

Both of advanced.chip8 and advanced.mmc are available under the CC0 Public Domain Dedication. Here is the paper mentioned.

This is documentation for the Advanced Asphyxiation CHIP-8 game, a rewriting and improvement of what I wrote earlier. This is more faithful to the original game, truly being a game, but lacks enemies.

Follows is the program as displayed in mine MMC, how I see it as I wrote it:

200-201 0512-0513 ▄▄▄▄▄▄▄▄ 00FF 00255                 Enable extended mode
202-203 0514-0515 █▄█▄ ▀▀▀ A7F0 42992                 I ← 2032
204-205 0516-0517 ▀██▀▀█▀█ FF65 65381                 Load V0→VF; I ← I + 16
206-207 0518-0519  ▀▀ ▄▀█▀ 670A 26378                 V7 ← 010
208-209 0520-0521 ▄██▄█▄▄█ 69FF 27135                 V9 ← 255
20A-20B 0522-0523 ▀ ▀▄▄ ▀  A218 41496                 I ← player
20C-20D 0524-0525 █▀▄█▀ ▀▄ DAB1 55985                 Draw 08×01 at VA,VB; VF ← XOR
20E-20F 0526-0527 ▀▀  ▀▀▀▄ CE01 52737            maze VE ← ??? AND 001
210-211 0528-0529  ▀▀ ▀▀ ▀ 6D00 27904                 VD ← 000
212-213 0530-0531 ▀▄▀ ▄▄█▀ A34E 41806       maze step I ← backstage
214-215 0532-0533 ▀▀▀███▄▀ FD1E 64798                 I ← I + VD
216-217 0534-0535 ▀██▀ ▄▀█ F365 62309                 Load V0→V3; I ← I + 04
218-219 0536-0537 ▀   ▄▄▄  800E 32782          player V0 ← V0 × 2; VF ← MSB
21A-21B 0538-0539 █▄▄▄▄█▄  84FE 34046                 V4 ← VF × 2; VF ← MSB
21C-21D 0540-0541 ▀  ▄▄▄▄▀ 811E 33054                 V1 ← V1 × 2; VF ← MSB
21E-21F 0542-0543 █▄▄▄ ▀ ▄ 84F1 34033                 V4 ← V4 OR VF
220-221 0544-0545 █▄▄ ▄█▄▀ 85EE 34286                 V5 ← VE × 2; VF ← MSB
222-223 0546-0547 ▀ ▄ ▄▄█  822E 33326                 V2 ← V2 × 2; VF ← MSB
224-225 0548-0549 █▄▄▄▀▀▀  8EF0 36592                 VE ← VF
226-227 0550-0551 █▄▄▄ ▀ █ 85F1 34289                 V5 ← V5 OR VF
228-229 0552-0553 ▀▄ ▄▄█▄▀ 855E 34142                 V5 ← V5 × 2; VF ← MSB
22A-22B 0554-0555 ▀ ▄▄▄▄█▀ 833E 33598                 V3 ← V3 × 2; VF ← MSB
22C-22D 0556-0557 █▄▄▄ ▀ █ 85F1 34289                 V5 ← V5 OR VF
22E-22F 0558-0559 ▀ █▄▄▄█▀ A33E 41790                 I ← random
230-231 0560-0561 ▀▀▀█▄█▄  F41E 62494                 I ← I + V4
232-233 0562-0563 ▀██▀ ▄ ▄ F065 61541                 Load V0→V0; I ← I + 01
234-235 0564-0565   █   █▀ 2322 08994                 Call shift
236-237 0566-0567 █▄▄▄  ▀  82F0 33520                 V2 ← VF
238-239 0568-0569 ▀▄▀   █▀ A342 41794                 I ← drunk
23A-23B 0570-0571 ▀▀▀█▄█▄  F41E 62494                 I ← I + V4
23C-23D 0572-0573 ▀██▀ ▄ ▄ F065 61541                 Load V0→V0; I ← I + 01
23E-23F 0574-0575   █   █▀ 2322 08994                 Call shift
240-241 0576-0577   ▀▀  ▀  3200 12800                 Skip next if V2 = 000
242-243 0578-0579 ▀▀  ▀▀▀█ CF01 52993                 VF ← ??? AND 001
244-245 0580-0581  ▀▀      6000 24576                 V0 ← 000
246-247 0582-0583   ▀▀▀▀▀▀ 3F00 16128                 Skip next if VF = 000
248-249 0584-0585 ▄██▄     60F0 24816                 V0 ← 240
24A-24B 0586-0587 ▀▄▀▄  ▀▀ A350 41808                 I ← stage
24C-24D 0588-0589 ▀▀▀███▄▀ FD1E 64798                 I ← I + VD
24E-24F 0590-0591 ▀█▀█ ▄ ▄ F055 61525                 Save V0→V0; I ← I + 01
250-251 0592-0593  ▀▀▀▀▀ █ 7D01 32001                 VD ← VD + 001
252-253 0594-0595   ▀█▀▀ ▀ 3D10 15632                 Skip next if VD = 016
254-255 0596-0597  ▄▄▀ ▄▀  1264 04708                 Jump to draw curtains
256-257 0598-0599 ▀▄█▄  ▀▀ A370 41840                 I ← wardrobe
258-259 0600-0601 ▀█▀█▀█▀█ FF55 65365                 Save V0→VF; I ← I + 16
25A-25B 0602-0603 ▀▄▀▄  ▀▀ A350 41808                 I ← stage
25C-25D 0604-0605 ▀██▀▀█▀█ FF65 65381                 Load V0→VF; I ← I + 16
25E-25F 0606-0607 ▀█▀█▀█▀█ FF55 65365                 Save V0→VF; I ← I + 16
260-261 0608-0609 ▀▄█▄  ▀▀ A370 41840                 I ← wardrobe
262-263 0610-0611 ▀██▀▀█▀█ FF65 65381                 Load V0→VF; I ← I + 16
264-265 0612-0613  ▀▀▀▀▀ ▄ 7C01 31745   draw curtains VC ← VC + 001
266-267 0614-0615  ▀  ▀█   4C04 19460                 Skip next if VC <> 004
268-269 0616-0617  ▀▀ ▀▀   6C00 27648                 VC ← 000
26A-26B 0618-0619   ▀▀▀▀   3C00 15360                 Skip next if VC = 000
26C-26D 0620-0621 ▄  ▀▄▄█  128E 04750                 Jump to move
26E-26F 0622-0623 ▀▄█   ▀▀ A360 41824                 I ← fourth wall
270-271 0624-0625 ▄▄     ▄ 00C1 00193                 Scroll ↓ by 01
272-273 0626-0627  ▀▀    ▀ 6100 24832                 V1 ← 000
274-275 0628-0629  ██▄▄▄▀  627C 25212                 V2 ← 124
276-277 0630-0631  ▀▀▀▀ ▀█ 7B01 31489                 VB ← VB + 001
278-279 0632-0633 ▄▄███▄▄█ 39FF 14847                 Skip next if V9 = 255
27A-27B 0634-0635  ▀▀▀▀  █ 7901 30977                 V9 ← V9 + 001
27C-27D 0636-0637  █  ▀  ▀ 4940 18752                 Skip next if V9 <> 064
27E-27F 0638-0639 ▄██▄█▄▄█ 69FF 27135                 V9 ← 255
280-281 0640-0641 ██ ▀   █ D1C1 53697       show time Draw 08×01 at V1,VC; VF ← XOR
282-283 0642-0643 ██ ▀  ▀▄ D2C1 53953                 Draw 08×01 at V2,VC; VF ← XOR
284-285 0644-0645 ▀██▀ ▄ ▄ F065 61541                 Load V0→V0; I ← I + 01
286-287 0646-0647  ▀▀▀ ▄ ▀ 7104 28932                 V1 ← V1 + 004
288-289 0648-0649 ▄███▄▄▀  72FC 29436                 V2 ← V2 + 252
28A-28B 0650-0651  ▄▀▀   ▀ 3140 12608                 Skip next if V1 = 064
28C-28D 0652-0653 ▄  ▀  ▀  1280 04736                 Jump to show time
28E-28F 0654-0655 ▄▄███▄▄█ 39FF 14847            move Skip next if V9 = 255
290-291 0656-0657 ▄ ▄▀ ▄█  12A6 04774                 Jump to continue
292-293 0658-0659   ▀▀▀▀   3C00 15360                 Skip next if VC = 000
294-295 0660-0661 ▄ ▄▀ ▄█  12A6 04774                 Jump to continue
296-297 0662-0663 ▀ ▀▄▄ ▀  A218 41496                 I ← player
298-299 0664-0665 ▀█▄▄█▄▄▄ C87F 51327                 V8 ← ??? AND 127
29A-29B 0666-0667  ▀▀ ▀  █ 6901 26881                 V9 ← 001
29C-29D 0668-0669 █▀ █▀  ▄ D891 55441                 Draw 08×01 at V8,V9; VF ← XOR
29E-29F 0670-0671  ▀  ▀▀▀▀ 4F00 20224                 Skip next if VF <> 000
2A0-2A1 0672-0673 ▄ ▄▀ ▄█  12A6 04774                 Jump to continue
2A2-2A3 0674-0675 █▀ █▀  ▄ D891 55441                 Draw 08×01 at V8,V9; VF ← XOR
2A4-2A5 0676-0677 ▄██▄█▄▄█ 69FF 27135                 V9 ← 255
2A6-2A7 0678-0679 ▀▄▀  ▄█▀ A346 41798        continue I ← from
2A8-2A9 0680-0681 ▀██▀ █▀▄ F665 63077                 Load V0→V6; I ← I + 07
2AA-2AB 0682-0683  █  ▀ ▀▀ 4B40 19264                 Skip next if VB <> 064
2AC-2AD 0684-0685    ▀  ▀  1200 04608                 Jump to 0512
2AE-2AF 0686-0687 █▀▀▄▄▄▄  E09E 57502            down Skip next if V0 = key
2B0-2B1 0688-0689 ▄ ▄█▄ ▀  12B8 04792                 Jump to left
2B2-2B3 0690-0691  ▀▄▄█▄██ 4B3F 19263                 Skip next if VB <> 063
2B4-2B5 0692-0693 ▄ ▄█▄ ▀  12B8 04792                 Jump to left
2B6-2B7 0694-0695  ▀▀  ▀▀▄ 6601 26113                 V6 ← 001
2B8-2B9 0696-0697 █▀▀▄▄▄▄▀ E19E 57758            left Skip next if V1 = key
2BA-2BB 0698-0699 ▄▄ ▀  █  12C2 04802                 Jump to right
2BC-2BD 0700-0701  ▀  ▀ ▀  4A00 18944                 Skip next if VA <> 000
2BE-2BF 0702-0703 ▄▄ ▀  █  12C2 04802                 Jump to right
2C0-2C1 0704-0705 ▄██▄▄█▄█ 65FF 26111                 V5 ← 255
2C2-2C3 0706-0707 █▀▀▄▄▄█  E29E 58014           right Skip next if V2 = key
2C4-2C5 0708-0709 ▄▄ ▀▄▄▀  12CC 04812                 Jump to up
2C6-2C7 0710-0711  █▄▄█▄█▄ 4A7F 19071                 Skip next if VA <> 127
2C8-2C9 0712-0713 ▄▄ ▀▄▄▀  12CC 04812                 Jump to up
2CA-2CB 0714-0715  ▀▀  ▀ █ 6501 25857                 V5 ← 001
2CC-2CD 0716-0717 █▀▀▄▄▄█▀ E39E 58270              up Skip next if V3 = key
2CE-2CF 0718-0719 ▄▄ █ ▄█  12D6 04822                 Jump to resolve
2D0-2D1 0720-0721  ▀  ▀ ▀▀ 4B00 19200                 Skip next if VB <> 000
2D2-2D3 0722-0723 ▄▄ █ ▄█  12D6 04822                 Jump to resolve
2D4-2D5 0724-0725 ▄██▄▄██▄ 66FF 26367                 V6 ← 255
2D6-2D7 0726-0727 ▀ ▀▄▄ ▀  A218 41496         resolve I ← player
2D8-2D9 0728-0729 █▀ █▀  ▄ D891 55441                 Draw 08×01 at V8,V9; VF ← XOR
2DA-2DB 0730-0731  ▀  ▀▀▀▀ 4F00 20224                 Skip next if VF <> 000
2DC-2DD 0732-0733 █▀ █▀  ▄ D891 55441                 Draw 08×01 at V8,V9; VF ← XOR
2DE-2DF 0734-0735 █▀▄█▀ ▀▄ DAB1 55985                 Draw 08×01 at VA,VB; VF ← XOR
2E0-2E1 0736-0737 ▀▄ ▄▀▄▀  8A54 35412                 VA ← VA + V5; VF ← overflow
2E2-2E3 0738-0739 ▀▄▄ ▀▄▀▀ 8B64 35684                 VB ← VB + V6; VF ← overflow
2E4-2E5 0740-0741 █▀▄█▀ ▀▄ DAB1 55985                 Draw 08×01 at VA,VB; VF ← XOR
2E6-2E7 0742-0743 ▄▀▄▀▀    58A0 22688                 Skip next if V8 = VA
2E8-2E9 0744-0745 ▄▄▄█  █  12F2 04850                 Jump to next
2EA-2EB 0746-0747 ▄▀▄█▀  ▀ 59B0 22960                 Skip next if V9 = VB
2EC-2ED 0748-0749 ▄▄▄█  █  12F2 04850                 Jump to next
2EE-2EF 0750-0751 ▄██▄█▄▄█ 69FF 27135                 V9 ← 255
2F0-2F1 0752-0753  ▀▀▀ ▀▀█ 7701 30465                 V7 ← V7 + 001
2F2-2F3 0754-0755  ▀  ▀▀▀▀ 4F00 20224            next Skip next if VF <> 000
2F4-2F5 0756-0757 ▄▄▄█▄▄█  12FE 04862                 Jump to break?
2F6-2F7 0758-0759 █▀▄█▀ ▀▄ DAB1 55985                 Draw 08×01 at VA,VB; VF ← XOR
2F8-2F9 0760-0761 ▀▄ ▄▀▄▀▄ 8A55 35413                 VA ← VA − V5; VF ← borrow
2FA-2FB 0762-0763 ▀▄▄ ▀▄▀█ 8B65 35685                 VB ← VB − V6; VF ← borrow
2FC-2FD 0764-0765 █▀▄█▀ ▀▄ DAB1 55985                 Draw 08×01 at VA,VB; VF ← XOR
2FE-2FF 0766-0767 █▀▀▄▄█▄  E49E 58526          break? Skip next if V4 = key
300-301 0768-0769    █ ▄▀▀ 1314 04884                 Jump to exhaust delay
302-303 0770-0771  ▀   ▀▀▀ 4700 18176                 Skip next if V7 <> 000
304-305 0772-0773    █ ▄▀▀ 1314 04884                 Jump to exhaust delay
306-307 0774-0775 ▀ █▄▄ █▀ A33A 41786                 I ← make break
308-309 0776-0777 █ ▄      80A0 32928                 V0 ← VA
30A-30B 0778-0779 █ ▄▄   ▀ 81B0 33200                 V1 ← VB
30C-30D 0780-0781 ▄███▄▄▄▄ 70FF 28927                 V0 ← V0 + 255
30E-30F 0782-0783 ▄███▄▄ ▀ 71FC 29180                 V1 ← V1 + 252
310-311 0784-0785 ▄███▄███ 77FF 30719                 V7 ← V7 + 255
312-313 0786-0787 ▀▀ █ ▄   D014 53268                 Draw 08×04 at V0,V1; VF ← XOR
314-315 0788-0789 ▀▀▀▀▀███ FF07 65287   exhaust delay VF ← delay
316-317 0790-0791   ▀▀▀▀▀▀ 3F00 16128                 Skip next if VF = 000
318-319 0792-0793    █ ▄▀▀ 1314 04884                 Jump to exhaust delay
31A-31B 0794-0795 ▀▀▀█ ▄▀▄ F215 61973                 delay ← V2
31C-31D 0796-0797   ▀█▀▀ ▀ 3D10 15632                 Skip next if VD = 016
31E-31F 0798-0799    █  █  1212 04626                 Jump to maze step
320-321 0800-0801    ▀▄▄█  120E 04622                 Jump to maze
322-323 0802-0803 ▀      ▀ 8100 33024           shift V1 ← V0
324-325 0804-0805 ▀▄ ▄▄▄▄  805E 32862                 V0 ← V5 × 2; VF ← MSB
326-327 0806-0807 ▀ █▀▄ ▀▀ B328 45864                 Jump to V0 + table
328-329 0808-0809 ▀  ▄ ▄▄▀ 8116 33046           table V1 ← V1 ÷ 2; VF ← LSB
32A-32B 0810-0811 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
32C-32D 0812-0813 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
32E-32F 0814-0815 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
330-331 0816-0817 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
332-333 0818-0819 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
334-335 0820-0821 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
336-337 0822-0823 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
338-339 0824-0825 ▄▄▄ ▄▄▄  00EE 00238                 Return
33A-33B 0826-0827 ████     F0F0 61680      make break 
33C-33D 0828-0829 ████     F0F0 61680                 
33E-33F 0830-0831    ▀▄ ▀▀ 1308 04872          random 
340-341 0832-0833 ▄  █▄    1098 04248                 
342-343 0834-0835 ███▄     E0F0 57584           drunk 
344-345 0836-0837 ▀▀█      E020 57376                 
346     0838            █    02   002            from 
347     0839           █     04   004                 
348     0840           ██    06   006                 
349     0841          █      08   008                 
34A-34B 0842-0843          0000 00000                 
34C-34D 0844-0845          0000 00000                 
34E-34F 0846-0847 ▀▀▀▀     F000 61440       backstage 
350-351 0848-0849          0000 00000           stage 
352-353 0850-0851          0000 00000                 
354-355 0852-0853          0000 00000                 
356-357 0854-0855          0000 00000                 
358-359 0856-0857          0000 00000                 
35A-35B 0858-0859          0000 00000                 
35C-35D 0860-0861          0000 00000                 
35E-35F 0862-0863          0000 00000                 
360-361 0864-0865          0000 00000     fourth wall 
362-363 0866-0867          0000 00000                 
364-365 0868-0869          0000 00000                 
366-367 0870-0871          0000 00000                 
368-369 0872-0873          0000 00000                 
36A-36B 0874-0875          0000 00000                 
36C-36D 0876-0877          0000 00000                 
36E-36F 0878-0879          0000 00000                 
370-371 0880-0881          0000 00000        wardrobe 

The register usage is as follows:

  1. V0 Hold cells for the automaton; hold a key code; and hold the argument to a subroutine.
  2. V1 Hold a cell for the automaton; hold the horizontal coordinate of part of the maze drawing; hold a key code; and operate as a temporary register.
  3. V2 Hold a cell for the automaton; hold the horizontal coordinate of part of the maze drawing; hold a key code; operate as a temporary register; and manipulate the delay register.
  4. V3 Hold a cell for the automaton; and hold a key code.
  5. V4 Hold a generated index for the maze generation; and hold a key code.
  6. V5 Hold a generated index for the maze generation; and hold a movement delta.
  7. V6 Hold a movement delta.
  8. V7 Store the make break count.
  9. V8 Hold the horizontal coordinate of the make break.
  10. V9 Hold the vertical coordinate and presence sigil of the make break.
  11. VA Hold the horizontal coordinate of the player.
  12. VB Hold the vertical coordinate of the player.
  13. VC Hold a rotating counter and the vertical coordinate of part of the maze drawing.
  14. VD Hold the current cell index of the maze generation.
  15. VE Hold a prior cell state for the automaton.
  16. VF Hold the result of a subroutine; manipulate the delay register; indicate collisions, and whatnot.

More care was taken in register selection with this iteration; in particular, it was recognized that the first many registers had no persistent state after the automaton stepping, and so could be used, without issue. Unfortunately, I resisted using entirely disparate register banks in this; it caused issues with register exhaustion that could've been avoided. The register manipulation of the latter half of the game is sloppy, in mine eyes, and this game would benefit from heavier rewriting, later.

The game begins by entering Super CHIP-8 mode, clearing all registers to zero, initializing the make break count, configuring the make break sigil to indicate no presence, and then drawing that player:

200-201 0512-0513 ▄▄▄▄▄▄▄▄ 00FF 00255                 Enable extended mode
202-203 0514-0515 █▄█▄ ▀▀▀ A7F0 42992                 I ← 2032
204-205 0516-0517 ▀██▀▀█▀█ FF65 65381                 Load V0→VF; I ← I + 16
206-207 0518-0519  ▀▀ ▄▀█▀ 670A 26378                 V7 ← 010
208-209 0520-0521 ▄██▄█▄▄█ 69FF 27135                 V9 ← 255
20A-20B 0522-0523 ▀ ▀▄▄ ▀  A218 41496                 I ← player
20C-20D 0524-0525 █▀▄█▀ ▀▄ DAB1 55985                 Draw 08×01 at VA,VB; VF ← XOR

Unlike that prior implementation, a more consistent framerate is achieved by generating each cell of the automaton in step with the rest of the game, rather than all at once; the paper I read indicated a random initial value for part of the algorithm, which corresponds to the CE01. Rather than move I by FX65, I use labels offset appropriately; this implementation avoids a mask by using 8XYE instead. Each value is either zero or two hundred and forty, as but two symbols are needed, and these exactly match the sprites used in drawing. Indices into the bit tables drunk and random are built as shown:

20E-20F 0526-0527 ▀▀  ▀▀▀▄ CE01 52737            maze VE ← ??? AND 001
210-211 0528-0529  ▀▀ ▀▀ ▀ 6D00 27904                 VD ← 000
212-213 0530-0531 ▀▄▀ ▄▄█▀ A34E 41806       maze step I ← backstage
214-215 0532-0533 ▀▀▀███▄▀ FD1E 64798                 I ← I + VD
216-217 0534-0535 ▀██▀ ▄▀█ F365 62309                 Load V0→V3; I ← I + 04
218-219 0536-0537 ▀   ▄▄▄  800E 32782          player V0 ← V0 × 2; VF ← MSB
21A-21B 0538-0539 █▄▄▄▄█▄  84FE 34046                 V4 ← VF × 2; VF ← MSB
21C-21D 0540-0541 ▀  ▄▄▄▄▀ 811E 33054                 V1 ← V1 × 2; VF ← MSB
21E-21F 0542-0543 █▄▄▄ ▀ ▄ 84F1 34033                 V4 ← V4 OR VF
220-221 0544-0545 █▄▄ ▄█▄▀ 85EE 34286                 V5 ← VE × 2; VF ← MSB
222-223 0546-0547 ▀ ▄ ▄▄█  822E 33326                 V2 ← V2 × 2; VF ← MSB
224-225 0548-0549 █▄▄▄▀▀▀  8EF0 36592                 VE ← VF
226-227 0550-0551 █▄▄▄ ▀ █ 85F1 34289                 V5 ← V5 OR VF
228-229 0552-0553 ▀▄ ▄▄█▄▀ 855E 34142                 V5 ← V5 × 2; VF ← MSB
22A-22B 0554-0555 ▀ ▄▄▄▄█▀ 833E 33598                 V3 ← V3 × 2; VF ← MSB
22C-22D 0556-0557 █▄▄▄ ▀ █ 85F1 34289                 V5 ← V5 OR VF

Again for a more consistent framerate, both random and drunk are indexed, regardless of the value in random. The shift routine is used to extract the particular bit. I was unable to avoid conditional code in setting the new cell value, but did nicely avoid unnecessary register movement in how random values are set, by conditionally manipulating the apparent value of that drunk bit. I would've been able to unconditionally map one to two hundred and forty, but lacked a multiplication sled I needed:

22E-22F 0558-0559 ▀ █▄▄▄█▀ A33E 41790                 I ← random
230-231 0560-0561 ▀▀▀█▄█▄  F41E 62494                 I ← I + V4
232-233 0562-0563 ▀██▀ ▄ ▄ F065 61541                 Load V0→V0; I ← I + 01
234-235 0564-0565   █   █▀ 2322 08994                 Call shift
236-237 0566-0567 █▄▄▄  ▀  82F0 33520                 V2 ← VF
238-239 0568-0569 ▀▄▀   █▀ A342 41794                 I ← drunk
23A-23B 0570-0571 ▀▀▀█▄█▄  F41E 62494                 I ← I + V4
23C-23D 0572-0573 ▀██▀ ▄ ▄ F065 61541                 Load V0→V0; I ← I + 01
23E-23F 0574-0575   █   █▀ 2322 08994                 Call shift
240-241 0576-0577   ▀▀  ▀  3200 12800                 Skip next if V2 = 000
242-243 0578-0579 ▀▀  ▀▀▀█ CF01 52993                 VF ← ??? AND 001
244-245 0580-0581  ▀▀      6000 24576                 V0 ← 000
246-247 0582-0583   ▀▀▀▀▀▀ 3F00 16128                 Skip next if VF = 000
248-249 0584-0585 ▄██▄     60F0 24816                 V0 ← 240

The stage is set and, once that automaton is finished with the next generation, those new values are nicely set by using all sixteen registers; the fourth wall indicating the actual maze is immediately following stage, enabling this nice trick. The wardrobe is but temporary storage for all registers:

24A-24B 0586-0587 ▀▄▀▄  ▀▀ A350 41808                 I ← stage
24C-24D 0588-0589 ▀▀▀███▄▀ FD1E 64798                 I ← I + VD
24E-24F 0590-0591 ▀█▀█ ▄ ▄ F055 61525                 Save V0→V0; I ← I + 01
250-251 0592-0593  ▀▀▀▀▀ █ 7D01 32001                 VD ← VD + 001
252-253 0594-0595   ▀█▀▀ ▀ 3D10 15632                 Skip next if VD = 016
254-255 0596-0597  ▄▄▀ ▄▀  1264 04708                 Jump to draw curtains
256-257 0598-0599 ▀▄█▄  ▀▀ A370 41840                 I ← wardrobe
258-259 0600-0601 ▀█▀█▀█▀█ FF55 65365                 Save V0→VF; I ← I + 16
25A-25B 0602-0603 ▀▄▀▄  ▀▀ A350 41808                 I ← stage
25C-25D 0604-0605 ▀██▀▀█▀█ FF65 65381                 Load V0→VF; I ← I + 16
25E-25F 0606-0607 ▀█▀█▀█▀█ FF55 65365                 Save V0→VF; I ← I + 16
260-261 0608-0609 ▀▄█▄  ▀▀ A370 41840                 I ← wardrobe
262-263 0610-0611 ▀██▀▀█▀█ FF65 65381                 Load V0→VF; I ← I + 16

Rows of the maze are drawn once every four cycles, which matches perfectly with the sixteen cells of the automaton. The screen is scrolled, coordinates for the player and make break are incremented if necessary, and the make break is reset if past the end. If not that, the move segment is jumped to:

264-265 0612-0613  ▀▀▀▀▀ ▄ 7C01 31745   draw curtains VC ← VC + 001
266-267 0614-0615  ▀  ▀█   4C04 19460                 Skip next if VC <> 004
268-269 0616-0617  ▀▀ ▀▀   6C00 27648                 VC ← 000
26A-26B 0618-0619   ▀▀▀▀   3C00 15360                 Skip next if VC = 000
26C-26D 0620-0621 ▄  ▀▄▄█  128E 04750                 Jump to move
26E-26F 0622-0623 ▀▄█   ▀▀ A360 41824                 I ← fourth wall
270-271 0624-0625 ▄▄     ▄ 00C1 00193                 Scroll ↓ by 01
272-273 0626-0627  ▀▀    ▀ 6100 24832                 V1 ← 000
274-275 0628-0629  ██▄▄▄▀  627C 25212                 V2 ← 124
276-277 0630-0631  ▀▀▀▀ ▀█ 7B01 31489                 VB ← VB + 001
278-279 0632-0633 ▄▄███▄▄█ 39FF 14847                 Skip next if V9 = 255
27A-27B 0634-0635  ▀▀▀▀  █ 7901 30977                 V9 ← V9 + 001
27C-27D 0636-0637  █  ▀  ▀ 4940 18752                 Skip next if V9 <> 064
27E-27F 0638-0639 ▄██▄█▄▄█ 69FF 27135                 V9 ← 255

The show time routine draws one row of the maze. As VC is zero to enter this routine, it can safely be used for the vertical coordinate. As I only progresses one way, the row is drawn towards center:

280-281 0640-0641 ██ ▀   █ D1C1 53697       show time Draw 08×01 at V1,VC; VF ← XOR
282-283 0642-0643 ██ ▀  ▀▄ D2C1 53953                 Draw 08×01 at V2,VC; VF ← XOR
284-285 0644-0645 ▀██▀ ▄ ▄ F065 61541                 Load V0→V0; I ← I + 01
286-287 0646-0647  ▀▀▀ ▄ ▀ 7104 28932                 V1 ← V1 + 004
288-289 0648-0649 ▄███▄▄▀  72FC 29436                 V2 ← V2 + 252
28A-28B 0650-0651  ▄▀▀   ▀ 3140 12608                 Skip next if V1 = 064
28C-28D 0652-0653 ▄  ▀  ▀  1280 04736                 Jump to show time

The move routine begins by calculating the make break, if necessary. The make break is only changed if not already active and only then once every four cycles. It's opportunistically drawn at the top of the screen, bailing out and correcting the maze if it collides with a wall to try the next cycle:

28E-28F 0654-0655 ▄▄███▄▄█ 39FF 14847            move Skip next if V9 = 255
290-291 0656-0657 ▄ ▄▀ ▄█  12A6 04774                 Jump to continue
292-293 0658-0659   ▀▀▀▀   3C00 15360                 Skip next if VC = 000
294-295 0660-0661 ▄ ▄▀ ▄█  12A6 04774                 Jump to continue
296-297 0662-0663 ▀ ▀▄▄ ▀  A218 41496                 I ← player
298-299 0664-0665 ▀█▄▄█▄▄▄ C87F 51327                 V8 ← ??? AND 127
29A-29B 0666-0667  ▀▀ ▀  █ 6901 26881                 V9 ← 001
29C-29D 0668-0669 █▀ █▀  ▄ D891 55441                 Draw 08×01 at V8,V9; VF ← XOR
29E-29F 0670-0671  ▀  ▀▀▀▀ 4F00 20224                 Skip next if VF <> 000
2A0-2A1 0672-0673 ▄ ▄▀ ▄█  12A6 04774                 Jump to continue
2A2-2A3 0674-0675 █▀ █▀  ▄ D891 55441                 Draw 08×01 at V8,V9; VF ← XOR
2A4-2A5 0676-0677 ▄██▄█▄▄█ 69FF 27135                 V9 ← 255

The continue routine initializes the key and delta registers, also checking for failure, to restart:

2A6-2A7 0678-0679 ▀▄▀  ▄█▀ A346 41798        continue I ← from
2A8-2A9 0680-0681 ▀██▀ █▀▄ F665 63077                 Load V0→V6; I ← I + 07
2AA-2AB 0682-0683  █  ▀ ▀▀ 4B40 19264                 Skip next if VB <> 064
2AC-2AD 0684-0685    ▀  ▀  1200 04608                 Jump to 0512

This segment merely calculates the movement deltas, also enforcing bounds:

2AE-2AF 0686-0687 █▀▀▄▄▄▄  E09E 57502            down Skip next if V0 = key
2B0-2B1 0688-0689 ▄ ▄█▄ ▀  12B8 04792                 Jump to left
2B2-2B3 0690-0691  ▀▄▄█▄██ 4B3F 19263                 Skip next if VB <> 063
2B4-2B5 0692-0693 ▄ ▄█▄ ▀  12B8 04792                 Jump to left
2B6-2B7 0694-0695  ▀▀  ▀▀▄ 6601 26113                 V6 ← 001
2B8-2B9 0696-0697 █▀▀▄▄▄▄▀ E19E 57758            left Skip next if V1 = key
2BA-2BB 0698-0699 ▄▄ ▀  █  12C2 04802                 Jump to right
2BC-2BD 0700-0701  ▀  ▀ ▀  4A00 18944                 Skip next if VA <> 000
2BE-2BF 0702-0703 ▄▄ ▀  █  12C2 04802                 Jump to right
2C0-2C1 0704-0705 ▄██▄▄█▄█ 65FF 26111                 V5 ← 255
2C2-2C3 0706-0707 █▀▀▄▄▄█  E29E 58014           right Skip next if V2 = key
2C4-2C5 0708-0709 ▄▄ ▀▄▄▀  12CC 04812                 Jump to up
2C6-2C7 0710-0711  █▄▄█▄█▄ 4A7F 19071                 Skip next if VA <> 127
2C8-2C9 0712-0713 ▄▄ ▀▄▄▀  12CC 04812                 Jump to up
2CA-2CB 0714-0715  ▀▀  ▀ █ 6501 25857                 V5 ← 001
2CC-2CD 0716-0717 █▀▀▄▄▄█▀ E39E 58270              up Skip next if V3 = key
2CE-2CF 0718-0719 ▄▄ █ ▄█  12D6 04822                 Jump to resolve
2D0-2D1 0720-0721  ▀  ▀ ▀▀ 4B00 19200                 Skip next if VB <> 000
2D2-2D3 0722-0723 ▄▄ █ ▄█  12D6 04822                 Jump to resolve
2D4-2D5 0724-0725 ▄██▄▄██▄ 66FF 26367                 V6 ← 255

The resolve routine erases the make break so it can't collide with the player, and then redraws him:

2D6-2D7 0726-0727 ▀ ▀▄▄ ▀  A218 41496         resolve I ← player
2D8-2D9 0728-0729 █▀ █▀  ▄ D891 55441                 Draw 08×01 at V8,V9; VF ← XOR
2DA-2DB 0730-0731  ▀  ▀▀▀▀ 4F00 20224                 Skip next if VF <> 000
2DC-2DD 0732-0733 █▀ █▀  ▄ D891 55441                 Draw 08×01 at V8,V9; VF ← XOR
2DE-2DF 0734-0735 █▀▄█▀ ▀▄ DAB1 55985                 Draw 08×01 at VA,VB; VF ← XOR
2E0-2E1 0736-0737 ▀▄ ▄▀▄▀  8A54 35412                 VA ← VA + V5; VF ← overflow
2E2-2E3 0738-0739 ▀▄▄ ▀▄▀▀ 8B64 35684                 VB ← VB + V6; VF ← overflow
2E4-2E5 0740-0741 █▀▄█▀ ▀▄ DAB1 55985                 Draw 08×01 at VA,VB; VF ← XOR

The following code determines if the make break is collected by comparing coordinates and resetting:

2E6-2E7 0742-0743 ▄▀▄▀▀    58A0 22688                 Skip next if V8 = VA
2E8-2E9 0744-0745 ▄▄▄█  █  12F2 04850                 Jump to next
2EA-2EB 0746-0747 ▄▀▄█▀  ▀ 59B0 22960                 Skip next if V9 = VB
2EC-2ED 0748-0749 ▄▄▄█  █  12F2 04850                 Jump to next
2EE-2EF 0750-0751 ▄██▄█▄▄█ 69FF 27135                 V9 ← 255
2F0-2F1 0752-0753  ▀▀▀ ▀▀█ 7701 30465                 V7 ← V7 + 001

The next routine moves the player back to his previous location if a collision occurred, then seeing if a make break is used; if so, and the count is positive, the make break's coordinate is calculated and it's drawn. I'd wanted to adjust this based on the last movement direction, but faced pressure:

2F2-2F3 0754-0755  ▀  ▀▀▀▀ 4F00 20224            next Skip next if VF <> 000
2F4-2F5 0756-0757 ▄▄▄█▄▄█  12FE 04862                 Jump to break?
2F6-2F7 0758-0759 █▀▄█▀ ▀▄ DAB1 55985                 Draw 08×01 at VA,VB; VF ← XOR
2F8-2F9 0760-0761 ▀▄ ▄▀▄▀▄ 8A55 35413                 VA ← VA − V5; VF ← borrow
2FA-2FB 0762-0763 ▀▄▄ ▀▄▀█ 8B65 35685                 VB ← VB − V6; VF ← borrow
2FC-2FD 0764-0765 █▀▄█▀ ▀▄ DAB1 55985                 Draw 08×01 at VA,VB; VF ← XOR
2FE-2FF 0766-0767 █▀▀▄▄█▄  E49E 58526          break? Skip next if V4 = key
300-301 0768-0769    █ ▄▀▀ 1314 04884                 Jump to exhaust delay
302-303 0770-0771  ▀   ▀▀▀ 4700 18176                 Skip next if V7 <> 000
304-305 0772-0773    █ ▄▀▀ 1314 04884                 Jump to exhaust delay
306-307 0774-0775 ▀ █▄▄ █▀ A33A 41786                 I ← make break
308-309 0776-0777 █ ▄      80A0 32928                 V0 ← VA
30A-30B 0778-0779 █ ▄▄   ▀ 81B0 33200                 V1 ← VB
30C-30D 0780-0781 ▄███▄▄▄▄ 70FF 28927                 V0 ← V0 + 255
30E-30F 0782-0783 ▄███▄▄ ▀ 71FC 29180                 V1 ← V1 + 252
310-311 0784-0785 ▄███▄███ 77FF 30719                 V7 ← V7 + 255
312-313 0786-0787 ▀▀ █ ▄   D014 53268                 Draw 08×04 at V0,V1; VF ← XOR

That remaining delay is exhausted, before being reinstated, and one of the maze routines is entered:

314-315 0788-0789 ▀▀▀▀▀███ FF07 65287   exhaust delay VF ← delay
316-317 0790-0791   ▀▀▀▀▀▀ 3F00 16128                 Skip next if VF = 000
318-319 0792-0793    █ ▄▀▀ 1314 04884                 Jump to exhaust delay
31A-31B 0794-0795 ▀▀▀█ ▄▀▄ F215 61973                 delay ← V2
31C-31D 0796-0797   ▀█▀▀ ▀ 3D10 15632                 Skip next if VD = 016
31E-31F 0798-0799    █  █  1212 04626                 Jump to maze step
320-321 0800-0801    ▀▄▄█  120E 04622                 Jump to maze

This shift routine is better than that preceding it, as it adjusts registers as needed, itself. Had I used a multiplication sled instead, I'd have been able to use this for the maze symbol generation:

322-323 0802-0803 ▀      ▀ 8100 33024           shift V1 ← V0
324-325 0804-0805 ▀▄ ▄▄▄▄  805E 32862                 V0 ← V5 × 2; VF ← MSB
326-327 0806-0807 ▀ █▀▄ ▀▀ B328 45864                 Jump to V0 + table
328-329 0808-0809 ▀  ▄ ▄▄▀ 8116 33046           table V1 ← V1 ÷ 2; VF ← LSB
32A-32B 0810-0811 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
32C-32D 0812-0813 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
32E-32F 0814-0815 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
330-331 0816-0817 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
332-333 0818-0819 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
334-335 0820-0821 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
336-337 0822-0823 ▀  ▄ ▄▄▀ 8116 33046                 V1 ← V1 ÷ 2; VF ← LSB
338-339 0824-0825 ▄▄▄ ▄▄▄  00EE 00238                 Return

The game ends with the various sprites, tables, register banks, and I'll also show the final labels. The backstage begins with a constant symbol, again as that paper I read described this aspect of it:

33A-33B 0826-0827 ████     F0F0 61680      make break 
33C-33D 0828-0829 ████     F0F0 61680                 
33E-33F 0830-0831    ▀▄ ▀▀ 1308 04872          random 
340-341 0832-0833 ▄  █▄    1098 04248                 
342-343 0834-0835 ███▄     E0F0 57584           drunk 
344-345 0836-0837 ▀▀█      E020 57376                 
346     0838            █    02   002            from 
347     0839           █     04   004                 
348     0840           ██    06   006                 
349     0841          █      08   008                 
34A-34B 0842-0843          0000 00000                 
34C-34D 0844-0845          0000 00000                 
34E-34F 0846-0847 ▀▀▀▀     F000 61440       backstage 
350-351 0848-0849          0000 00000           stage 
352-353 0850-0851          0000 00000                 
354-355 0852-0853          0000 00000                 
356-357 0854-0855          0000 00000                 
358-359 0856-0857          0000 00000                 
35A-35B 0858-0859          0000 00000                 
35C-35D 0860-0861          0000 00000                 
35E-35F 0862-0863          0000 00000                 
360-361 0864-0865          0000 00000     fourth wall 
362-363 0866-0867          0000 00000                 
364-365 0868-0869          0000 00000                 
366-367 0870-0871          0000 00000                 
368-369 0872-0873          0000 00000                 
36A-36B 0874-0875          0000 00000                 
36C-36D 0876-0877          0000 00000                 
36E-36F 0878-0879          0000 00000                 
370-371 0880-0881          0000 00000        wardrobe 

This game is much better than that which preceded it, and it was fun to finish it in the final hours of the Octo Jam, as I'd added the make break code haphazardly. I was unable to incorporate an enemy which would opportunistically spawn as the make break does, and also to have better placement of the make break; these are improvements to be made in a later version. The maze is twice the size it was in that prior and the original, and how nice; I'm not finished with this game, sans for the present.