Skip to content

Instantly share code, notes, and snippets.

@10c8
Created February 11, 2025 14:47
Show Gist options
  • Save 10c8/89d026929ef362e88a06e8c0ea468483 to your computer and use it in GitHub Desktop.
Save 10c8/89d026929ef362e88a06e8c0ea468483 to your computer and use it in GitHub Desktop.
[DEV] Human Puzzle Machine (PuzzleScript Script)
Play this game by pasting the script in http://www.puzzlescript.net/editor.html
(-
- Human Puzzle Machine
- Human Resource Machine demake in PuzzleScript
-
- by 0x77
- version 0.1
-)
title [DEV] Human Puzzle Machine
homepage 10c8.github.io
background_color #362B25
text_color #F8F4F1
realtime_interval .5
( realtime_interval .01 )
zoomscreen 18x14
( Disable while editing )
run_rules_on_level_start
( Enable (maybe?) while editing )
( verbose_logging )
( debug )
========
OBJECTS
========
( Background )
BACKGROUND .
#4b382b
( Player )
PLAYER @
transparent
( Held )
HELD ?
#45332a
( Conveyor Belt )
BELT_MID
#5e5e5e
BELT_IN_STR $
transparent
BELT_OUT_STR ¥
transparent
BELT_END ,
transparent #2a2723
.....
.....
.....
.....
11111
( Opcodes )
OP_IN
#9cb55b #415320
00000
10011
11001
10011
00000
OP_IN_1
#9cb55B #415320
00000
10110
00101
10101
00000
OP_IN_2
#9cb55b #415320
OP_OUT
#9cb55b #415320
00000
01011
11010
01011
00000
OP_OUT_1
#9CB55B #415320
00000
10101
10101
10111
00000
OP_OUT_2
#9CB55B #415320
00000
01110
00100
00100
00000
OP_CPY
#5C2E21 #C96B52
11111
01100
10101
11100
11111
OP_CPY_1
#5C2E21 #C96B52
11111
01000
11000
01011
11111
OP_CPY_2
#5C2E21 #C96B52
11111
10101
10001
11011
11111
OP_PST
#5C2E21 #C96B52
11111
11100
10100
01101
11111
OP_PST_1
#5C2E21 #C96B52
11111
01100
01101
11001
11111
OP_PST_2
#5C2E21 #C96B52
11111
10001
11011
11011
11111
OP_ADD
#C28F64 #593D27
00000
10001
11011
10010
00000
OP_ADD_1
#C28F64 #593D27
00000
00110
10101
10110
00000
OP_ADD_2
#C28F64 #593D27
00000
01100
01010
01100
00000
OP_SUB
#C28F64 #593D27
00000
00001
11001
00011
00000
OP_SUB_1
#C28F64 #593D27
00000
10101
00101
00111
00000
OP_SUB_2
#C28F64 #593D27
00000
01100
01110
01110
00000
OP_INC
#C28F64 #593D27
00000
01011
10001
00011
00000
OP_INC_1
#C28F64 #593D27
00000
10110
00101
10101
00000
OP_INC_2
#C28F64 #593D27
00000
01110
01000
01110
00000
OP_DEC
#C28F64 #593D27
00000
00011
10010
01011
00000
OP_DEC_1
#C28F64 #593D27
00000
00111
10110
00111
00000
OP_DEC_2
#C28F64 #593D27
00000
01110
01000
01110
00000
OP_JMP
#3F4055 #8D8FB6
11111
00100
11110
11100
11111
OP_JMP_1
#3F4055 #8D8FB6
11111
01000
11000
11010
11111
OP_JMP_2
#3F4055 #8D8FB6
11111
10001
10001
10111
11111
OP_JPZ
#3F4055 #8D8FB6
11111
11100
01110
11100
11111
OP_JPZ_1
#3F4055 #8D8FB6
11111
01000
11000
11011
11111
OP_JPZ_2
#3F4055 #8D8FB6
11111
10011
11011
11001
11111
OP_JPN
#3F4055 #8D8FB6
11111
11100
01110
01100
11111
OP_JPN_1
#3F4055 #8D8FB6
11111
01000
11000
11011
11111
OP_JPN_2
#3F4055 #8D8FB6
11111
10011
10101
10101
11111
( Numbers )
CNT
TRANSPARENT
MARK_BLUE
#8c90b4
MARK_ORANGE
#c28f64
MARK_RED
#c86a54
CODE_LABEL
transparent
MEM_LABEL \
#949962
POS
#9dcb58
NEG :
#c86a54
N0 0
#302c27
.....
.000.
.0.0.
.000.
.....
N1 1
#302c27
.....
..0..
..0..
..0..
.....
N2 2
#302c27
.....
.00..
..0..
..00.
.....
N3 3
#302c27 #505434
.....
.000.
..10.
.000.
.....
N4 4
#302c27
.....
.0.0.
.000.
...0.
.....
N5 5
#302c27
.....
..00.
..0..
.00..
.....
N6 6
#302c27 #505434
.....
.0...
.010.
.000.
.....
N7 7
#302c27
.....
.000.
...0.
..0..
.....
N8 8
#302c27 #505434
.....
.00..
.010.
..00.
.....
N9 9
#302c27 #505434
.....
.000.
.010.
...0.
.....
O0
#302c27
.....
.000.
.0.0.
.000.
.....
O1
#302c27
.....
..0..
..0..
..0..
.....
O2
#302c27
.....
.00..
..0..
..00.
.....
O3
#302c27 #505434
.....
.000.
..10.
.000.
.....
O4
#302c27
.....
.0.0.
.000.
...0.
.....
O5
#302c27
.....
..00.
..0..
.00..
.....
O6
#302c27 #505434
.....
.0...
.010.
.000.
.....
O7
#302c27
.....
.000.
...0.
..0..
.....
O8
#302c27 #505434
.....
.00..
.010.
..00.
.....
O9
#302c27 #505434
.....
.000.
.010.
...0.
.....
M0
#302c27
.....
.000.
.0.0.
.000.
.....
M1
#302c27
.....
..0..
..0..
..0..
.....
M2
#302c27
.....
.00..
..0..
..00.
.....
M3
#302c27 #505434
.....
.000.
..10.
.000.
.....
M4
#302c27
.....
.0.0.
.000.
...0.
.....
M5
#302c27
.....
..00.
..0..
.00..
.....
M6
#302c27 #505434
.....
.0...
.010.
.000.
.....
M7
#302c27
.....
.000.
...0.
..0..
.....
M8
#302c27 #505434
.....
.00..
.010.
..00.
.....
M9
#302c27 #505434
.....
.000.
.010.
...0.
.....
MX
#302c27
.....
.0.0.
..0..
.0.0.
.....
( UI )
PC #
#49382c #7CCa40 #a58f7e #b9a08d
10023
11023
11123
11023
10023
PC_ERR
#49382c #ff0000 #a58f7e #b9a08d
10023
11023
11123
11023
10023
CURSOR ¤
#ffffff
00.00
0...0
.....
0...0
00.00
CUR_RED
#ff0000
00.00
0...0
.....
0...0
00.00
CUR_YELLOW
#ffff00
00.00
0...0
.....
0...0
00.00
CUR_BLUE
#00bbff
00.00
0...0
.....
0...0
00.00
CUR_JUMP
#49382c #8c90b4 #a58f7e #b9a08d
10023
11023
11123
11023
10023
CUR_DIM
#888888
00.00
0...0
.....
0...0
00.00
CODE_PANEL_C ×
#bca08b
CODE_PANEL_L
#a88f7c #bca08b
...01
...01
...01
...01
...01
CODE_PANEL_B
#bca08b #a88f7c #706053 #968072
00000
11111
.....
22222
33333
PANEL_C ø
#968072
PANEL_T
#706053 #968072
.....
.....
.....
00000
11111
PANEL_B
#968072 #706053
00000
11111
.....
.....
.....
PANEL_L
#706053 #968072
...01
...01
...01
...01
...01
PANEL_R
#968072 #706053
01...
01...
01...
01...
01...
PANEL_M
#706053 #968072 #1b1815
2..01
2..01
2..01
2..01
2..01
CTRL_PANEL_C
#2f2c27
CTRL_PANEL_T
#1b1815
.....
.....
.....
.....
00000
CTRL_PANEL_B
#1b1815
00000
.....
.....
.....
.....
CTRL_PANEL_L
#1b1815
....0
....0
....0
....0
....0
BTN_PLAY
#8dc553 #698540
.....
.01..
.000.
.01..
.....
BTN_PAUSE
#c28f64
.....
.0.0.
.0.0.
.0.0.
.....
BTN_STOP
#c96b52 #4c2f28
.....
.000.
.010.
.000.
.....
BTN_STEP
#8dc553
.....
.000.
...0.
.0.0.
.....
ICON_IN
#444f2d #9cb65b
.....
.011.
.001.
.011.
.....
ICON_OUT
#9cb65b #444f2d
.....
.001.
.011.
.001.
.....
ICON_CPY
#5c2e21 #c96b52
.....
.011.
.101.
.111.
.....
ICON_PST
#c96b52 #5c2e21
.....
.000.
.010.
.100.
.....
ICON_JMP
#3f4055 #8d8fb6
.....
.001.
.111.
.111.
.....
ICON_JPZ
#3f4055 #8d8fb6
.....
.111.
.011.
.111.
.....
ICON_JPN
#3f4055 #8d8fb6
.....
.111.
.011.
.011.
.....
ICON_ADD
#593d27 #c28f64
.....
.011.
.001.
.011.
.....
ICON_SUB
#593d27 #c28f64
.....
.111.
.001.
.111.
.....
ICON_INC
#593d27 #c28f64
.....
.101.
.011.
.111.
.....
ICON_DEC
#593d27 #c28f64
.....
.111.
.011.
.101.
.....
( Special )
R_TICK '
transparent
M_TICK "
transparent
CODE_POS ²
transparent
CODE_STR *
transparent
CODE_END _
transparent
QUEUE_END %
transparent
OUT_STR {
transparent
OUT_END }
transparent
MATH_ADD +
transparent
MATH_ADD_B ß
transparent
MATH_Q_A -
transparent
MATH_Q_B ä
transparent
INC
transparent
DEC
transparent
MEM_SLOT ¡
#505434
OPS_BTN_ROW_0 ç
transparent
OPS_BTN_ROW_1 ¿
transparent
OPS_BTN_ROW_2 å
transparent
OP_DATA
transparent
OP_EMPTY
transparent
PC_ANCHOR ®
#49382c #8c90b4 #a58f7e #b9a08d
10023
.1023
..123
.1023
10023
OP_ANCHOR þ
blue
ICON_ANCHOR
transparent
SEL_TMP æ
transparent
LABEL ;
transparent
HAND =
transparent
PLAYING
transparent
FINISHED
transparent
( Font )
__
#948073
_A
#948073 #2f2c27
00000
01100
01010
01110
01010
_E
#948073 #2f2c27
00000
00110
01000
01100
01110
_L
#948073 #2f2c27
00000
01000
01000
01000
01110
_O
#948073 #2f2c27
00000
01110
01010
01010
01110
_P
#948073 #2f2c27
00000
01100
01010
01110
01000
_U
#948073 #2f2c27
00000
01010
01010
01010
01110
_S
#948073 #2f2c27
00000
01110
01100
00010
01110
_T
#948073 #2f2c27
00000
01110
00100
00100
00100
_Y
#948073 #2f2c27
00000
01010
01010
01110
00100
( States )
S_PLAY
#00ff00
S_PLAY_START
#ffff00
S_PLAY_CONTINUE
#00ffff
S_PLAY_WAIT
orange
S_HALT
#ff0000
S_IDLE
#ff0000 #000000
.....
.....
.....
.....
11110
S_EDIT_START
#ff0000 #000000
.....
.....
.....
.....
11101
S_EDIT
#ff0000 #000000
.....
.....
.....
.....
11100
S_CHANGE_START
#ff0000 #000000
.....
.....
.....
.....
11011
S_CHANGE
#ff0000 #000000
.....
.....
.....
.....
11010
S_CHANGE_MOVING
#ff0000 #000000
.....
.....
.....
.....
11001
S_CHANGE_CANCEL
#ff0000 #000000
.....
.....
.....
.....
11000
S_MEM_SEL_ED
#ff0000 #000000
.....
.....
.....
.....
10111
S_MEM_SEL_CH
#ff0000 #000000
.....
.....
.....
.....
10110
S_LINE_SEL_ED
#ff0000 #000000
.....
.....
.....
.....
10101
S_LINE_SEL_CH
#ff0000 #000000
.....
.....
.....
.....
10100
=======
LEGEND
=======
( Conveyor Belt )
BELT = BELT_MID or BELT_IN_STR or BELT_OUT_STR or BELT_END
( Opcodes )
OPCODE = OP_IN or OP_OUT or OP_CPY or OP_PST or OP_ADD or OP_SUB or OP_INC or OP_DEC or OP_JMP or OP_JPZ or OP_JPN
OP_OTHER = OPCODE
OP_PART = OP_IN_1 or OP_IN_2 or OP_OUT_1 or OP_OUT_2 or OP_CPY_1 or OP_CPY_2 or OP_PST_1 or OP_PST_2 or OP_ADD_1 or OP_ADD_2 or OP_SUB_1 or OP_SUB_2 or OP_INC_1 or OP_INC_2 or OP_DEC_1 or OP_DEC_2 or OP_JMP_1 or OP_JMP_2 or OP_JPZ_1 or OP_JPZ_2 or OP_JPN_1 or OP_JPN_2
A = OP_IN
B = OP_OUT
C = OP_CPY
D = OP_PST
E = OP_ADD
F = OP_SUB
G = OP_INC
H = OP_DEC
I = OP_JMP
J = OP_JPZ
K = OP_JPN
( Numbers )
NUM = N0 or N1 or N2 or N3 or N4 or N5 or N6 or N7 or N8 or N9
O = O0 or O1 or O2 or O3 or O4 or O5 or O6 or O7 or O8 or O9
M = M0 or M1 or M2 or M3 or M4 or M5 or M6 or M7 or M8 or M9 or MX
MATH = MATH_ADD or MATH_ADD_B or MATH_Q_A or MATH_Q_B
MARK = MARK_BLUE or MARK_ORANGE or MARK_RED or CODE_LABEL or MEM_LABEL
SIGN = POS or NEG
( UI )
PANEL = PANEL_C or PANEL_T or PANEL_B or PANEL_L or PANEL_R or PANEL_M or CTRL_PANEL_C or CTRL_PANEL_T or CTRL_PANEL_B or CTRL_PANEL_L
CODE_PANEL = CODE_PANEL_C or CODE_PANEL_L or CODE_PANEL_B
BTN = BTN_PLAY or BTN_PAUSE or BTN_STOP or BTN_STEP
ICON = ICON_IN or ICON_OUT or ICON_CPY or ICON_PST or ICON_ADD or ICON_SUB or ICON_INC or ICON_DEC or ICON_JMP or ICON_JPZ or ICON_JPN
FONT = __ or _A or _E or _L or _O or _P or _U or _S or _T or _Y
CUR_DECO = CUR_YELLOW or CUR_RED or CUR_BLUE or CUR_JUMP or CUR_DIM
CODE_CUR_TGT = OPCODE or OP_DATA
( States )
S_MEM_SEL_X = S_MEM_SEL_ED or S_MEM_SEL_CH
S_LINE_SEL_X = S_LINE_SEL_ED or S_LINE_SEL_CH
STATE = S_PLAY or S_PLAY_START or S_PLAY_CONTINUE or S_PLAY_WAIT or S_HALT or S_IDLE or S_EDIT_START or S_EDIT or S_CHANGE_START or S_CHANGE or S_CHANGE_MOVING or S_CHANGE_CANCEL or S_MEM_SEL_X or S_LINE_SEL_X
( Aliases )
OTHER_M = M
OPS_JMP = OP_JMP or OP_JPZ or OP_JPN
OPS_MEM = OP_CPY or OP_PST or OP_ADD or OP_SUB or OP_INC or OP_DEC
OPS_HELD = OP_OUT or OP_PST or OP_ADD or OP_SUB
OPS_MATH = OP_ADD or OP_SUB or OP_INC or OP_DEC
( Combos )
¶ = PLAYER and R_TICK and S_IDLE
ó = ICON_ANCHOR and PANEL_C
ü = BTN_PLAY and CTRL_PANEL_C
ú = BTN_STOP and CTRL_PANEL_C
í = BTN_STEP and CTRL_PANEL_C
=======
SOUNDS
=======
sfx0 55940507 ( Move opcode )
sfx1 15390302 ( Delete opcode )
================
COLLISIONLAYERS
================
( BG )
BACKGROUND
STATE HELD BELT PANEL CODE_PANEL
PC PC_ERR PC_ANCHOR OP_ANCHOR ICON_ANCHOR
OPCODE OP_PART ICON BTN
OP_EMPTY
MATH OP_DATA
CNT MARK INC DEC
M
MEM_SLOT
SIGN
NUM O
R_TICK M_TICK CODE_POS CODE_STR CODE_END QUEUE_END OUT_STR OUT_END OPS_BTN_ROW_0 OPS_BTN_ROW_1 OPS_BTN_ROW_2 SEL_TMP LABEL HAND FINISHED
PLAYER CURSOR FONT
CUR_DECO PLAYING
======
RULES
======
( Realtime fix )
[ STATIONARY @ ] ["] -> [ @ ] [']
[ MOVING @ ] ['] -> [ MOVING @ ] ["]
(( Setup ))
( UI )
RIGHT [ NO × | × ] -> [ CODE_PANEL_L | × ]
UP [ NO × | × ] -> [ CODE_PANEL_B | × ]
RIGHT [ } | N0 ] [ ç NO ICON |||| ] -> [ } | N0 ] [ ç PANEL_C ICON_IN CURSOR | ICON_OUT | ICON_CPY | ICON_PST | ICON_ADD ]
RIGHT [ } | N0 ] [ ¿ | NO ICON |||| ] -> [ } | N0 ] [ ¿ | PANEL_C ICON_SUB | ICON_INC | ICON_DEC | ICON_JMP | ICON_JPZ ]
RIGHT [ } | N0 ] [ å | NO ICON ] -> [ } | N0 ] [ å | PANEL_C ICON_JPN ]
RIGHT [ NO ø | ø ] -> [ PANEL_M | ø ]
RIGHT [ ø | NO ø ] -> [ ø | PANEL_R ]
UP [ NO ø | ø ] -> [ PANEL_B | ø ]
RIGHT [ NO PANEL | BTN ] -> [ CTRL_PANEL_L | BTN ]
UP [ NO PANEL | BTN ] -> [ CTRL_PANEL_B | BTN ]
DOWN [ NO PANEL | BTN ] -> [ CTRL_PANEL_T | BTN ]
( Belts )
UP [ $ | NO BELT ] -> [ $ | BELT_MID ]
DOWN [ ¥ | NO BELT ] -> [ ¥ | BELT_MID ]
UP [ BELT_MID | NO BELT NO ¥ ] -> [ BELT_MID | BELT_MID ]
DOWN [ BELT_MID | NO BELT NO , ] -> [ BELT_MID | BELT_MID ]
( Memory slots )
DOWN [ N0 NO ¡ | \ ] -> [ ¡ M0 | \ N0 ]
DOWN [ N1 NO ¡ | \ ] -> [ ¡ M1 | \ N1 ]
DOWN [ N2 NO ¡ | \ ] -> [ ¡ M2 | \ N2 ]
DOWN [ N3 NO ¡ | \ ] -> [ ¡ M3 | \ N3 ]
DOWN [ N4 NO ¡ | \ ] -> [ ¡ M4 | \ N4 ]
DOWN [ N5 NO ¡ | \ ] -> [ ¡ M5 | \ N5 ]
DOWN [ N6 NO ¡ | \ ] -> [ ¡ M6 | \ N6 ]
DOWN [ N7 NO ¡ | \ ] -> [ ¡ M7 | \ N7 ]
DOWN [ N8 NO ¡ | \ ] -> [ ¡ M8 | \ N8 ]
DOWN [ N9 NO ¡ | \ ] -> [ ¡ M9 | \ N9 ]
( Mark level number )
RIGHT [ } | NUM ] -> [ } | MARK_BLUE NUM ]
( Code lines counter )
RIGHT [ ² | NO M ] -> [ ² | MARK_RED M0 ]
( Mark jump labels )
RIGHT [ ; | NUM ] -> [ ; | CODE_LABEL NUM ]
RIGHT [ ; | | NUM ] -> [ ; | | CODE_LABEL NUM ]
( Sign numbers on queue )
RIGHT [ BELT_MID NO SIGN NO MARK NUM | NO - ] -> [ POS NUM | ]
RIGHT [ BELT_MID NO SIGN NO MARK NUM | - ] -> [ NEG NUM | ]
(
- TODO:
- [ ] Implement levels
- [ ] Mail Room (01)
- [ ] Busy Mail Room (02)
- [ ] Copy Floor (03)
- [ ] Scrambler Handler (04)
- [ ] Rainy Summer (06)
- [ ] Zero Exterminator (07)
- [ ] Zero Preservation Initiative
- [ ] Sub Hallway (11)
- [ ] Equalization Room (13)
- [ ] Maximization Room (14)
- [ ] Countdown (19)
- [ ] Zero Terminated Sum (21)
- [ ] Implement bonus levels
- [ ] Tripler Room (08)
- [ ] Octoplier Suite (10)
- [ ] Absolute Positivity (16)
- [ ] Cumulative Countdown (25)
- [ ] Clean up UI
- [ ] Add corners to panels
- [ ] Add details to input/output belts
- [x] Implement opcodes
- [x] IN - inbox
- [x] OUT - outbox
- [x] CPY - copyfrom
- [x] PST - copyto
- [x] ADD - add
- [x] SUB - sub
- [x] INC - bump +
- [x] DEC - bump -
- [x] JMP - jump
- [x] JPZ - jump if zero
- [x] JPN - jump if negative
- [x] Halt on invalid states
- [ ] Add visual indicators to the cause of an invalid state
- [ ] X on empty memory slot when trying to CPY
- [ ] X on input queue when trying to IN
- [ ] X on held number when trying to OUT
- [x] Restore initial inputs and clear output after halting (after confirmation)
Maybe with the `checkpoint` and `restart` commands?
We could save a checkpoint whenever the user edits their code,
and restart back to it after confirming on a halted state.
- [x] Play/pause, step through and stop buttons
- [x] Explain the currently targeted button with a tooltip
- [ ] When starting to edit a parameter, place the cursor on the current selection,
instead of the first option
- [ ] Make cursor larger when hovering an opcode
- [ ] Highlight jump target on hover
- [ ] Highlight memory target on hover
- [ ] Eye candy
- [ ] Player character
- [ ] Conveyor belt animation
- Things to consider:
- Rewrite math operations to use START/ENDLOOP
- Indirect memory access
- More lines of code (would probably need to use hex numbers)
)
(( Handle state ))
( PLAY_START )
LATE [ @ S_PLAY_START ] [ * ] -> [ @ S_PLAY_WAIT ] [ * # ]
( PLAY_CONTINUE )
LATE [ @ S_PLAY_CONTINUE ] -> [ @ S_PLAY_WAIT ]
( PLAY )
( Advance the PC )
( NOTE: We stagger it a bit so that jumps are better visualized )
RIGHT ['][ @ S_PLAY PLAYING ] [ # | NO OPCODE ] -> ['][ @ S_IDLE ] [ | ]
( ['][ @ S_PLAY NO PLAYING ] -> ['][ @ S_IDLE ] )
DOWN ['][ @ S_PLAY NO PLAYING ] [ # | ] -> ['][ @ S_IDLE ] [ | # ]
DOWN ['][ @ S_PLAY ] [ # | ] -> ['][ @ S_PLAY_WAIT ] [ | # ]
['][ @ S_PLAY_WAIT NO PLAYING ] [ # ] [ ® ] -> ['][ @ S_IDLE ] [ ] [ # ]
['][ @ S_PLAY_WAIT ] [ # ] [ ® ] -> ['][ @ S_PLAY ] [ ] [ # ]
['][ @ S_PLAY_WAIT NO PLAYING ] -> ['][ @ S_PLAY ]
['][ @ S_PLAY_WAIT ] -> ['][ @ S_PLAY PLAYING ]
( Interact with a control button to use it )
RIGHT [ ACTION @ S_PLAY PLAYING ] [ CURSOR BTN_PAUSE ] -> [ @ S_IDLE ] [ CURSOR BTN_PLAY ]
( HALT )
( Hide every control button other than STOP, then move the cursor to the STOP button )
LATE [ S_HALT ] [ CURSOR ] [ BTN NO BTN_STOP ] [ BTN_STOP ] -> [ S_HALT ] [ ] [ ] [ CURSOR BTN_STOP ]
( Press STOP to restart )
[ ACTION @ S_HALT ] [ CURSOR BTN_STOP ] -> [ @ S_HALT ] [ CURSOR BTN_STOP ] restart
( Turn the PC red to indicate an issue )
LATE [ S_HALT ] [ PC ] -> [ S_HALT ] [ PC_ERR ]
( IDLE )
( DEBUG: Play on ACTION )
( [ ACTION @ S_IDLE ] [ CURSOR NO ICON ] -> [ @ S_PLAY_START ] [ CURSOR ] )
( Interact with an opcode icon to enter EDIT mode )
RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_IN ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_IN ] [ ² | | OP_IN ]
RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_OUT ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_OUT ] [ ² | | OP_OUT ]
RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_CPY ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_CPY ] [ ² | | OP_CPY ]
RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_PST ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_PST ] [ ² | | OP_PST ]
RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_ADD ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_ADD ] [ ² | | OP_ADD ]
RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_SUB ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_SUB ] [ ² | | OP_SUB ]
RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_INC ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_INC ] [ ² | | OP_INC ]
RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_DEC ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_DEC ] [ ² | | OP_DEC ]
RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_JMP ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_JMP ] [ ² | | OP_JMP ]
RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_JPZ ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_JPZ ] [ ² | | OP_JPZ ]
RIGHT [ ACTION @ S_IDLE ] [ CURSOR ICON_JPN ] [ ² | | ] -> [ @ S_EDIT_START ] [ CURSOR ICON_JPN ] [ ² | | OP_JPN ]
( Interact with a control button to use it )
[ ACTION @ S_IDLE ] [ CURSOR BTN_PLAY ] [ # ] -> [ @ S_PLAY_CONTINUE PLAYING ] [ CURSOR BTN_PAUSE ] [ # ]
[ ACTION @ S_IDLE ] [ CURSOR BTN_PLAY ] -> [ @ S_PLAY_START PLAYING ] [ CURSOR BTN_PAUSE ]
[ ACTION @ S_IDLE ] [ CURSOR BTN_STOP ] -> [ @ S_IDLE ] [ CURSOR BTN_STOP ] restart
[ ACTION @ S_IDLE ] [ CURSOR BTN_STEP ] [ # ] -> [ @ S_PLAY_CONTINUE ] [ CURSOR BTN_STEP ] [ # ]
[ ACTION @ S_IDLE ] [ CURSOR BTN_STEP ] -> [ @ S_PLAY_START ] [ CURSOR BTN_STEP ]
( Moving into the top border enters CHANGE mode )
[ UP @ S_IDLE ] [ CURSOR | CODE_PANEL_B ] -> [ @ S_CHANGE_START ] [ CURSOR | CODE_PANEL_B ]
( Moving into and out of the control panel )
LEFT [ LEFT @ S_IDLE ] [ CURSOR | PANEL_M | ] -> [ @ S_IDLE ] [ | PANEL_M | CURSOR ]
RIGHT [ RIGHT @ S_IDLE ] [ CURSOR | PANEL_M | ] -> [ @ S_IDLE ] [ | PANEL_M | CURSOR ]
( Cursor movement )
[ MOVING @ S_IDLE ] [ CURSOR ] -> [ @ S_IDLE ] [ MOVING CURSOR ]
LEFT [ S_IDLE ] [ LEFT CURSOR | PANEL_L ] -> [ S_IDLE ] [ CURSOR | PANEL_L ]
RIGHT [ S_IDLE ] [ RIGHT CURSOR | PANEL_R ] -> [ S_IDLE ] [ CURSOR | PANEL_R ]
DOWN [ S_IDLE ] [ DOWN CURSOR | PANEL_B ] -> [ S_IDLE ] [ CURSOR | PANEL_B ]
LEFT [ S_IDLE ] [ LEFT CURSOR | CTRL_PANEL_L ] -> [ S_IDLE ] [ CURSOR | CTRL_PANEL_L ]
UP [ S_IDLE ] [ UP CURSOR | CTRL_PANEL_T ] -> [ S_IDLE ] [ CURSOR | CTRL_PANEL_T ]
DOWN [ S_IDLE ] [ DOWN CURSOR | CTRL_PANEL_B ] -> [ S_IDLE ] [ CURSOR | CTRL_PANEL_B ]
( EDIT_START )
( If code is full, we can't add anything else, so we return to IDLE )
RIGHT [ S_EDIT_START ] [ ² | MX | OPCODE ] -> [ S_IDLE ] [ ² | MX | ]
( Place the cursor at the last line of code )
RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M0 | OPCODE ] [ | | | | | ; | N0 ] -> [ S_EDIT ] [ ] [ ² | M0 | ] [ CURSOR OPCODE | | | | | ; | N0 ]
RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M1 | OPCODE ] [ | | | | | ; | N1 ] -> [ S_EDIT ] [ ] [ ² | M1 | ] [ CURSOR OPCODE | | | | | ; | N1 ]
RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M2 | OPCODE ] [ | | | | | ; | N2 ] -> [ S_EDIT ] [ ] [ ² | M2 | ] [ CURSOR OPCODE | | | | | ; | N2 ]
RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M3 | OPCODE ] [ | | | | | ; | N3 ] -> [ S_EDIT ] [ ] [ ² | M3 | ] [ CURSOR OPCODE | | | | | ; | N3 ]
RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M4 | OPCODE ] [ | | | | | ; | N4 ] -> [ S_EDIT ] [ ] [ ² | M4 | ] [ CURSOR OPCODE | | | | | ; | N4 ]
RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M5 | OPCODE ] [ | | | | | ; | N5 ] -> [ S_EDIT ] [ ] [ ² | M5 | ] [ CURSOR OPCODE | | | | | ; | N5 ]
RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M6 | OPCODE ] [ | | | | | ; | N6 ] -> [ S_EDIT ] [ ] [ ² | M6 | ] [ CURSOR OPCODE | | | | | ; | N6 ]
RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M7 | OPCODE ] [ | | | | | ; | N7 ] -> [ S_EDIT ] [ ] [ ² | M7 | ] [ CURSOR OPCODE | | | | | ; | N7 ]
RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M8 | OPCODE ] [ | | | | | ; | N8 ] -> [ S_EDIT ] [ ] [ ² | M8 | ] [ CURSOR OPCODE | | | | | ; | N8 ]
RIGHT [ S_EDIT_START ] [ CURSOR ] [ ² | M9 | OPCODE ] [ | | | | | ; | N9 ] -> [ S_EDIT ] [ ] [ ² | M9 | ] [ CURSOR OPCODE | | | | | ; | N9 ]
( EDIT )
( Interact to add an opcode with a parameter and enter MEMORY/LINE SELECT mode, then return to IDLE )
RIGHT [ ACTION @ S_EDIT ] [ CURSOR OPS_MEM | | | | ] [ ¡ M0 ] -> [ @ S_MEM_SEL_ED ] [ OPS_MEM | | | | æ ] [ ¡ M0 CURSOR ]
RIGHT [ ACTION @ S_EDIT ] [ CURSOR OPS_JMP | | | | ] [ | | | | | | ; | N0 ] -> [ @ S_LINE_SEL_ED ] [ OPS_JMP | | | | æ ] [ CURSOR | | | | | | ; | N0 ]
( Interact to add a simple opcode and return to IDLE )
[ ACTION @ S_EDIT ] [ CURSOR ] [ ç ] [ ² ] -> [ @ S_IDLE ] [ ] [ ç CURSOR ] [ ² INC ] checkpoint
( Move left to cancel addition and return to IDLE )
RIGHT [ LEFT @ S_EDIT ] [ CURSOR OPCODE | OP_PART | OP_PART | | ] [ ç ] -> [ @ S_IDLE ] [ | | | | NO OP_EMPTY NO OP_DATA ] [ ç CURSOR ] sfx1
( Handle swapping code lines on vertical movement )
UP [ UP @ S_EDIT ] [ CURSOR OPCODE | OP_OTHER ] -> [ @ S_EDIT ] [ UP CURSOR OPCODE + | OP_OTHER - ] sfx0
DOWN [ DOWN @ S_EDIT ] [ CURSOR OPCODE | OP_OTHER ] -> [ @ S_EDIT ] [ DOWN CURSOR OPCODE - | OP_OTHER + ] sfx0
( CHANGE_START )
( Entering CHANGE mode with empty code returns you back to IDLE )
RIGHT [ S_CHANGE_START ] [ ² | M0 ] [ NO OPCODE | | | | | ; | N0 ] -> [ S_IDLE ] [ ² | M0 ] [ | | | | | ; | N0 ]
( Otherwise, we place the cursor at the last line of code )
RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M1 ] [ | | | | | ; | N0 ] -> [ S_CHANGE ] [ ] [ ² | M1 ] [ CURSOR | | | | | ; | N0 ]
RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M2 ] [ | | | | | ; | N1 ] -> [ S_CHANGE ] [ ] [ ² | M2 ] [ CURSOR | | | | | ; | N1 ]
RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M3 ] [ | | | | | ; | N2 ] -> [ S_CHANGE ] [ ] [ ² | M3 ] [ CURSOR | | | | | ; | N2 ]
RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M4 ] [ | | | | | ; | N3 ] -> [ S_CHANGE ] [ ] [ ² | M4 ] [ CURSOR | | | | | ; | N3 ]
RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M5 ] [ | | | | | ; | N4 ] -> [ S_CHANGE ] [ ] [ ² | M5 ] [ CURSOR | | | | | ; | N4 ]
RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M6 ] [ | | | | | ; | N5 ] -> [ S_CHANGE ] [ ] [ ² | M6 ] [ CURSOR | | | | | ; | N5 ]
RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M7 ] [ | | | | | ; | N6 ] -> [ S_CHANGE ] [ ] [ ² | M7 ] [ CURSOR | | | | | ; | N6 ]
RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M8 ] [ | | | | | ; | N7 ] -> [ S_CHANGE ] [ ] [ ² | M8 ] [ CURSOR | | | | | ; | N7 ]
RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | M9 ] [ | | | | | ; | N8 ] -> [ S_CHANGE ] [ ] [ ² | M9 ] [ CURSOR | | | | | ; | N8 ]
RIGHT [ S_CHANGE_START ] [ CURSOR ] [ ² | MX ] [ | | | | | ; | N9 ] -> [ S_CHANGE ] [ ] [ ² | MX ] [ CURSOR | | | | | ; | N9 ]
( CHANGE )
( Interacting with an opcode enters MOVING mode )
[ ACTION @ S_CHANGE ] [ CURSOR OPCODE ] -> [ @ S_CHANGE_MOVING ] [ CURSOR OPCODE ]
( Interacting with an opcode parameter enters MEMORY/LINE SELECT mode )
[ ACTION @ S_CHANGE ] [ OPS_MEM | | | | CURSOR OP_DATA ] [ ¡ M0 ] -> [ @ S_MEM_SEL_CH ] [ OPS_MEM | | | | OP_DATA æ ] [ ¡ M0 CURSOR ]
[ ACTION @ S_CHANGE ] [ OPS_JMP |||| CURSOR OP_DATA ] [ |||||| ; | N0 ] -> [ @ S_LINE_SEL_CH ] [ OPS_JMP |||| OP_DATA æ ] [ CURSOR |||||| ; | N0 ]
( Cursor movement )
UP [ UP @ S_CHANGE ] [ CURSOR | OPCODE ] -> [ @ S_CHANGE ] [ | CURSOR OPCODE ]
DOWN [ DOWN @ S_CHANGE ] [ CURSOR | OPCODE ] -> [ @ S_CHANGE ] [ | CURSOR OPCODE ]
UP [ UP @ S_CHANGE ] [ CURSOR | ... | OP_DATA ] -> [ @ S_CHANGE ] [ | ... | CURSOR OP_DATA ]
DOWN [ DOWN @ S_CHANGE ] [ CURSOR | ... | OP_DATA ] -> [ @ S_CHANGE ] [ | ... | CURSOR OP_DATA ]
RIGHT [ RIGHT @ S_CHANGE ] [ CURSOR OPCODE | ... | OP_DATA ] -> [ @ S_CHANGE ] [ OPCODE | ... | CURSOR OP_DATA ]
RIGHT [ LEFT @ S_CHANGE ] [ OPCODE | ... | CURSOR OP_DATA ] -> [ @ S_CHANGE ] [ CURSOR OPCODE | ... | OP_DATA ]
( Moving down into an empty line returns you to IDLE mode )
DOWN [ DOWN @ S_CHANGE ] [ CURSOR | NO CODE_CUR_TGT ] [ ç ] -> [ @ S_IDLE ] [ | ] [ ç CURSOR ] checkpoint
[ S_CHANGE ] [ CURSOR NO CODE_CUR_TGT ] [ ² | M0 ] [ ç ] -> [ S_IDLE ] [ ] [ ² | M0 ] [ ç CURSOR ] checkpoint
[ S_CHANGE ] [ CURSOR NO CODE_CUR_TGT ] -> [ S_CHANGE ] [ UP CURSOR ]
( CHANGE_MOVING )
( Interact to finish moving and return to CHANGE mode )
[ ACTION @ S_CHANGE_MOVING ] -> [ @ S_CHANGE ]
( Handle swapping code lines on vertical movement )
UP [ UP @ S_CHANGE_MOVING ] [ CURSOR OPCODE | OP_OTHER ] -> [ @ S_CHANGE_MOVING ] [ UP CURSOR OPCODE + | OP_OTHER - ] sfx0
DOWN [ DOWN @ S_CHANGE_MOVING ] [ CURSOR OPCODE | OP_OTHER ] -> [ @ S_CHANGE_MOVING ] [ DOWN CURSOR OPCODE - | OP_OTHER + ] sfx0
( Move left to delete the currently held opcode and return to IDLE mode )
RIGHT [ LEFT @ S_CHANGE_MOVING ] [ CURSOR OPCODE | OP_PART | OP_PART | | OP_EMPTY ] [ ² ] -> [ @ S_CHANGE ] [ CURSOR | | | | ] [ ² DEC ] sfx1
RIGHT [ LEFT @ S_CHANGE_MOVING ] [ CURSOR OPCODE | OP_PART | OP_PART | | OP_DATA MARK NUM ] [ ² ] -> [ @ S_CHANGE ] [ CURSOR | | | | ] [ ² DEC ] sfx1
( MEM_SEL_* )
( Interact to select a memory slot and return to CHANGE mode if you came from it, or to IDLE otherwise )
DOWN [ ACTION @ S_MEM_SEL_ED ] [ CURSOR | \ NUM ] [ OP_EMPTY æ ] [ ç ] [ ² ] -> [ @ S_IDLE ] [ | \ NUM ] [ NUM ] [ ç CURSOR ] [ ² INC ] checkpoint
DOWN [ ACTION @ S_MEM_SEL_CH ] [ CURSOR | \ NUM ] [ æ ] -> [ @ S_CHANGE ] [ | \ NUM ] [ CURSOR NUM ]
( Cursor movement )
LEFT [ LEFT @ S_MEM_SEL_X ] [ CURSOR | MEM_SLOT ] -> [ @ S_MEM_SEL_X ] [ LEFT CURSOR | MEM_SLOT ]
RIGHT [ RIGHT @ S_MEM_SEL_X ] [ CURSOR | MEM_SLOT ] -> [ @ S_MEM_SEL_X ] [ RIGHT CURSOR | MEM_SLOT ]
DOWN [ DOWN @ S_MEM_SEL_X ] [ CURSOR | \ N0 ] [ | \ N5 ] -> [ @ S_MEM_SEL_X ] [ | \ N0 ] [ CURSOR | \ N5 ]
DOWN [ DOWN @ S_MEM_SEL_X ] [ CURSOR | \ N1 ] [ | \ N6 ] -> [ @ S_MEM_SEL_X ] [ | \ N1 ] [ CURSOR | \ N6 ]
DOWN [ DOWN @ S_MEM_SEL_X ] [ CURSOR | \ N2 ] [ | \ N7 ] -> [ @ S_MEM_SEL_X ] [ | \ N2 ] [ CURSOR | \ N7 ]
DOWN [ DOWN @ S_MEM_SEL_X ] [ CURSOR | \ N3 ] [ | \ N8 ] -> [ @ S_MEM_SEL_X ] [ | \ N3 ] [ CURSOR | \ N8 ]
DOWN [ DOWN @ S_MEM_SEL_X ] [ CURSOR | \ N4 ] [ | \ N9 ] -> [ @ S_MEM_SEL_X ] [ | \ N4 ] [ CURSOR | \ N9 ]
DOWN [ UP @ S_MEM_SEL_X ] [ CURSOR | \ N5 ] [ | \ N0 ] -> [ @ S_MEM_SEL_X ] [ | \ N5 ] [ CURSOR | \ N0 ]
DOWN [ UP @ S_MEM_SEL_X ] [ CURSOR | \ N6 ] [ | \ N1 ] -> [ @ S_MEM_SEL_X ] [ | \ N6 ] [ CURSOR | \ N1 ]
DOWN [ UP @ S_MEM_SEL_X ] [ CURSOR | \ N7 ] [ | \ N2 ] -> [ @ S_MEM_SEL_X ] [ | \ N7 ] [ CURSOR | \ N2 ]
DOWN [ UP @ S_MEM_SEL_X ] [ CURSOR | \ N8 ] [ | \ N3 ] -> [ @ S_MEM_SEL_X ] [ | \ N8 ] [ CURSOR | \ N3 ]
DOWN [ UP @ S_MEM_SEL_X ] [ CURSOR | \ N9 ] [ | \ N4 ] -> [ @ S_MEM_SEL_X ] [ | \ N9 ] [ CURSOR | \ N4 ]
( LINE_SEL_* )
( Interact to select a code line and return to CHANGE mode if you came from it, or to IDLE otherwise )
[ ACTION @ S_LINE_SEL_ED ] [ CURSOR | ... | ; | NUM ] [ OP_EMPTY æ ] [ ç ] [ ² ] -> [ @ S_IDLE ] [ | ... | ; | NUM ] [ NUM ] [ ç CURSOR ] [ ² INC ] checkpoint
[ ACTION @ S_LINE_SEL_CH ] [ CURSOR | ... | ; | NUM ] [ æ ] -> [ @ S_CHANGE ] [ | ... | ; | NUM ] [ CURSOR NUM ]
( Cursor movement )
UP [ UP @ S_LINE_SEL_X ] [ CURSOR | CODE_PANEL_L ] -> [ @ S_LINE_SEL_X ] [ UP CURSOR | CODE_PANEL_L ]
DOWN [ DOWN @ S_LINE_SEL_X ] [ CURSOR | CODE_PANEL_L ] -> [ @ S_LINE_SEL_X ] [ DOWN CURSOR | CODE_PANEL_L ]
( ANY )
( Prevent invalid cursor movements )
[ MOVING @ ] -> [ @ ]
( Update cursor decoration depending on state )
LATE [ CUR_DECO ] -> [ ]
LATE [ S_EDIT ] [ CURSOR ] -> [ S_EDIT ] [ CURSOR CUR_YELLOW ]
LATE [ S_CHANGE_MOVING ] [ CURSOR ] -> [ S_CHANGE_MOVING ] [ CURSOR CUR_YELLOW ]
LATE [ S_LINE_SEL_X ] [ CURSOR ] -> [ S_LINE_SEL_X ] [ CURSOR CUR_JUMP ]
( Cursor tooltip )
LATE RIGHT [ CURSOR NO BTN ] [ FONT ] -> [ CURSOR ] [ ]
LATE RIGHT [ CURSOR BTN_PLAY ] [ | | ó | | ] -> [ CURSOR BTN_PLAY ] [ __ | _P | _L ó | _A | _Y ]
LATE RIGHT [ CURSOR BTN_PAUSE ] [ | | ó | | ] -> [ CURSOR BTN_PAUSE ] [ _P | _A | _U ó | _S | _E ]
LATE RIGHT [ CURSOR BTN_STOP ] [ | | ó | | ] -> [ CURSOR BTN_STOP ] [ __ | _S | _T ó | _O | _P ]
LATE RIGHT [ CURSOR BTN_STEP ] [ | | ó | | ] -> [ CURSOR BTN_STEP ] [ __ | _S | _T ó | _E | _P ]
(( Handle opcode rendering and movement ))
( Perform a swap between two opcodes )
(
- 1. Temporarily store the one that's going up, along with its data.
- 2. Move the one that's going down, along with its data, leaving an anchor for the stored one.
- 3. Restore the stored one at the anchor.
)
RIGHT [ OPCODE + | ... | OP_DATA MARK NUM ] [ ² | | | | | | ] -> [ | ... | ] [ ² | | OPCODE | | | | OP_DATA MARK NUM ]
RIGHT [ OPCODE + | ... | OP_EMPTY OP_DATA ] [ ² | | | | | | ] -> [ | ... | ] [ ² | | OPCODE | | | | OP_EMPTY OP_DATA ]
RIGHT [ OPCODE + | ... | OP_EMPTY ] [ ² | | | | | | ] -> [ | ... | ] [ ² | | OPCODE | | | | OP_EMPTY ]
RIGHT [ OPCODE - | ... | OP_DATA MARK NUM ] -> [ OPCODE þ | ... | þ OP_DATA MARK NUM ]
RIGHT [ OPCODE - | ... | OP_EMPTY OP_DATA ] -> [ OPCODE þ | ... | þ OP_EMPTY OP_DATA ]
RIGHT [ OPCODE - | ... | OP_EMPTY ] -> [ OPCODE þ | ... | þ OP_EMPTY ]
DOWN [ OPCODE þ | ] -> [ þ | OPCODE ]
DOWN [ OP_DATA þ | ] -> [ þ | OP_DATA ]
DOWN [ OP_EMPTY þ | ] -> [ | OP_EMPTY ]
DOWN [ MARK þ | ] -> [ þ | MARK ]
DOWN [ NUM þ | ] -> [ | NUM ]
RIGHT [ ² | | OPCODE | ... | OP_DATA MARK NUM ] [ þ | | | | ] -> [ ² | | | ... | ] [ OPCODE | | | | OP_DATA MARK NUM ]
RIGHT [ ² | | OPCODE | ... | OP_EMPTY OP_DATA ] [ þ | | | | ] -> [ ² | | | ... | ] [ OPCODE | | | | OP_EMPTY OP_DATA ]
RIGHT [ ² | | OPCODE | ... | OP_EMPTY ] [ þ | | | | ] -> [ ² | | | ... | ] [ OPCODE | | | | OP_EMPTY ]
( Delete invalid opcode visuals and their related data )
RIGHT [ NO OPCODE | OP_PART | OP_PART | | ] -> [ | | | | NO OP_EMPTY NO OP_DATA NO MARK NO NUM ]
LATE RIGHT [ CURSOR NO ICON ] [ ICON_ANCHOR OPCODE | OP_PART | OP_PART ] -> [ CURSOR ] [ ICON_ANCHOR | | ]
( Keep opcodes stacked at the top of the code panel )
UP [ OPCODE NO ICON_ANCHOR | NO OPCODE ] -> [ | OPCODE ]
STARTLOOP
UP [ OP_EMPTY | NO OP_EMPTY NO OP_DATA ] -> [ | OP_EMPTY ]
UP [ OP_DATA MARK NUM | NO OP_EMPTY NO OP_DATA ] -> [ | OP_DATA MARK NUM ]
ENDLOOP
( Another pass for deleting invalid opcode visuals )
RIGHT [ NO OPCODE | OP_PART | OP_PART ] -> [ | | ]
( Insert missing opcode parts into recently added/moved code lines )
RIGHT [ OP_IN NO ICON_ANCHOR | | | | ] -> [ OP_IN | OP_IN_1 | OP_IN_2 | | OP_EMPTY ]
RIGHT [ OP_OUT NO ICON_ANCHOR | | | | ] -> [ OP_OUT | OP_OUT_1 | OP_OUT_2 | | OP_EMPTY ]
RIGHT [ OP_CPY NO ICON_ANCHOR | | | | ] -> [ OP_CPY | OP_CPY_1 | OP_CPY_2 | | OP_DATA ]
RIGHT [ OP_PST NO ICON_ANCHOR | | | | ] -> [ OP_PST | OP_PST_1 | OP_PST_2 | | OP_DATA ]
RIGHT [ OP_ADD NO ICON_ANCHOR | | | | ] -> [ OP_ADD | OP_ADD_1 | OP_ADD_2 | | OP_DATA ]
RIGHT [ OP_SUB NO ICON_ANCHOR | | | | ] -> [ OP_SUB | OP_SUB_1 | OP_SUB_2 | | OP_DATA ]
RIGHT [ OP_INC NO ICON_ANCHOR | | | | ] -> [ OP_INC | OP_INC_1 | OP_INC_2 | | OP_DATA ]
RIGHT [ OP_DEC NO ICON_ANCHOR | | | | ] -> [ OP_DEC | OP_DEC_1 | OP_DEC_2 | | OP_DATA ]
RIGHT [ OP_JMP NO ICON_ANCHOR | | | | ] -> [ OP_JMP | OP_JMP_1 | OP_JMP_2 | | OP_DATA ]
RIGHT [ OP_JPZ NO ICON_ANCHOR | | | | ] -> [ OP_JPZ | OP_JPZ_1 | OP_JPZ_2 | | OP_DATA ]
RIGHT [ OP_JPN NO ICON_ANCHOR | | | | ] -> [ OP_JPN | OP_JPN_1 | OP_JPN_2 | | OP_DATA ]
( Insert missing opcode parts into the icon tooltip )
LATE RIGHT [ CURSOR ICON_IN ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_IN ] [ ICON_ANCHOR OP_IN | OP_IN_1 | OP_IN_2 ]
LATE RIGHT [ CURSOR ICON_OUT ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_OUT ] [ ICON_ANCHOR OP_OUT | OP_OUT_1 | OP_OUT_2 ]
LATE RIGHT [ CURSOR ICON_CPY ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_CPY ] [ ICON_ANCHOR OP_CPY | OP_CPY_1 | OP_CPY_2 ]
LATE RIGHT [ CURSOR ICON_PST ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_PST ] [ ICON_ANCHOR OP_PST | OP_PST_1 | OP_PST_2 ]
LATE RIGHT [ CURSOR ICON_ADD ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_ADD ] [ ICON_ANCHOR OP_ADD | OP_ADD_1 | OP_ADD_2 ]
LATE RIGHT [ CURSOR ICON_SUB ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_SUB ] [ ICON_ANCHOR OP_SUB | OP_SUB_1 | OP_SUB_2 ]
LATE RIGHT [ CURSOR ICON_INC ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_INC ] [ ICON_ANCHOR OP_INC | OP_INC_1 | OP_INC_2 ]
LATE RIGHT [ CURSOR ICON_DEC ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_DEC ] [ ICON_ANCHOR OP_DEC | OP_DEC_1 | OP_DEC_2 ]
LATE RIGHT [ CURSOR ICON_JMP ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_JMP ] [ ICON_ANCHOR OP_JMP | OP_JMP_1 | OP_JMP_2 ]
LATE RIGHT [ CURSOR ICON_JPZ ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_JPZ ] [ ICON_ANCHOR OP_JPZ | OP_JPZ_1 | OP_JPZ_2 ]
LATE RIGHT [ CURSOR ICON_JPN ] [ ICON_ANCHOR | | ] -> [ CURSOR ICON_JPN ] [ ICON_ANCHOR OP_JPN | OP_JPN_1 | OP_JPN_2 ]
( Mark newly added opcodes that require parameters as empty )
[ OP_DATA NO NUM ] -> [ OP_EMPTY OP_DATA ]
( Mark opcode parameter numbers )
RIGHT [ OPS_JMP ||| NO MARK NUM ] -> [ OPS_JMP ||| MARK_BLUE NUM ]
RIGHT [ OPS_JMP ||| | NO MARK NUM ] -> [ OPS_JMP ||| | MARK_BLUE NUM ]
RIGHT [ OPS_MATH ||| NO MARK NUM ] -> [ OPS_MATH ||| MARK_ORANGE NUM ]
RIGHT [ OPS_MATH ||| | NO MARK NUM ] -> [ OPS_MATH ||| | MARK_ORANGE NUM ]
RIGHT [ OPS_MEM ||| NO MARK NUM ] -> [ OPS_MEM ||| MARK_RED NUM ]
RIGHT [ OPS_MEM ||| | NO MARK NUM ] -> [ OPS_MEM ||| | MARK_RED NUM ]
(( Run the opcode pointed at by the Program Counter ))
( IN )
( HALT: Can't IN with no numbers in input queue )
RIGHT ['][ @ S_PLAY ] [ # | OP_IN ] [ = | NO NUM ] -> ['][ @ S_HALT ] [ # | OP_IN ] [ = | ]
RIGHT ['][ @ S_PLAY ] [ # | OP_IN ] [ = | SIGN NUM ] [ ? ] -> ['][ @ S_PLAY ] [ # | OP_IN ] [ = | ] [ ? SIGN NUM ]
( OUT )
( HALT: Can't OUT, PST, ADD, or SUB without holding a number )
RIGHT ['][ @ S_PLAY ] [ # | OPS_HELD ] [ ? NO NUM ] -> ['][ @ S_HALT ] [ # | OPS_HELD ] [ ? ]
RIGHT ['][ @ S_PLAY ] [ # | OP_OUT ] [ ? SIGN NUM ] [ ¥ ] -> ['][ @ S_PLAY ] [ # | OP_OUT ] [ ? ] [ ¥ SIGN NUM ]
( CPY )
( HALT: Can't CPY, ADD, SUB, INC or DEC with an empty mem slot )
RIGHT ['][ @ S_PLAY ] [ # | OPS_MEM NO OP_PST |||| N0 ] [ ¡ M0 NO NUM ] -> ['][ @ S_HALT ] [ # | OPS_MEM |||| N0 ] [ ¡ M0 ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MEM NO OP_PST |||| N1 ] [ ¡ M1 NO NUM ] -> ['][ @ S_HALT ] [ # | OPS_MEM |||| N1 ] [ ¡ M1 ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MEM NO OP_PST |||| N2 ] [ ¡ M2 NO NUM ] -> ['][ @ S_HALT ] [ # | OPS_MEM |||| N2 ] [ ¡ M2 ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MEM NO OP_PST |||| N3 ] [ ¡ M3 NO NUM ] -> ['][ @ S_HALT ] [ # | OPS_MEM |||| N3 ] [ ¡ M3 ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MEM NO OP_PST |||| N4 ] [ ¡ M4 NO NUM ] -> ['][ @ S_HALT ] [ # | OPS_MEM |||| N4 ] [ ¡ M4 ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MEM NO OP_PST |||| N5 ] [ ¡ M5 NO NUM ] -> ['][ @ S_HALT ] [ # | OPS_MEM |||| N5 ] [ ¡ M5 ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MEM NO OP_PST |||| N6 ] [ ¡ M6 NO NUM ] -> ['][ @ S_HALT ] [ # | OPS_MEM |||| N6 ] [ ¡ M6 ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MEM NO OP_PST |||| N7 ] [ ¡ M7 NO NUM ] -> ['][ @ S_HALT ] [ # | OPS_MEM |||| N7 ] [ ¡ M7 ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MEM NO OP_PST |||| N8 ] [ ¡ M8 NO NUM ] -> ['][ @ S_HALT ] [ # | OPS_MEM |||| N8 ] [ ¡ M8 ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MEM NO OP_PST |||| N9 ] [ ¡ M9 NO NUM ] -> ['][ @ S_HALT ] [ # | OPS_MEM |||| N9 ] [ ¡ M9 ]
RIGHT ['][ @ S_PLAY ] [ # | OP_CPY | | | | N0 ] [ ? ] [ ¡ M0 SIGN NUM ] -> ['][ @ S_PLAY ] [ # | OP_CPY | | | | N0 ] [ ? SIGN NUM ] [ ¡ M0 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_CPY | | | | N1 ] [ ? ] [ ¡ M1 SIGN NUM ] -> ['][ @ S_PLAY ] [ # | OP_CPY | | | | N1 ] [ ? SIGN NUM ] [ ¡ M1 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_CPY | | | | N2 ] [ ? ] [ ¡ M2 SIGN NUM ] -> ['][ @ S_PLAY ] [ # | OP_CPY | | | | N2 ] [ ? SIGN NUM ] [ ¡ M2 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_CPY | | | | N3 ] [ ? ] [ ¡ M3 SIGN NUM ] -> ['][ @ S_PLAY ] [ # | OP_CPY | | | | N3 ] [ ? SIGN NUM ] [ ¡ M3 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_CPY | | | | N4 ] [ ? ] [ ¡ M4 SIGN NUM ] -> ['][ @ S_PLAY ] [ # | OP_CPY | | | | N4 ] [ ? SIGN NUM ] [ ¡ M4 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_CPY | | | | N5 ] [ ? ] [ ¡ M5 SIGN NUM ] -> ['][ @ S_PLAY ] [ # | OP_CPY | | | | N5 ] [ ? SIGN NUM ] [ ¡ M5 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_CPY | | | | N6 ] [ ? ] [ ¡ M6 SIGN NUM ] -> ['][ @ S_PLAY ] [ # | OP_CPY | | | | N6 ] [ ? SIGN NUM ] [ ¡ M6 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_CPY | | | | N7 ] [ ? ] [ ¡ M7 SIGN NUM ] -> ['][ @ S_PLAY ] [ # | OP_CPY | | | | N7 ] [ ? SIGN NUM ] [ ¡ M7 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_CPY | | | | N8 ] [ ? ] [ ¡ M8 SIGN NUM ] -> ['][ @ S_PLAY ] [ # | OP_CPY | | | | N8 ] [ ? SIGN NUM ] [ ¡ M8 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_CPY | | | | N9 ] [ ? ] [ ¡ M9 SIGN NUM ] -> ['][ @ S_PLAY ] [ # | OP_CPY | | | | N9 ] [ ? SIGN NUM ] [ ¡ M9 SIGN NUM ]
( PST )
( HALT: Can't PST without holding a number )
RIGHT ['][ @ S_PLAY ] [ # | OP_PST ] [ ? NO NUM ] -> ['][ @ S_HALT ] [ # | OP_PST ] [ ? ]
RIGHT ['][ @ S_PLAY ] [ # | OP_PST | | | | N0 ] [ ? SIGN NUM ] [ ¡ M0 ] -> ['][ @ S_PLAY ] [ # | OP_PST | | | | N0 ] [ ? SIGN NUM ] [ ¡ M0 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_PST | | | | N1 ] [ ? SIGN NUM ] [ ¡ M1 ] -> ['][ @ S_PLAY ] [ # | OP_PST | | | | N1 ] [ ? SIGN NUM ] [ ¡ M1 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_PST | | | | N2 ] [ ? SIGN NUM ] [ ¡ M2 ] -> ['][ @ S_PLAY ] [ # | OP_PST | | | | N2 ] [ ? SIGN NUM ] [ ¡ M2 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_PST | | | | N3 ] [ ? SIGN NUM ] [ ¡ M3 ] -> ['][ @ S_PLAY ] [ # | OP_PST | | | | N3 ] [ ? SIGN NUM ] [ ¡ M3 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_PST | | | | N4 ] [ ? SIGN NUM ] [ ¡ M4 ] -> ['][ @ S_PLAY ] [ # | OP_PST | | | | N4 ] [ ? SIGN NUM ] [ ¡ M4 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_PST | | | | N5 ] [ ? SIGN NUM ] [ ¡ M5 ] -> ['][ @ S_PLAY ] [ # | OP_PST | | | | N5 ] [ ? SIGN NUM ] [ ¡ M5 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_PST | | | | N6 ] [ ? SIGN NUM ] [ ¡ M6 ] -> ['][ @ S_PLAY ] [ # | OP_PST | | | | N6 ] [ ? SIGN NUM ] [ ¡ M6 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_PST | | | | N7 ] [ ? SIGN NUM ] [ ¡ M7 ] -> ['][ @ S_PLAY ] [ # | OP_PST | | | | N7 ] [ ? SIGN NUM ] [ ¡ M7 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_PST | | | | N8 ] [ ? SIGN NUM ] [ ¡ M8 ] -> ['][ @ S_PLAY ] [ # | OP_PST | | | | N8 ] [ ? SIGN NUM ] [ ¡ M8 SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OP_PST | | | | N9 ] [ ? SIGN NUM ] [ ¡ M9 ] -> ['][ @ S_PLAY ] [ # | OP_PST | | | | N9 ] [ ? SIGN NUM ] [ ¡ M9 SIGN NUM ]
( ADD )
RIGHT ['][ @ S_PLAY ] [ # | OP_ADD ] [ + | ] -> ['][ @ S_PLAY ] [ # | OP_ADD ] [ + | + ]
( SUB )
RIGHT ['][ @ S_PLAY ] [ # | OP_SUB ] [ + | ] -> ['][ @ S_PLAY ] [ # | OP_SUB ] [ + | - ]
( INC )
RIGHT ['][ @ S_PLAY ] [ # | OP_INC |||| N0 ] [ + | ] [ ² || ] -> ['][ @ S_PLAY ] [ # | OP_INC |||| N0 ] [ + | + ] [ ² || + M0 ]
RIGHT ['][ @ S_PLAY ] [ # | OP_INC |||| N1 ] [ + | ] [ ² || ] -> ['][ @ S_PLAY ] [ # | OP_INC |||| N1 ] [ + | + ] [ ² || + M1 ]
( ... )
( DEC )
RIGHT ['][ @ S_PLAY ] [ # | OP_DEC |||| N0 ] [ + | ] [ ² || ] -> ['][ @ S_PLAY ] [ # | OP_DEC |||| N0 ] [ + | + ] [ ² || + M0 ]
RIGHT ['][ @ S_PLAY ] [ # | OP_DEC |||| N1 ] [ + | ] [ ² || ] -> ['][ @ S_PLAY ] [ # | OP_DEC |||| N1 ] [ + | + ] [ ² || + M1 ]
( ... )
( Get operands for math operation )
RIGHT ['][ @ S_PLAY ] [ # | OP_INC ] [ - | ] -> ['][ @ S_PLAY ] [ # | OP_INC ] [ - | POS M1 ]
RIGHT ['][ @ S_PLAY ] [ # | OP_DEC ] [ - | ] -> ['][ @ S_PLAY ] [ # | OP_DEC ] [ - | NEG M1 ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MATH NO OP_INC NO OP_DEC ] [ ? SIGN NUM ] [ - | ] -> ['][ @ S_PLAY ] [ # | OPS_MATH ] [ ? SIGN NUM ] [ - | SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MATH |||| N0 ] [ ¡ M0 SIGN NUM ] [ ä | ] -> ['][ @ S_PLAY ] [ # | OPS_MATH |||| N0 ] [ ¡ M0 SIGN NUM ] [ ä | SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MATH |||| N1 ] [ ¡ M1 SIGN NUM ] [ ä | ] -> ['][ @ S_PLAY ] [ # | OPS_MATH |||| N1 ] [ ¡ M1 SIGN NUM ] [ ä | SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MATH |||| N2 ] [ ¡ M2 SIGN NUM ] [ ä | ] -> ['][ @ S_PLAY ] [ # | OPS_MATH |||| N2 ] [ ¡ M2 SIGN NUM ] [ ä | SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MATH |||| N3 ] [ ¡ M3 SIGN NUM ] [ ä | ] -> ['][ @ S_PLAY ] [ # | OPS_MATH |||| N3 ] [ ¡ M3 SIGN NUM ] [ ä | SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MATH |||| N4 ] [ ¡ M4 SIGN NUM ] [ ä | ] -> ['][ @ S_PLAY ] [ # | OPS_MATH |||| N4 ] [ ¡ M4 SIGN NUM ] [ ä | SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MATH |||| N5 ] [ ¡ M5 SIGN NUM ] [ ä | ] -> ['][ @ S_PLAY ] [ # | OPS_MATH |||| N5 ] [ ¡ M5 SIGN NUM ] [ ä | SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MATH |||| N6 ] [ ¡ M6 SIGN NUM ] [ ä | ] -> ['][ @ S_PLAY ] [ # | OPS_MATH |||| N6 ] [ ¡ M6 SIGN NUM ] [ ä | SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MATH |||| N6 ] [ ¡ M7 SIGN NUM ] [ ä | ] -> ['][ @ S_PLAY ] [ # | OPS_MATH |||| N7 ] [ ¡ M7 SIGN NUM ] [ ä | SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MATH |||| N7 ] [ ¡ M8 SIGN NUM ] [ ä | ] -> ['][ @ S_PLAY ] [ # | OPS_MATH |||| N8 ] [ ¡ M8 SIGN NUM ] [ ä | SIGN NUM ]
RIGHT ['][ @ S_PLAY ] [ # | OPS_MATH |||| N8 ] [ ¡ M9 SIGN NUM ] [ ä | ] -> ['][ @ S_PLAY ] [ # | OPS_MATH |||| N9 ] [ ¡ M9 SIGN NUM ] [ ä | SIGN NUM ]
( JMP )
( We always jump )
RIGHT ['][ @ S_PLAY ] [ # | OP_JMP ] -> ['][ @ S_PLAY_WAIT ] [ # | OP_JMP ]
( JPZ )
( HALT: Can't check for a zero without holding a number )
RIGHT ['][ @ S_PLAY ] [ # | OP_JPZ ] [ ? NO NUM ] -> ['][ @ S_HALT ] [ # | OP_JPZ ] [ ? ]
( We only jump if holding a zero )
RIGHT ['][ @ S_PLAY ] [ # | OP_JPZ ] [ ? N0 ] -> ['][ @ S_PLAY_WAIT ] [ # | OP_JPZ ] [ ? N0 ]
( JPZ )
( HALT: Can't check for a negative number without holding one )
RIGHT ['][ @ S_PLAY ] [ # | OP_JPN ] [ ? NO NUM ] -> ['][ @ S_HALT ] [ # | OP_JPN ] [ ? ]
( We only jump if holding a negative number )
RIGHT ['][ @ S_PLAY ] [ # | OP_JPN ] [ ? NEG ] -> ['][ @ S_PLAY_WAIT ] [ # | OP_JPN ] [ ? NEG ]
( Resolve jump )
RIGHT ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N0 ] [ | | | | | | ; | N0 ] -> ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N0 ] [ ® | | | | | | ; | N0 ]
RIGHT ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N1 ] [ | | | | | | ; | N1 ] -> ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N1 ] [ ® | | | | | | ; | N1 ]
RIGHT ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N2 ] [ | | | | | | ; | N2 ] -> ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N2 ] [ ® | | | | | | ; | N2 ]
RIGHT ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N3 ] [ | | | | | | ; | N3 ] -> ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N3 ] [ ® | | | | | | ; | N3 ]
RIGHT ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N4 ] [ | | | | | | ; | N4 ] -> ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N4 ] [ ® | | | | | | ; | N4 ]
RIGHT ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N5 ] [ | | | | | | ; | N5 ] -> ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N5 ] [ ® | | | | | | ; | N5 ]
RIGHT ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N6 ] [ | | | | | | ; | N6 ] -> ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N6 ] [ ® | | | | | | ; | N6 ]
RIGHT ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N7 ] [ | | | | | | ; | N7 ] -> ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N7 ] [ ® | | | | | | ; | N7 ]
RIGHT ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N8 ] [ | | | | | | ; | N8 ] -> ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N8 ] [ ® | | | | | | ; | N8 ]
RIGHT ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N9 ] [ | | | | | | ; | N9 ] -> ['][ @ S_PLAY_WAIT ] [ # | OPS_JMP | | | | N9 ] [ ® | | | | | | ; | N9 ]
(( Perform math operations ))
( Convert from N to M )
RIGHT [ MATH | N0 ] -> [ MATH | M0 ]
RIGHT [ MATH | N1 ] -> [ MATH | M1 ]
RIGHT [ MATH | N2 ] -> [ MATH | M2 ]
RIGHT [ MATH | N3 ] -> [ MATH | M3 ]
RIGHT [ MATH | N4 ] -> [ MATH | M4 ]
RIGHT [ MATH | N5 ] -> [ MATH | M5 ]
RIGHT [ MATH | N6 ] -> [ MATH | M6 ]
RIGHT [ MATH | N7 ] -> [ MATH | M7 ]
RIGHT [ MATH | N8 ] -> [ MATH | M8 ]
RIGHT [ MATH | N9 ] -> [ MATH | M9 ]
(
- We really don't want to have to implement every single combination of operands and signs...
- It's really easy to do math one step at a time, but the bigger the numbers, the more turns it
- takes to finish, and we want to do it in a *single turn*.
- Thankfully, we can perform both ADD and SUB with addition by transforming the operands beforehand,
- as well as inverting the result for some cases:
-
- ADD +A +B = C -> nothing
- ADD +A -B = C -> nothing
- ADD -A +B = C -> swap A and B
- ADD -A -B = C -> ~A, ~B and ~C
-
- SUB +A +B = C -> ~B
- SUB +A -B = C -> ~B, swap A and B
- SUB -A +B = C -> ~A, ~B and ~C
- SUB -A -B = C -> ~A and ~C
)
RIGHT [ + | + ] [ ß | ] [ - | POS M ] [ ä | SIGN OTHER_M ] -> [ + | POS M ] [ ß | SIGN OTHER_M ] [ - | ] [ ä | ] ( do nothing )
RIGHT [ + | + ] [ ß | ] [ - | NEG M ] [ ä | POS OTHER_M ] -> [ + | POS OTHER_M ] [ ß | NEG M ] [ - | ] [ ä | ] ( swap A and B )
RIGHT [ + | + ] [ ß | ] [ - | NEG M ] [ ä | NEG OTHER_M ] -> [ + | POS M ] [ ß | POS OTHER_M ] [ - | ] [ ä | - ] ( ~A, ~B and ~C )
RIGHT [ + | - ] [ ß | ] [ - | POS M ] [ ä | POS OTHER_M ] -> [ + | POS M ] [ ß | NEG OTHER_M ] [ - | ] [ ä | ] ( ~B )
RIGHT [ + | - ] [ ß | ] [ - | POS M ] [ ä | NEG OTHER_M ] -> [ + | POS OTHER_M ] [ ß | POS M ] [ - | ] [ ä | ] ( ~B, swap A and B )
RIGHT [ + | - ] [ ß | ] [ - | NEG M ] [ ä | POS OTHER_M ] -> [ + | POS M ] [ ß | NEG OTHER_M ] [ - | ] [ ä | - ] ( ~A, ~B and ~C )
RIGHT [ + | - ] [ ß | ] [ - | NEG M ] [ ä | NEG OTHER_M ] -> [ + | POS M ] [ ß | NEG OTHER_M ] [ - | ] [ ä | - ] ( ~A and ~C )
( HALT: Integer overflow )
RIGHT [ S_PLAY ] [ + | POS M1 ] [ ß | POS M9 ] -> [ S_HALT ] [ + | ] [ ß | ]
RIGHT [ S_PLAY ] [ + | POS M2 ] [ ß | POS M8 ] -> [ S_HALT ] [ + | ] [ ß | ]
RIGHT [ S_PLAY ] [ + | POS M3 ] [ ß | POS M7 ] -> [ S_HALT ] [ + | ] [ ß | ]
RIGHT [ S_PLAY ] [ + | POS M4 ] [ ß | POS M6 ] -> [ S_HALT ] [ + | ] [ ß | ]
RIGHT [ S_PLAY ] [ + | POS M5 ] [ ß | POS M5 ] -> [ S_HALT ] [ + | ] [ ß | ]
RIGHT [ S_PLAY ] [ + | POS M6 ] [ ß | POS M4 ] -> [ S_HALT ] [ + | ] [ ß | ]
RIGHT [ S_PLAY ] [ + | POS M7 ] [ ß | POS M3 ] -> [ S_HALT ] [ + | ] [ ß | ]
RIGHT [ S_PLAY ] [ + | POS M8 ] [ ß | POS M2 ] -> [ S_HALT ] [ + | ] [ ß | ]
RIGHT [ S_PLAY ] [ + | POS M9 ] [ ß | POS M1 ] -> [ S_HALT ] [ + | ] [ ß | ]
( Calculate )
RIGHT [ + | SIGN M ] [ ß | M0 ] -> [ + | SIGN M ] [ ß | NO SIGN ]
RIGHT [ + | M0 ] [ ß | SIGN M ] -> [ + | SIGN M ] [ ß | NO SIGN ]
RIGHT [ + | POS M1 ] [ ß | POS M1 ] -> [ + | POS M2 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | POS M2 ] -> [ + | POS M3 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | POS M3 ] -> [ + | POS M4 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | POS M4 ] -> [ + | POS M5 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | POS M5 ] -> [ + | POS M6 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | POS M6 ] -> [ + | POS M7 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | POS M7 ] -> [ + | POS M8 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | POS M8 ] -> [ + | POS M9 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | POS M1 ] -> [ + | POS M3 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | POS M2 ] -> [ + | POS M4 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | POS M3 ] -> [ + | POS M5 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | POS M4 ] -> [ + | POS M6 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | POS M5 ] -> [ + | POS M7 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | POS M6 ] -> [ + | POS M8 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | POS M7 ] -> [ + | POS M9 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | POS M1 ] -> [ + | POS M4 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | POS M2 ] -> [ + | POS M5 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | POS M3 ] -> [ + | POS M6 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | POS M4 ] -> [ + | POS M7 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | POS M5 ] -> [ + | POS M8 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | POS M6 ] -> [ + | POS M9 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | POS M1 ] -> [ + | POS M5 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | POS M2 ] -> [ + | POS M6 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | POS M3 ] -> [ + | POS M7 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | POS M4 ] -> [ + | POS M8 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | POS M5 ] -> [ + | POS M9 ] [ ß | ]
RIGHT [ + | POS M5 ] [ ß | POS M1 ] -> [ + | POS M6 ] [ ß | ]
RIGHT [ + | POS M5 ] [ ß | POS M2 ] -> [ + | POS M7 ] [ ß | ]
RIGHT [ + | POS M5 ] [ ß | POS M3 ] -> [ + | POS M8 ] [ ß | ]
RIGHT [ + | POS M5 ] [ ß | POS M4 ] -> [ + | POS M9 ] [ ß | ]
RIGHT [ + | POS M6 ] [ ß | POS M1 ] -> [ + | POS M7 ] [ ß | ]
RIGHT [ + | POS M6 ] [ ß | POS M1 ] -> [ + | POS M8 ] [ ß | ]
RIGHT [ + | POS M6 ] [ ß | POS M1 ] -> [ + | POS M9 ] [ ß | ]
RIGHT [ + | POS M7 ] [ ß | POS M1 ] -> [ + | POS M8 ] [ ß | ]
RIGHT [ + | POS M7 ] [ ß | POS M2 ] -> [ + | POS M9 ] [ ß | ]
RIGHT [ + | POS M8 ] [ ß | POS M1 ] -> [ + | POS M9 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | NEG M1 ] -> [ + | POS M0 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | NEG M2 ] -> [ + | NEG M1 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | NEG M3 ] -> [ + | NEG M2 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | NEG M4 ] -> [ + | NEG M3 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | NEG M5 ] -> [ + | NEG M4 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | NEG M6 ] -> [ + | NEG M5 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | NEG M7 ] -> [ + | NEG M6 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | NEG M8 ] -> [ + | NEG M7 ] [ ß | ]
RIGHT [ + | POS M1 ] [ ß | NEG M9 ] -> [ + | NEG M8 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | NEG M1 ] -> [ + | POS M1 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | NEG M2 ] -> [ + | POS M0 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | NEG M3 ] -> [ + | NEG M1 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | NEG M4 ] -> [ + | NEG M2 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | NEG M5 ] -> [ + | NEG M3 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | NEG M6 ] -> [ + | NEG M4 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | NEG M7 ] -> [ + | NEG M5 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | NEG M8 ] -> [ + | NEG M6 ] [ ß | ]
RIGHT [ + | POS M2 ] [ ß | NEG M9 ] -> [ + | NEG M7 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | NEG M1 ] -> [ + | POS M2 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | NEG M2 ] -> [ + | POS M1 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | NEG M3 ] -> [ + | POS M0 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | NEG M4 ] -> [ + | NEG M1 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | NEG M5 ] -> [ + | NEG M2 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | NEG M6 ] -> [ + | NEG M3 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | NEG M7 ] -> [ + | NEG M4 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | NEG M8 ] -> [ + | NEG M5 ] [ ß | ]
RIGHT [ + | POS M3 ] [ ß | NEG M9 ] -> [ + | NEG M6 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | NEG M1 ] -> [ + | POS M3 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | NEG M2 ] -> [ + | POS M2 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | NEG M3 ] -> [ + | POS M1 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | NEG M4 ] -> [ + | POS M0 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | NEG M5 ] -> [ + | NEG M1 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | NEG M6 ] -> [ + | NEG M2 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | NEG M7 ] -> [ + | NEG M3 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | NEG M8 ] -> [ + | NEG M4 ] [ ß | ]
RIGHT [ + | POS M4 ] [ ß | NEG M9 ] -> [ + | NEG M5 ] [ ß | ]
RIGHT [ + | POS M5 ] [ ß | NEG M1 ] -> [ + | POS M4 ] [ ß | ]
RIGHT [ + | POS M5 ] [ ß | NEG M2 ] -> [ + | POS M3 ] [ ß | ]
RIGHT [ + | POS M5 ] [ ß | NEG M3 ] -> [ + | POS M2 ] [ ß | ]
RIGHT [ + | POS M5 ] [ ß | NEG M4 ] -> [ + | POS M1 ] [ ß | ]
RIGHT [ + | POS M5 ] [ ß | NEG M5 ] -> [ + | POS M0 ] [ ß | ]
RIGHT [ + | POS M5 ] [ ß | NEG M6 ] -> [ + | NEG M1 ] [ ß | ]
RIGHT [ + | POS M5 ] [ ß | NEG M7 ] -> [ + | NEG M2 ] [ ß | ]
RIGHT [ + | POS M5 ] [ ß | NEG M8 ] -> [ + | NEG M3 ] [ ß | ]
RIGHT [ + | POS M5 ] [ ß | NEG M9 ] -> [ + | NEG M4 ] [ ß | ]
RIGHT [ + | POS M6 ] [ ß | NEG M1 ] -> [ + | POS M5 ] [ ß | ]
RIGHT [ + | POS M6 ] [ ß | NEG M2 ] -> [ + | POS M4 ] [ ß | ]
RIGHT [ + | POS M6 ] [ ß | NEG M3 ] -> [ + | POS M3 ] [ ß | ]
RIGHT [ + | POS M6 ] [ ß | NEG M4 ] -> [ + | POS M2 ] [ ß | ]
RIGHT [ + | POS M6 ] [ ß | NEG M5 ] -> [ + | POS M1 ] [ ß | ]
RIGHT [ + | POS M6 ] [ ß | NEG M6 ] -> [ + | POS M0 ] [ ß | ]
RIGHT [ + | POS M6 ] [ ß | NEG M7 ] -> [ + | NEG M1 ] [ ß | ]
RIGHT [ + | POS M6 ] [ ß | NEG M8 ] -> [ + | NEG M2 ] [ ß | ]
RIGHT [ + | POS M6 ] [ ß | NEG M9 ] -> [ + | NEG M3 ] [ ß | ]
RIGHT [ + | POS M7 ] [ ß | NEG M1 ] -> [ + | POS M6 ] [ ß | ]
RIGHT [ + | POS M7 ] [ ß | NEG M2 ] -> [ + | POS M5 ] [ ß | ]
RIGHT [ + | POS M7 ] [ ß | NEG M3 ] -> [ + | POS M4 ] [ ß | ]
RIGHT [ + | POS M7 ] [ ß | NEG M4 ] -> [ + | POS M3 ] [ ß | ]
RIGHT [ + | POS M7 ] [ ß | NEG M5 ] -> [ + | POS M2 ] [ ß | ]
RIGHT [ + | POS M7 ] [ ß | NEG M6 ] -> [ + | POS M1 ] [ ß | ]
RIGHT [ + | POS M7 ] [ ß | NEG M7 ] -> [ + | POS M0 ] [ ß | ]
RIGHT [ + | POS M7 ] [ ß | NEG M8 ] -> [ + | NEG M1 ] [ ß | ]
RIGHT [ + | POS M7 ] [ ß | NEG M9 ] -> [ + | NEG M2 ] [ ß | ]
RIGHT [ + | POS M8 ] [ ß | NEG M1 ] -> [ + | POS M7 ] [ ß | ]
RIGHT [ + | POS M8 ] [ ß | NEG M2 ] -> [ + | POS M6 ] [ ß | ]
RIGHT [ + | POS M8 ] [ ß | NEG M3 ] -> [ + | POS M5 ] [ ß | ]
RIGHT [ + | POS M8 ] [ ß | NEG M4 ] -> [ + | POS M4 ] [ ß | ]
RIGHT [ + | POS M8 ] [ ß | NEG M5 ] -> [ + | POS M3 ] [ ß | ]
RIGHT [ + | POS M8 ] [ ß | NEG M6 ] -> [ + | POS M2 ] [ ß | ]
RIGHT [ + | POS M8 ] [ ß | NEG M7 ] -> [ + | POS M1 ] [ ß | ]
RIGHT [ + | POS M8 ] [ ß | NEG M8 ] -> [ + | POS M0 ] [ ß | ]
RIGHT [ + | POS M8 ] [ ß | NEG M9 ] -> [ + | NEG M1 ] [ ß | ]
RIGHT [ + | POS M9 ] [ ß | NEG M1 ] -> [ + | POS M8 ] [ ß | ]
RIGHT [ + | POS M9 ] [ ß | NEG M2 ] -> [ + | POS M7 ] [ ß | ]
RIGHT [ + | POS M9 ] [ ß | NEG M3 ] -> [ + | POS M6 ] [ ß | ]
RIGHT [ + | POS M9 ] [ ß | NEG M4 ] -> [ + | POS M5 ] [ ß | ]
RIGHT [ + | POS M9 ] [ ß | NEG M5 ] -> [ + | POS M4 ] [ ß | ]
RIGHT [ + | POS M9 ] [ ß | NEG M6 ] -> [ + | POS M3 ] [ ß | ]
RIGHT [ + | POS M9 ] [ ß | NEG M7 ] -> [ + | POS M2 ] [ ß | ]
RIGHT [ + | POS M9 ] [ ß | NEG M8 ] -> [ + | POS M1 ] [ ß | ]
RIGHT [ + | POS M9 ] [ ß | NEG M9 ] -> [ + | POS M0 ] [ ß | ]
( Invert the result if necessary )
RIGHT [ + | POS ] [ ä | - ] -> [ + | NEG ] [ ä | ]
RIGHT [ + | NEG ] [ ä | - ] -> [ + | POS ] [ ä | ]
( Convert the result from M to N )
RIGHT [ + | M0 ] -> [ + | N0 ]
RIGHT [ + | M1 ] -> [ + | N1 ]
RIGHT [ + | M2 ] -> [ + | N2 ]
RIGHT [ + | M3 ] -> [ + | N3 ]
RIGHT [ + | M4 ] -> [ + | N4 ]
RIGHT [ + | M5 ] -> [ + | N5 ]
RIGHT [ + | M6 ] -> [ + | N6 ]
RIGHT [ + | M7 ] -> [ + | N7 ]
RIGHT [ + | M8 ] -> [ + | N8 ]
RIGHT [ + | M9 ] -> [ + | N9 ]
( Write the result to memory if necessary )
RIGHT [ + | SIGN NUM ] [ ² || + M0 ] [ ¡ M0 ] -> [ + | ] [ ² || ] [ ¡ M0 SIGN NUM ]
RIGHT [ + | SIGN NUM ] [ ² || + M1 ] [ ¡ M1 ] -> [ + | ] [ ² || ] [ ¡ M1 SIGN NUM ]
( ... )
( Otherwise, place it in the player's hand )
RIGHT [ + | SIGN NUM ] [ ? ] -> [ + | ] [ ? SIGN NUM ]
( Move up the numbers in input queue )
UP [ BELT SIGN NUM | BELT_MID NO NUM ] -> [ BELT | BELT_MID SIGN NUM ]
( Move numbers in output queue down when necessary )
[ ¥ SIGN N0 ] -> [ ¥ SIGN O0 ]
[ ¥ SIGN N1 ] -> [ ¥ SIGN O1 ]
[ ¥ SIGN N2 ] -> [ ¥ SIGN O2 ]
[ ¥ SIGN N3 ] -> [ ¥ SIGN O3 ]
[ ¥ SIGN N4 ] -> [ ¥ SIGN O4 ]
[ ¥ SIGN N5 ] -> [ ¥ SIGN O5 ]
[ ¥ SIGN N6 ] -> [ ¥ SIGN O6 ]
[ ¥ SIGN N7 ] -> [ ¥ SIGN O7 ]
[ ¥ SIGN N8 ] -> [ ¥ SIGN O8 ]
[ ¥ SIGN N9 ] -> [ ¥ SIGN O9 ]
DOWN [ ¥ SIGN O ] -> [ ¥ DOWN SIGN DOWN O ]
DOWN [ DOWN SIGN DOWN O | SIGN O ] -> [ DOWN SIGN DOWN O | DOWN SIGN DOWN O ]
( Increment/decrement the current number of code lines )
[ INC | M9 ] -> [ | MX ]
[ INC | M8 ] -> [ | M9 ]
[ INC | M7 ] -> [ | M8 ]
[ INC | M6 ] -> [ | M7 ]
[ INC | M5 ] -> [ | M6 ]
[ INC | M4 ] -> [ | M5 ]
[ INC | M3 ] -> [ | M4 ]
[ INC | M2 ] -> [ | M3 ]
[ INC | M1 ] -> [ | M2 ]
[ INC | M0 ] -> [ | M1 ]
[ DEC | M1 ] -> [ | M0 ]
[ DEC | M2 ] -> [ | M1 ]
[ DEC | M3 ] -> [ | M2 ]
[ DEC | M4 ] -> [ | M3 ]
[ DEC | M5 ] -> [ | M4 ]
[ DEC | M6 ] -> [ | M5 ]
[ DEC | M7 ] -> [ | M6 ]
[ DEC | M8 ] -> [ | M7 ]
[ DEC | M9 ] -> [ | M8 ]
[ DEC | MX ] -> [ | M9 ]
( Check for win conditions )
( DOWN [ N0 | ¥ | O2 | O8 | O7 | O6 | O2 | O6 ] -> [ FINISHED | | | | | | | ] )
==============
WINCONDITIONS
==============
SOME FINISHED
=======
LEVELS
=======
¶...........*×××××;0....
.............×××××;1....
.............×××××;2.+..
.....?.......×××××;3.ß..
.........0...×××××;4....
.,.......¥...×××××;5.-..
=2-..........×××××;6.ä..
.6.01234.....×××××;7....
.2-\\\\\.....×××××;8....
.2...........×××××;9....
.2.56789...._...........
.2-\\\\\...ü.çøøøø......
...........ú¿øøøøø......
...........íåøøóøø......
.$.......,..............
}0..²...................
( @"......#A....;0.+....... )
( %?.......D..00;1......... )
( .........A....;2......... )
( .........B....;3.-....... )
( ...01234.C..00;4......... )
( .,.\\\\\.B....;5......... )
( =........I..00;6.²0...... )
( ...56789......;7......... )
( ...\\\\\......;8......... )
( ..............;9......... )
( ........_................ )
( ......................... )
( .$.......¤............... )
( %267628.................. )
( ......................... )
( {......................}0 )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment