From 9e2f44166cee7db28b9f7f8e3f9d579106ec1526 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sat, 15 May 2021 20:52:06 -0400 Subject: [PATCH] Speed up hot reload --- 8Bitsy.dsk | Bin 143360 -> 143360 bytes asm/asm.fnl | 14 ++++--- game/game.json | 2 +- link/mame.fnl | 56 +++++++++++++++++++++------- vendor/jeejah/jeejah/fenneleval.lua | 5 ++- 5 files changed, 56 insertions(+), 21 deletions(-) diff --git a/8Bitsy.dsk b/8Bitsy.dsk index de496c6f030d51f810d4e2f2d9f9bed44d275538..75ecea20f176e25735e72a9ce4e80bd42ebb05b4 100644 GIT binary patch delta 1689 zcmZXUeM}Q~7{~8yDLryWTTsBw&Ff?i7=un4H#UbBX?Y#UiDAx8Ifr;w2m(fMO5svm_ZtTa>6&gPeM4!rmT5BP z6l$4fW4?IbZ7dS+dyG|ua|*)-qo~-6ijPsT4;A}SQB1QLw2zkQwG1f}3#gw^QViIh zYKkeQ#oQ11-AykLbtU>5{Y$m1j;*cKmFwBMlB)H^B{_t6>2$iadvNtA2l1h(@H!ll&7u`P0J$s6N9eJXTs>R#ujo*jGjcGBj~L5_MS8lcerc-ec<@9qTzS zu$p)_I6V|*vkzo+UJ3v4IUyAvlz$&v^r`6Q7xo@KkZ~paXRop&vr9P~mavo4EIpI$ z9M)uo&IXo;1_FxEp{a$Tt|@7V5C80CN7>BysYz9T>7fkhc3H>jmo zgwbmXc4S--u11p7!Hdz*#AROWnxV9)s6wB^ma^+=s@~=jTeFf~u*3hjV26|4u=}sL zx$@TLCO7zN+~9u?{XTc>#C(FR6WIx5y~wo8?Cb;a^sDs6bOk~8F6wafdODmH1Qplr zf|E*7Kcb~2Ic^xsBz$0Y z)`sj0WXF+BL1H$D{u&i0P!U4KeQQ;om^(;3HkBT%52X)K`Ws58QTk|pvV%5m|IXG` zR_L@`I)gSbZm}K4aa0(sGEV1!@%$$>>8VfZ;OdWpWa>Pm$>AAe7rTu7>)6sC3e8kf9>-n9`~Ez|t3eFvXY*7au4(TZMav z3D+riL^N?WH7M6m0`?EVRa%20Wy`peMO~&7bxfj8D&Q2cboZQzF}rQg={cY8`Tf4< z+?=1IPvYp4G)Lkn?vdaZMdHPX9GR8i>5`mW7nh(WkqkAdjhYsvlWI^~HI;o@p{FRIE7I@OXxI)xy+h&JRJ7Cm1FzPGq>dcl*NxqsKgX}eA z@r59xvJkLjfz2)iZsrsMH;W)kflRu#mb_P3ASl#Ou@ovYph6E7xl+YEDJ>Oet4UO> zo<}13H)i$!nSDzMiLe9n8)#-@_opT6K+>5yko036F!YIT!fYyJX^>?>maSv$`wyH| zDN)qU(H7e3_KXF@ytI>Rtn<|+VnM94tS(U%Q1OxhcalE4s zN2kS!R7O^}>nmqe7F5}*eR^&Zb3wn7@#>XjG7&dLfpl<(m?50o$qeHw>X{K-kvzsB ziXHp7C5qi!-CZ=hp9F0aG1(xB!2fnzf;wgq&(iEud?$mTvO{#YJJ`OE2^CF zV+@8fSvW)E)L+y?YJhslBq_N{Cgf}U(AT!e_nC0u%{(qlmel$Os$@^PY2b5%KQS1@ zyJaKvCHgwuOW$gAV8M9R^fm{UXb&U@MOFMrP+FxTsvVf{5<6cc2<^3339bl)E~8JQ z7+SMETDZnfYj(;OSTB&VwtsR$%bVQ{V?uL{NUWB(pH9UZ^FGo4uo!RM$NA1JBEuvQMc@+OMa>JqJUD(NMx+H1B3t% z8tcVC3?$Zjtj~Z>QOA0PSsbyG5s(WC1nKDEf4d&I*7d9NGSB~Xwb9wq*6Pu;xiq5F zP*k%kRc-1leZD(uKNE0@)VG_Csce?47zmprCgBuZFEyKX;vCnF3gV4?78)OPCS!n^D^C zK%@z{=rOUxp3LMTa1^p4a1?PxV18QBguCgG&44TgvWy~7Dp(mNswq!cZUjq@8Nt#v zBUpOF2$tT@uO$s8P#FJ!in~w|hKe}Tgre94PLln;{C)ORdA#uZ)NTUtHk&}a3TW{Z zRD(!AK;{LEmV$|F0}$sJfVkKIlJ7B0_%4TRFJvbmI|Eq|7&C&^XQ842DgsdP$gny^ z@D3!!#;9!2(@^>tN}oXK7?i$#8|*tHTfMg|-2jeO5)p#^WYIJe7>fuV_A=43A~1ei VuA{~8zBJF$eV5UL_A_?0","value":65535},"action":"set-flag"}]},{"func":"","x":10,"y":7,"steps":[{"action":"say","character":"old man","lines":["","I am but a weary old man,","living alone in these woods.",""]},{"lines":["","Cool story. Any words of wisdom","for me?",""],"action":"say","character":"player"},{"lines":["","Not really.","",""],"action":"say","character":"old man"},{"action":"say","character":"glasses","lines":["Holy cow!!","","This \"old man\" is actually","an alien!!"],"condition":"has glasses"}]},{"func":"","x":20,"y":7,"steps":[{"position":1537,"character":"player","action":"warp","lines":["","","",""],"map":"map3"}]},{"func":"","x":10,"y":1,"steps":[{"position":2057,"character":"player","lines":["","","",""],"action":"warp","map":"map4"}]},{"func":"","x":16,"y":10,"steps":[{"character":"charismatic frog","lines":["","Would you be my friend?","",""],"action":"say"},{"character":"player","lines":["","OF COURSE!","",""],"action":"say"}]}]},{"loadword":"","objects":[{"func":"","x":1,"y":7,"steps":[{"position":1554,"character":"player","action":"warp","lines":["","","",""],"map":"map2"}]},{"func":"","x":9,"y":5,"steps":[{"lines":["","This wood would be perfect to","build a bridge with!",""],"action":"say","character":"player"},{"lines":["","Haha, \"wood would\". Wood would","wood would.",""],"action":"say","character":"player"},{"condition":"has scissors","character":"player","lines":["","Hey, I bet I could cut down this","tree with my cool time scissors!",""],"action":"say"},{"condition":"has scissors","character":"player","lines":["","","",""],"action":"disappear"},{"condition":"has scissors","character":"player","lines":["","Haha, awesome.","",""],"action":"say"},{"condition":"has scissors","flag":"has wood","action":"set-flag","lines":["","","",""],"rhs":{"label":"","value":65535},"character":"player"}]},{"func":"","x":15,"y":6,"steps":[{"lines":["","If only there was some convenient","way to cross this ankle-deep","stream!"],"action":"say","character":"player"},{"action":"say","character":"player","lines":["","Guess I'll just have to build a","raft and sail it across.",""],"condition":"has wood"},{"action":"disappear","character":"player","lines":["","","",""],"condition":"has wood"}]},{"func":"","x":6,"y":10,"steps":[{"action":"say","character":"snake","lines":["","Badger badger badger badger","badger badger badger badger","badger badger badger badger"]},{"action":"say","character":"player","lines":["","A snake! A snake!","",""]}]},{"func":"","x":17,"y":6,"steps":[{"character":"charismatic frog","lines":["","Ribbit.","",""],"action":"say"},{"character":"player","lines":["","I thought you'd be more","charismatic.",""],"action":"say"}]}],"tickword":"","moveword":"","map":"A1A1A1A1A1818181818181E1E181818181818181A1A1A1A18181818181818181E181818181818181A1A181818142810000008181E1E1818181000000A1000081818100000000818181E1E18181000000A100000000000000000000818181E181818100000000000000000000000000008181E18181810000A181810000000000000000000000E10062000000A181818181000000A10000818181E18181000000A1818181810000000000008181E1E18181000000A1A181818100000000818181E1E1818181818181A1A1A1818181000081818181E181818181818181A1A1A1A18181818181818181E181818181818181"},{"loadword":"","objects":[{"func":"","x":10,"y":6,"steps":[{"character":"stick bob","lines":["","Would you like to hear a jig","and a reel?",""],"action":"say"},{"character":"player","lines":["","Do you play the theremin?","",""],"action":"say"},{"character":"stick bob","lines":["","I can play anything!","",""],"action":"say"}]},{"func":"","x":10,"y":10,"steps":[{"position":265,"character":"player","lines":["","","",""],"action":"warp","map":"map2"}]},{"func":"","x":13,"y":4,"steps":[{"character":"player","lines":["","It's a fiddle. I promise.","I worked hard to draw it.",""],"action":"say"}]},{"func":"","x":7,"y":4,"steps":[{"character":"player","lines":["","Scissors with a clock on them?","They're super sharp!",""],"action":"say"},{"character":"player","lines":["","I'm sure they'll come in handy!","",""],"action":"say"},{"flag":"has scissors","action":"set-flag","lines":["","","",""],"rhs":{"label":"","value":65535},"character":"player"},{"character":"player","lines":["","","",""],"action":"disappear"}]}],"tickword":"","moveword":"","map":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000600000000000000000000000606060606060600060606060606060000000000060C00000000000000000000000C060000000000060000000000000000000000000006000000000006000000000000002000000000000600000000000600000000000000000000000000060000000000060C00000210000000000220000C060000000000060606060606060606060606060606000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}],"flags":["has wood","has scissors","","has glasses"],"portraits":[{"gfx":"000000000000000000000000000000000000007C7C7E7E7E7E7E7E7E7E7E7E7E00000000707F7F7F7F7F7F7F7F7F7F7F7E7E7E7E7F7F7F7F7F7F7F7F7F7F7F7F0000000F0F1F1F1F1F1F1F1F1F1F1F1F000000000000000000000000000000001F1F1F1F7F7F7F7F7F7F7F7F7F7F7F7F00000000077F7F7F7F7F7F7F7F7F7F7F","label":"player","flags":[]},{"gfx":"00000000004040606060707070707070000000000000010103037F7F7F7F7F7F707060604000000000000000000000007F7F7F7F7F7F7800004040406060606000000000001018383C3C7F7F7F7F7F7F000000000000000000000000000000007F7F7F3F0F67717C7F7F7F7F7F7F7F7F00007C7E7F7F7F7F7F7F7F7F7F7F7F7F","label":"cat","flags":[]},{"gfx":"80808080808080808080D5818181858480808080808080808080AA80808080808484848484A4848484A48484848494D0809090D0D4F5D5D5D5D5D480808080AA80808080808080808080D5808080808080808080808080808080AAA0A0A0A888808080808AA8AAAAAA828080808080D588888888888889898888888888888A82","label":"angryfish","flags":[]},{"flags":[],"label":"old man","gfx":"0000000000000000000000000000000000000000000000707C7872737373736300000000303F3F3F7F7F7F7F7F7F7F7F0F7F7F7F7E7E7E7E7C7C79797979797300000000000000073F3F7F7F7F7F7F60000000000000000000000000000000000E7F3F3F3F3F7F7F7F7F7F7F7F3F1F1F00000000000000000004040C0C1C1E1F"},{"flags":[],"label":"stick bob","gfx":"808080808080808080A0A8E8E8F0F0F08080808080C0D4D5FDFFFFF3F1F1FFFFF0F0E0E0C08080808080808080808080FFFFF983FFBFBEFCF4D4D4D4D4D4D4D480808080808AAAABAFBFFFE7C7C7FFFF80808080808080808185858583838383FFFFCFE0FFFEBE8F8B8A8A8A8A8A8A8A83838383818080808080808080808080"},{"flags":[],"label":"snake","gfx":"000000000000808080808AA88A8080000000000000000014557155455054545000000020202020202020000000000000505455150505050505155554545040000000000000000000000202020202020200000000000000000000000000000000002020202000000000000002022A2A2A00000001010505051514141414150505"},{"flags":[],"label":"glasses","gfx":"000000000000000000000000000000000000007C7C7E7E7E7E555555757E7E7E00000000707F7F7F7F7F7F7F7F7F7F7F7E7E7E7E7F7F7F7F7F7F7F7F7F7F7F7F0000000F0F1F1F1F9FAAAAAAAB1F1F1F000000000000000000000000000000001F1F1F1F7F7F7F7F7F7F7F7F7F7F7F7F00000000077F7F7F7F7F7F7F7F7F7F7F"},{"flags":[],"label":"charismatic frog","gfx":"00000000000020202020202020202000000000005455555F47475555050055550000000000000000002820282028000054040404040404040405050505010000000000002A2A2A7A62622A2A2A002A2A000000000001050505050505050405012A20202020202020202020202000000000000000000000000015051505150000"}],"font":[{"flags":[],"gfx":"0000000000000000"},{"flags":[],"gfx":"081C1C1C08000800"},{"flags":[],"gfx":"3636241200000000"},{"flags":[],"gfx":"123F1212123F1200"},{"flags":[],"gfx":"083C0A1C281E0800"},{"flags":[],"gfx":"0026160834320000"},{"flags":[],"gfx":"0E1B1B062F1B3600"},{"flags":[],"gfx":"0C0C080400000000"},{"flags":[],"gfx":"180C0606060C1800"},{"flags":[],"gfx":"0C18303030180C00"},{"flags":[],"gfx":"082A1C081C2A0800"},{"flags":[],"gfx":"000C0C3F3F0C0C00"},{"flags":[],"gfx":"000000000C0C0804"},{"flags":[],"gfx":"0000001E1E000000"},{"flags":[],"gfx":"00000000000C0C00"},{"flags":[],"gfx":"002030180C060200"},{"flags":[],"gfx":"1C26263E26261C00"},{"flags":[],"gfx":"181C181818183C00"},{"flags":[],"gfx":"1C2620180C063E00"},{"flags":[],"gfx":"1C26201820261C00"},{"flags":[],"gfx":"2626263C30303000"},{"flags":[],"gfx":"3E061E2020201E00"},{"flags":[],"gfx":"1C26061E26261C00"},{"flags":[],"gfx":"3E2630180C0C0C00"},{"flags":[],"gfx":"1C26261C26261C00"},{"flags":[],"gfx":"1C26263C20201C00"},{"flags":[],"gfx":"000C0C000C0C0000"},{"flags":[],"gfx":"000C0C000C0C0804"},{"flags":[],"gfx":"30180C060C183000"},{"flags":[],"gfx":"00003E003E000000"},{"flags":[],"gfx":"060C1830180C0600"},{"flags":[],"gfx":"1C3630180C000C00"},{"flags":[],"gfx":"1E33212D3D011E00"},{"flags":[],"gfx":"1C3E26263E262600"},{"flags":[],"gfx":"1E26261E26261E00"},{"flags":[],"gfx":"1C26060606261C00"},{"flags":[],"gfx":"1E26262626261E00"},{"flags":[],"gfx":"3E06061E06063E00"},{"flags":[],"gfx":"3E06061E06060600"},{"flags":[],"gfx":"1C26063626263C00"},{"flags":[],"gfx":"2626263E26262600"},{"flags":[],"gfx":"3C18181818183C00"},{"flags":[],"gfx":"3C30303036361C00"},{"flags":[],"gfx":"2626261E26262600"},{"flags":[],"gfx":"0606060606063E00"},{"flags":[],"gfx":"373F2B2B23232300"},{"flags":[],"gfx":"26262E3626262600"},{"flags":[],"gfx":"1C26262626261C00"},{"flags":[],"gfx":"1E26261E06060600"},{"flags":[],"gfx":"1C26262626363C00"},{"flags":[],"gfx":"1E26261E26262600"},{"flags":[],"gfx":"3C26061C20221E00"},{"flags":[],"gfx":"3F0C0C0C0C0C0C00"},{"flags":[],"gfx":"2626262626261C00"},{"flags":[],"gfx":"2626261C1C1C0800"},{"flags":[],"gfx":"2323232B2B2A3600"},{"flags":[],"gfx":"2626261C26262600"},{"flags":[],"gfx":"2626261C18181800"},{"flags":[],"gfx":"3E3E30180C063E00"},{"flags":[],"gfx":"1C0C0C0C0C0C1C00"},{"flags":[],"gfx":"0002060C18302000"},{"flags":[],"gfx":"1C18181818181C00"},{"flags":[],"gfx":"081C260000000000"},{"flags":[],"gfx":"0000000000003E00"},{"flags":[],"gfx":"0C0C100000000000"}]} \ No newline at end of file +{"tiles":[{"gfx":"8080808080808080808080808080808080808080808080808080808080808080","word":"","label":"","flags":{"walkable":true}},{"gfx":"8080C0C0C0C0E0F0F8FCE6E6E0B0B0B0808183838383878F9FBFE7E7868C8C8C","word":"","label":"player-frame1","flags":[]},{"gfx":"8080808084CCFCFCFCFCFCF8F0B0B0B080808080E1E1E1F1B99F9F8F8F8C8C8C","word":"","label":"","flags":[]},{"gfx":"D5D55555D5D55555D5D55555D5D555552A2AAAAA2A2AAAAA2A2AAAAA2A2AAAAA","word":"","label":"","flags":[]},{"gfx":"8080D4D0D0D0D4D45454D4D4D4D0808080808A8282828A8A8A0A0A8A8A828080","word":"pot","label":"","flags":[]},{"gfx":"8080808080D490948484A48494D080808080808080AA88A8A0A5A5A0A88A8080","word":"","label":"","flags":[]},{"gfx":"808080F8F89898989898989E9F9E80808080809F9F9898989898989E9F9E8080","word":"","label":"","flags":[]},{"gfx":"000000A0908884827E0A0A0A0000000000000000201008040785858500000000","word":"","label":"","flags":[]},{"gfx":"000014040414500000000000A888A8800000282020280A010101010195919580","word":"","label":"","flags":[]},{"gfx":"00008C92921C60105010781C0E070300000098A4A41C030504050F1C38706000","word":"","label":"","flags":[]},{"gfx":"000000004040000000D4D4ECECECD480000000000202010101AAAAB6B6B6AA80","word":"","label":"","flags":[]},{"gfx":"0000000000004828282828482800000000000000000004050505050405000000","word":"","label":"","flags":[]},{"flags":{"walkable":true},"word":"","label":"","gfx":"000000002020202020000A080808000000000000000000415111111111110100"},{"flags":[],"word":"","label":"","gfx":"00002028282A2A2A2820A0A0A0A0A08000000515155555151505858585858580"},{"flags":[],"word":"","label":"","gfx":"8080808080F8FCFC9C9CBCFEE6E6E68080808287878780818784848484848480"},{"flags":[],"word":"","label":"","gfx":"C0C0D0D0D4D4D4D5D5D080C0D0D4D4D08282828080828AAAAA8A8A8A82808282"},{"flags":{},"word":"","label":"stickbob","gfx":"E090B090A0C0A8D0D0A8C0E0B0988080838486848281958A8A958183868C8080"},{"flags":[],"word":"","label":"","gfx":"8080808080A0A8A8A0A0A0A8A8A8A08081818181818594948585859594948580"},{"flags":[],"word":"","label":"","gfx":"008AA88A000020282A0A0A0A2A28000000151115140505010000101014150500"},{"flags":[],"word":"","label":"","gfx":"000000002028381828282020202028000000000005151D191515040404041400"}],"levels":[{"loadword":"","map":"000000000000000000000000000000000000000000606060606060606060606060606060606060000060000000000000000000000000000000006000006000000000000000000000000000000000600000600000A00000000000000000004000000060600060000000000000000000000000000000000000006000000000000000000000000000000000606000600000000000000000000000000000000060000060000000000000000080808080800000006000006000000000000000000000000000000000600000606060606060606060606060606060606060000000000000000000000000000000000000000000","player":{"y":4,"x":5},"tickword":"","moveword":"","objects":[{"x":15,"func":"cat","linkentity":"","y":8,"linkword":"","name":"","steps":[{"action":"say","character":"cat","lines":["I'm a cat.","","",""]},{"lines":["","Nice kitty!","",""],"action":"say","character":"player"}]},{"x":5,"y":8,"linkentity":"","func":"fish","name":"","linkword":"","steps":[{"lines":["","","Grr! Go away!",""],"action":"say","character":"angryfish"}]},{"x":13,"y":4,"linkentity":"","func":"pot","linkword":"","name":"","steps":[{"character":"player","lines":["","Just another empty pot.","",""],"action":"say"}]},{"x":12,"y":4,"linkentity":"","func":"suspiciouspot","linkword":"","name":"","steps":[{"lines":["","","",""],"action":"disappear","character":"player"},{"lines":["","Whoops, I broke it!","",""],"action":"say","character":"player"}]},{"x":11,"y":4,"linkentity":"","func":"pot","name":"","linkword":"","steps":[{"character":"player","lines":["","It's a plain old empty pot.","",""],"action":"say"}]},{"x":14,"y":4,"linkentity":"","func":"pot","name":"","linkword":"","steps":[{"character":"player","lines":["","Nothing special about these pots.","",""],"action":"say"}]},{"x":15,"y":4,"linkentity":"","func":"pot","name":"","linkword":"","steps":[{"character":"player","lines":["","This one has a million dollars","inside!!",""],"action":"say"},{"character":"player","lines":["","Oh, no, wait. That was just","a dust bunny.",""],"action":"say"},{"character":"player","lines":["","There's really nothing special","about this pot.",""],"action":"say"},{"character":"player","lines":["","Probably.","",""],"action":"say"},{"action":"say","character":"snake","lines":["","There's a snake though.","",""],"condition":"has glasses"},{"action":"say","character":"glasses","lines":["","aaack!","",""],"condition":"has glasses"}]},{"func":"","x":20,"y":7,"steps":[{"position":1537,"character":"player","lines":["","","",""],"action":"warp","map":"map2"}]}]},{"loadword":"","objects":[{"func":"","x":1,"y":7,"steps":[{"position":1554,"character":"player","lines":["","","",""],"action":"warp","map":"map1"}]},{"func":"","x":18,"y":2,"steps":[{"lines":["","Neat, it's a pair of 3D glasses!","I wonder what I can see with","these..."],"action":"say","character":"player"},{"lines":["","","",""],"action":"disappear","character":"player"},{"flag":"has glasses","action":"set-flag","lines":["","","",""],"rhs":{"label":"","value":65535},"character":"player"}]},{"func":"","x":10,"y":7,"steps":[{"character":"old man","lines":["","I am but a weary old man,","living alone in these woods.",""],"action":"say"},{"action":"say","character":"player","lines":["","Cool story. Any words of wisdom","for me?",""]},{"action":"say","character":"old man","lines":["","Not really.","",""]},{"condition":"has glasses","character":"glasses","lines":["Holy cow!!","","This \"old man\" is actually","an alien!!"],"action":"say"}]},{"func":"","x":20,"y":7,"steps":[{"position":1537,"character":"player","lines":["","","",""],"action":"warp","map":"map3"}]},{"func":"","x":10,"y":1,"steps":[{"position":2057,"character":"player","action":"warp","lines":["","","",""],"map":"map4"}]},{"func":"","x":16,"y":10,"steps":[{"lines":["","Would you be my friend?","",""],"action":"say","character":"charismatic frog"},{"lines":["","OF COURSE!","",""],"action":"say","character":"player"}]}],"tickword":"","moveword":"","map":"A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1000000A1A1A1A10000818181818181A1A1A10000000000A1A1A1000000818181628181A1A1A1000000000000A1A100000000818181818100A160600000000000000000000000000081000000A1000000000000000000C10000000000000000000060600000000000000000000000000000000000A1A1000081818100000000000000A1A100000000A1A10081818181810000000000A1A1A1A1000000A1A100818181818100000000A1A1A1A1A1A10000A1A10000008181000000000000A1A1A1A1A1E0A1A1A1A1A1A1A1A1A1A1A100A1A1A1A1A1A1A1A1A1A1"},{"loadword":"","map":"A1A1A1A1A1818181818181E1E181818181818181A1A1A1A18181818181818181E181818181818181A1A181818142810000008181E1E1818181000000A1000081818100000000818181E1E18181000000A100000000000000000000818181E181818100000000000000000000000000008181E18181810000A181810000000000000000000000E10062000000A181818181000000A10000818181E18181000000A1818181810000000000008181E1E18181000000A1A181818100000000818181E1E1818181818181A1A1A1818181000081818181E181818181818181A1A1A1A18181818181818181E181818181818181","tickword":"","moveword":"","objects":[{"func":"","x":1,"y":7,"steps":[{"position":1554,"character":"player","lines":["","","",""],"action":"warp","map":"map2"}]},{"func":"","x":9,"y":5,"steps":[{"action":"say","character":"player","lines":["","This wood would be perfect to","build a bridge with!",""]},{"action":"say","character":"player","lines":["","Haha, \"wood would\". Wood would","wood would.",""]},{"action":"say","character":"player","lines":["","Hey, I bet I could cut down this","tree with my cool time scissors!",""],"condition":"has scissors"},{"action":"disappear","character":"player","lines":["","","",""],"condition":"has scissors"},{"action":"say","character":"player","lines":["","Haha, awesome.","",""],"condition":"has scissors"},{"condition":"has scissors","flag":"has wood","character":"player","lines":["","","",""],"rhs":{"label":"","value":65535},"action":"set-flag"}]},{"func":"","x":15,"y":6,"steps":[{"action":"say","character":"player","lines":["","If only there was some convenient","way to cross this ankle-deep","stream!"]},{"condition":"has wood","character":"player","lines":["","Guess I'll just have to build a","raft and sail it across.",""],"action":"say"},{"condition":"has wood","character":"player","lines":["","","",""],"action":"disappear"}]},{"func":"","x":6,"y":10,"steps":[{"character":"snake","lines":["","Badger badger badger badger","badger badger badger badger","badger badger badger badger"],"action":"say"},{"character":"player","lines":["","A snake! A snake!","",""],"action":"say"}]},{"func":"","x":17,"y":6,"steps":[{"lines":["","Ribbit.","",""],"action":"say","character":"charismatic frog"},{"lines":["","I thought you'd be more","charismatic.",""],"action":"say","character":"player"}]}]},{"loadword":"","map":"000000000000000000000000000000000000000000000000000000000000000000000000000000000000A1A1A1A1A1A1600060A1A1A1A1A1A10000000000606060606060600060606060606060000000000060C00000000000000000000000C060000000000060000000000000000000000000006000000000006000000000000002000000000000600000000000600000000000000000000000000060000000000060C00000210000000000220000C060000000000060606060606060606060606060606000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","tickword":"","moveword":"","objects":[{"func":"","x":10,"y":6,"steps":[{"lines":["","Would you like to hear a jig","and a reel?",""],"action":"say","character":"stick bob"},{"lines":["","Do you play the theremin?","",""],"action":"say","character":"player"},{"lines":["","I can play anything!","",""],"action":"say","character":"stick bob"}]},{"func":"","x":10,"y":10,"steps":[{"position":265,"character":"player","action":"warp","lines":["","","",""],"map":"map2"}]},{"func":"","x":13,"y":4,"steps":[{"lines":["","It's a fiddle. I promise.","I worked hard to draw it.",""],"action":"say","character":"player"}]},{"func":"","x":7,"y":4,"steps":[{"lines":["","Scissors with a clock on them?","They're super sharp!",""],"action":"say","character":"player"},{"lines":["","I'm sure they'll come in handy!","",""],"action":"say","character":"player"},{"flag":"has scissors","character":"player","lines":["","","",""],"rhs":{"label":"","value":65535},"action":"set-flag"},{"lines":["","","",""],"action":"disappear","character":"player"}]}]}],"flags":["has wood","has scissors","","has glasses"],"portraits":[{"gfx":"000000000000000000000000000000000000007C7C7E7E7E7E7E7E7E7E7E7E7E00000000707F7F7F7F7F7F7F7F7F7F7F7E7E7E7E7F7F7F7F7F7F7F7F7F7F7F7F0000000F0F1F1F1F1F1F1F1F1F1F1F1F000000000000000000000000000000001F1F1F1F7F7F7F7F7F7F7F7F7F7F7F7F00000000077F7F7F7F7F7F7F7F7F7F7F","label":"player","flags":[]},{"gfx":"00000000004040606060707070707070000000000000010103037F7F7F7F7F7F707060604000000000000000000000007F7F7F7F7F7F7800004040406060606000000000001018383C3C7F7F7F7F7F7F000000000000000000000000000000007F7F7F3F0F67717C7F7F7F7F7F7F7F7F00007C7E7F7F7F7F7F7F7F7F7F7F7F7F","label":"cat","flags":[]},{"gfx":"80808080808080808080D5818181858480808080808080808080AA80808080808484848484A4848484A48484848494D0809090D0D4F5D5D5D5D5D480808080AA80808080808080808080D5808080808080808080808080808080AAA0A0A0A888808080808AA8AAAAAA828080808080D588888888888889898888888888888A82","label":"angryfish","flags":[]},{"flags":[],"label":"old man","gfx":"0000000000000000000000000000000000000000000000707C7872737373736300000000303F3F3F7F7F7F7F7F7F7F7F0F7F7F7F7E7E7E7E7C7C79797979797300000000000000073F3F7F7F7F7F7F60000000000000000000000000000000000E7F3F3F3F3F7F7F7F7F7F7F7F3F1F1F00000000000000000004040C0C1C1E1F"},{"flags":[],"label":"stick bob","gfx":"808080808080808080A0A8E8E8F0F0F08080808080C0D4D5FDFFFFF3F1F1FFFFF0F0E0E0C08080808080808080808080FFFFF983FFBFBEFCF4D4D4D4D4D4D4D480808080808AAAABAFBFFFE7C7C7FFFF80808080808080808185858583838383FFFFCFE0FFFEBE8F8B8A8A8A8A8A8A8A83838383818080808080808080808080"},{"flags":[],"label":"snake","gfx":"000000000000808080808AA88A8080000000000000000014557155455054545000000020202020202020000000000000505455150505050505155554545040000000000000000000000202020202020200000000000000000000000000000000002020202000000000000002022A2A2A00000001010505051514141414150505"},{"flags":[],"label":"glasses","gfx":"000000000000000000000000000000000000007C7C7E7E7E7E555555757E7E7E00000000707F7F7F7F7F7F7F7F7F7F7F7E7E7E7E7F7F7F7F7F7F7F7F7F7F7F7F0000000F0F1F1F1F9FAAAAAAAB1F1F1F000000000000000000000000000000001F1F1F1F7F7F7F7F7F7F7F7F7F7F7F7F00000000077F7F7F7F7F7F7F7F7F7F7F"},{"flags":[],"label":"charismatic frog","gfx":"00000000000020202020202020202000000000005455555F47475555050055550000000000000000002820282028000054040404040404040405050505010000000000002A2A2A7A62622A2A2A002A2A000000000001050505050505050405012A20202020202020202020202000000000000000000000000015051505150000"}],"font":[{"flags":[],"gfx":"0000000000000000"},{"flags":[],"gfx":"081C1C1C08000800"},{"flags":[],"gfx":"3636241200000000"},{"flags":[],"gfx":"123F1212123F1200"},{"flags":[],"gfx":"083C0A1C281E0800"},{"flags":[],"gfx":"0026160834320000"},{"flags":[],"gfx":"0E1B1B062F1B3600"},{"flags":[],"gfx":"0C0C080400000000"},{"flags":[],"gfx":"180C0606060C1800"},{"flags":[],"gfx":"0C18303030180C00"},{"flags":[],"gfx":"082A1C081C2A0800"},{"flags":[],"gfx":"000C0C3F3F0C0C00"},{"flags":[],"gfx":"000000000C0C0804"},{"flags":[],"gfx":"0000001E1E000000"},{"flags":[],"gfx":"00000000000C0C00"},{"flags":[],"gfx":"002030180C060200"},{"flags":[],"gfx":"1C26263E26261C00"},{"flags":[],"gfx":"181C181818183C00"},{"flags":[],"gfx":"1C2620180C063E00"},{"flags":[],"gfx":"1C26201820261C00"},{"flags":[],"gfx":"2626263C30303000"},{"flags":[],"gfx":"3E061E2020201E00"},{"flags":[],"gfx":"1C26061E26261C00"},{"flags":[],"gfx":"3E2630180C0C0C00"},{"flags":[],"gfx":"1C26261C26261C00"},{"flags":[],"gfx":"1C26263C20201C00"},{"flags":[],"gfx":"000C0C000C0C0000"},{"flags":[],"gfx":"000C0C000C0C0804"},{"flags":[],"gfx":"30180C060C183000"},{"flags":[],"gfx":"00003E003E000000"},{"flags":[],"gfx":"060C1830180C0600"},{"flags":[],"gfx":"1C3630180C000C00"},{"flags":[],"gfx":"1E33212D3D011E00"},{"flags":[],"gfx":"1C3E26263E262600"},{"flags":[],"gfx":"1E26261E26261E00"},{"flags":[],"gfx":"1C26060606261C00"},{"flags":[],"gfx":"1E26262626261E00"},{"flags":[],"gfx":"3E06061E06063E00"},{"flags":[],"gfx":"3E06061E06060600"},{"flags":[],"gfx":"1C26063626263C00"},{"flags":[],"gfx":"2626263E26262600"},{"flags":[],"gfx":"3C18181818183C00"},{"flags":[],"gfx":"3C30303036361C00"},{"flags":[],"gfx":"2626261E26262600"},{"flags":[],"gfx":"0606060606063E00"},{"flags":[],"gfx":"373F2B2B23232300"},{"flags":[],"gfx":"26262E3626262600"},{"flags":[],"gfx":"1C26262626261C00"},{"flags":[],"gfx":"1E26261E06060600"},{"flags":[],"gfx":"1C26262626363C00"},{"flags":[],"gfx":"1E26261E26262600"},{"flags":[],"gfx":"3C26061C20221E00"},{"flags":[],"gfx":"3F0C0C0C0C0C0C00"},{"flags":[],"gfx":"2626262626261C00"},{"flags":[],"gfx":"2626261C1C1C0800"},{"flags":[],"gfx":"2323232B2B2A3600"},{"flags":[],"gfx":"2626261C26262600"},{"flags":[],"gfx":"2626261C18181800"},{"flags":[],"gfx":"3E3E30180C063E00"},{"flags":[],"gfx":"1C0C0C0C0C0C1C00"},{"flags":[],"gfx":"0002060C18302000"},{"flags":[],"gfx":"1C18181818181C00"},{"flags":[],"gfx":"081C260000000000"},{"flags":[],"gfx":"0000000000003E00"},{"flags":[],"gfx":"0C0C100000000000"}]} \ No newline at end of file diff --git a/link/mame.fnl b/link/mame.fnl index 93a4adb..adb55c0 100644 --- a/link/mame.fnl +++ b/link/mame.fnl @@ -88,19 +88,36 @@ (when (nrepl:connected?) (nrepl:disconnect)) (set self.breakpoints {})) (fn Machine.read [self addr len] - (-> (self:coro-eval - (.. "(let [bencode (require :bencode) - addr " addr " - len " len " - mem (. manager.machine.devices ::maincpu :spaces :program)] - (var bytes \"\") - (print :reading len :from addr) - (for [i 1 len] - (set bytes (.. bytes (string.char (mem:read_u8 (+ addr i -1)))))) - bytes)")) - ; result is piped through fennelview; have to eval it to turn it back into bytes - ; would be nice if io.write worked - (fennel.eval))) + (var bytes nil) + (self:coro-eval + "(let [bencode (require :bencode) + {: addr : len} (bencode.decode (io.read)) + mem (. manager.machine.devices ::maincpu :spaces :program)] + (var bytes \"\") + (for [i 1 len] + (set bytes (.. bytes (string.char (mem:read_u8 (+ addr i -1)))))) + (io.write bytes))" + (lume.merge + (self:input-handler (bencode.encode {: addr : len})) + {:out #(set bytes $2)})) + bytes) +(fn Machine.read-batch [self addr-to-len] + (var addr-to-bytes nil) + (self:coro-eval + "(let [bencode (require :bencode) + addr-to-len (bencode.decode (io.read)) + mem (. manager.machine.devices ::maincpu :spaces :program) + addr-to-bytes {}] + (each [addr len (pairs addr-to-len)] + (var bytes \"\") + (for [i 1 len] + (set bytes (.. bytes (string.char (mem:read_u8 (+ addr i -1)))))) + (tset addr-to-bytes addr bytes)) + (io.write (bencode.encode addr-to-bytes)))" + (lume.merge + (self:input-handler (bencode.encode addr-to-len)) + {:out #(set addr-to-bytes (bencode.decode $2))})) + addr-to-bytes) (fn Machine.write [self addr bytes] (if (> (bytes:len) 0x1000) (do (self:write addr (bytes:sub 1 0x1000)) @@ -113,6 +130,15 @@ (for [i 1 (bytes:len)] (mem:write_u8 (+ addr i -1) (string.byte (bytes:sub i i)))))" (bencode.encode {: addr : bytes})))) +(fn Machine.write-batch [self addr-to-bytes] + (self:eval-input + "(let [bencode (require :bencode) + addr-to-bytes (bencode.decode (io.read)) + mem (. manager.machine.devices ::maincpu :spaces :program)] + (each [addr bytes (pairs addr-to-bytes)] + (for [i 1 (bytes:len)] + (mem:write_u8 (+ addr i -1) (string.byte (bytes:sub i i))))))" + (bencode.encode addr-to-bytes))) (fn Machine.launch [self prg] (self:eval "(manager.machine:soft_reset)") (self:eval (string.format "(emu.keypost \"CALL-151\\n %xG\\n\")" (prg:lookup-addr prg.start-symbol)))) @@ -121,7 +147,9 @@ (var result nil) (local append-to-result #(set result (.. (or result "") $2))) (self:eval code - (self:coro-handlers (coroutine.running) {:value append-to-result :out append-to-result} ?handlers)) + (self:coro-handlers (coroutine.running) + (lume.merge {:value append-to-result :out append-to-result} + (or ?handlers {})))) (coroutine.yield) (or result "")) (fn Machine.dbgcmd [self cmd ?handlers] diff --git a/vendor/jeejah/jeejah/fenneleval.lua b/vendor/jeejah/jeejah/fenneleval.lua index ffac3ce..f3968c6 100644 --- a/vendor/jeejah/jeejah/fenneleval.lua +++ b/vendor/jeejah/jeejah/fenneleval.lua @@ -36,7 +36,7 @@ local make_repl = function(session, repls) env.io = {} end env.print = print_for(session.write) - env.io.write = session.write + env.io.write = function(...) return session.io_write(...) end env.io.read = function() session.needinput() local input, done = coroutine.yield() @@ -63,6 +63,9 @@ return function(conn, msg, session, send, response_for) session.values = function(xs) send(conn, response_for(msg, {value=table.concat(xs, "\n") .. "\n"})) end + session.io_write = function(...) + send(conn, response_for(msg, {out=table.concat({...})})) + end session.done = function() send(conn, response_for(msg, {status={"done"}})) end