UNPKG

bas80

Version:

BAS80 - an 8bit BASIC compiler

18 lines (13 loc) 48.9 kB
(function(name, definition) { if (typeof module != 'undefined') module.exports = definition(); else if (typeof define == 'function' && typeof define.amd == 'object') define(definition); else this[name] = definition(); }('BAS', function() { "use strict"; var LIB={__heap:{uses:["erroom"],code:";heap management 1.1\n\tHP_INIT:\n\nlxi h,heap\n\nlxi b,ramtop-heap\n\nmvi e,0\nhp_iclr:\n\nmov m,e\n\ninx h\n\ndcx b\n\nmov a,b\n\nora c\n\njnz hp_iclr\n\tLXI H,((RAMTOP-HEAP)&0xfffe)-4 \n\tSHLD HEAP \n\tLXI H,HEAP \n\tCALL hp_n \n\tMVI A,0FFh \n\tMOV m,a \n\tINX h \n\tMOV m,a \n\tRET \nHP_F: LXI H,HEAP+1 \nHP_F2:\n\tMOV d,m \n\tDCX h \n\tMOV e,m \n\tMOV A,E \n\tANI 01h ;0=empty,1=full\n\tRET \nHP_N: \n\tMOV A,M \n\tANI 0FEh\n\tMOV E,A \n\tINX H \n\tMOV D,M \n\tDCX H \n\tDAD D \n\tINX H \n\tINX H \n\tINX H \n\tJMP HP_F2 \n\nHP_FE:\n\tCALL hp_f \nHP_FE2: \n\tRZ\n\tMOV a,d \n\tANA e \n\tINR a \n\tJZ ERROOM \nHP_FEN: \n\tCALL hp_n \n\tJMP hp_fe2 \nHP_FREE:\n\tMOV a,m \n\tANI 0feh \n\tMOV m,a \n\tRET \nHP_JOIN:\n\tCALL hp_fe \nHP_J0: \n\tPUSH h \n\tCALL hp_n \n\tJZ hp_j \n\tMOV a,e \n\tANA d \n\tINR a \n\tPOP d \n\tRZ \n\tCALL hp_fe2 \n\tJMP hp_j0 \nHP_J: \n\tPOP h \n\tMOV a,e \n\tADD m \n\tMOV e,a \n\tINX h \n\tMOV a,d \n\tADC m \n\tMOV d,a \n\tINX d \n\tINX d \n\tMOV m,d \n\tDCX h \n\tMOV m,e \n\tORI 1 ; Z=0\n\tRET \nHP_A:\n\tINX b \n\tMOV a,c \n\tRRC \n\tJNC hp_aeven \n\tINX b \nHP_AEVEN: \n\tCALL hp_fe \nHP_ALOP:\n\tMOV a,d \n\tCMP b \n\tJC hp_alow \n\t;JNZ hp_amore \n\tMOV a,e \n\tCMP c \n\tjz hp_aexact\n\t;porovnat, jestli zbývá alespoň n+6\n\tpush b\n\tinx b\n\tinx b\n\tinx b\n\tinx b\n\tinx b\n\tinx b\n\tmov a,d\n\tcmp b\n\tjc hp_alow6 \n\tjnz hp_amore6\n\tmov a,e\n\tcmp c\n\tjnc hp_amore6\nhp_alow6:\n\tpop b\nHP_ALOW:\n\tCALL hp_fen \n\tJMP hp_alop \nhp_amore6:\n\tpop b\nHP_AMORE: \n\tMOV a,e \n\tSUB c \n\tMOV e,a \n\tMOV a,d \n\tSBB b \n\tMOV d,a \n\tDCX d \n\tDCX d \n\tPUSH h \n\tDAD b\n\tINX h \n\tINX h \n\tMOV m,e \n\tINX h \n\tMOV m,d \n\tPOP h \nhp_aexact:\n\tINX b \n\tMOV m,c \n\tINX h \n\tMOV m,b \n\tINX h\n\tMVI m,0aah \n\tINX h\n\tRET \nhp_test:\n\tpush d\n\tlxi d,HEAP\n\tmov a,h\n\tcmp d\n\tjc hp_noheap\n\tjnz hp_noheap\n\tmov a,l\n\tcmp e\nhp_noheap: \n\tpop d\n\tret \nhp_unass: \n\tcall hp_test\n\trc\n\tdcx h\n\tMVI m,0aah \n\tINX h\n\tret \nhp_assign: \n\tcall hp_test\n\trc\n\tdcx h\n\tMVI m,055h \n\tINX h\n\tret \nhp_gc:\n\tCALL hp_f \nHP_gc1: \n\tJZ hp_gcn\nhp_gc2: \n\tMOV a,d \n\tANA e \n\tINR a \n\tJZ hp_gcf\n\tinx h\n\tinx h\n\tmov a,m\n\tdcx h\n\tdcx h\n\tcpi 0aah ;unassigned\n\tjnz hp_gcn\n\tpush h\n\tcall hp_free\n\tpop h\nHP_gcN: \n\tCALL hp_n \n\tJMP hp_gc2 \t\n\t\nHP_gcf: CALL hp_join \n\tJNZ hp_gcf\n\tret \nHP_DONE:\n"},printstr:{uses:["serout"],code:"\tMOV A,M\n\tORA A\n\tRZ\n\tCALL serout\n\tINX H\n\tJMP printstr\n"},printint:{uses:["serout","f_abs"],code:"\tMOV a,h \n\tORA a \n\tJP pipos \n\tMVI a,2Dh ;- \n\tCALL serout\n\tCALL f_abs \npipos:\tLXI D,-10000\n\tCALL prt10 \n\tLXI D,-1000\n\tCALL prt10 \n\tLXI D,-100\n\tCALL prt10 \n\tLXI D,-10\n\tCALL prt10 \n\tMOV A,L\n\tADI 30h\n\tJMP serout\nprt10:\n\tmvi c,0\nprt10l:\n\tdad d\n\tjnc prt10o\n\tinr c\n\tjmp prt10l\nprt10o:\n\tmov a,d\n\tcma\n\tmov d,a\n\tmov a,e\n\tcma\n\tmov e,a\n\tinx d\n\tdad d\n\tMOV A,C\n\tORA A\n\tRZ\n\tADI 30h\n\tJMP serout\n"},prtchan:{uses:null,sysdb:["prtchan"],code:"\tMOV A,L\n\tSTA sv_prtchan\n\tRET\n"},println:{uses:["serout"],code:"\tMVI A,0Dh\n\tCALL SEROUT\n\tMVI A,0Ah\n\tCALL SEROUT\n\tRET\n"},printtab:{uses:["serout"],code:"\tMVI A,20h\n\tCALL SEROUT\n\tMVI A,09h\n\tCALL SEROUT\n\tRET\n"},printcomma:{uses:["serout"],code:"\tMVI A,2ch ;comma\n\tCALL SEROUT\n\tRET\n"},printquot:{uses:["serout"],code:"\tMVI A,22h ;quot\n\tCALL SEROUT\n\tRET\n"},input:{uses:["serin"],code:" lxi h,i_buffer\n mvi c,0\ni_rd_l:\n call serin\n jz i_rd_l\n cpi 0dh\n jz i_eol\n cpi 0ah\n jz i_eol\n mov m,a\n inx h\n inr c\n jnz i_rd_l\ni_eol:\n mvi m,0\n ret \n"},inputint:{uses:["input","f_val"],code:" call input\n lxi h,i_buffer\n call f_val\n ret \n"},inputstr:{uses:["input","__heap","s_strcpy"],code:" call input\n inx b\n call hp_a\n lxi d,i_buffer\n jmp s_strcpy\n"},errovfl:{uses:["printstr"],code:'\tlxi h,errovfl_m\n\tcall printstr\n\tjmp errgo\nerrovfl_m:\n\tdb 0ah,0dh\n\t.cstr "### MULT OVFL",0dh,0ah\n'},erridx:{uses:["printstr"],code:'\tlxi h,erridx_m\n\tcall printstr\n\tjmp errgo\nerridx_m:\n\tdb 0ah,0dh\n\t.cstr "### INDEX OUT OF LIMITS",0dh,0ah\n'},errdiv:{uses:["printstr"],code:'\tlxi h,errdiv_m\n\tcall printstr\n\tjmp errgo\nerrdiv_m:\n\tdb 0ah,0dh\n\t.cstr "### DIVISION BY ZERO",0dh,0ah\n'},erroom:{uses:["printstr"],code:'\tlxi h,erroom_m\n\tcall printstr\n\tjmp errgo\nerroom_m:\n\tdb 0ah,0dh\n\t.cstr "### OUT OF MEMORY",0dh,0ah\n'},errstop:{uses:["printstr"],code:'\tlxi h,errstop_m\n\tcall printstr\n\tjmp errgo\nerrstop_m:\n\tdb 0ah,0dh\n\t.cstr "### STOP",0dh,0ah\n'},errnodata:{uses:["printstr"],code:'\tlxi h,errnodata_m\n\tcall printstr\n\tjmp errgo\nerrnodata_m:\n\tdb 0ah,0dh\n\t.cstr "### NO DATA",0dh,0ah\n'},mul16:{uses:null,code:" push h\n pop b\n lxi h,0\n mvi a,16\nmul16loop:\n dad h\n push psw\n mov a,e\n ral\n mov e,a\n mov a,d\n ral\n mov d,a\n jnc mul16no\n dad b\n jnc mul16no\n inx d\nmul16no:\n pop psw\n dcr a\n jnz mul16loop\n ret\n"},div16:{uses:null,code:" push d\n push h\n pop d\n pop b\n mvi a,16\n lxi h,0\n jmp div16_skip\ndiv16_loop:\n dad b\ndiv16_lop2: \n pop psw\n dcr a\n rz\ndiv16_skip:\n push psw\n xchg\n dad h\n xchg\n jnc div16_adc\n dad h\n inx h\n jmp div16_adskip\ndiv16_adc:\n dad h\ndiv16_adskip: \n ;sbc hl,bc\n mov a,l\n sub c\n mov l,a\n mov a,h\n sbb b\n mov h,a\n jc div16_loop\n inr e\n jmp div16_lop2 \n"},s_lut:{uses:null,code:"\txchg\n\tlxi b,datatable+2\nlut_l:\n\tldax b\n\tmov l,a\n\tinx b\n\tldax b\n\tmov h,a\n\tora l\n\tjz lut_prev\n\tmov a,h\n\tcmp d\n\tjc lut_prev\n\tmov a,l\n\tcmp e \n\tjnc lut_next\nlut_prev:\n\tdcx b\n\tdcx b\n\tldax b\n\tmov h,a\n\tdcx b\n\tldax b\n\tmov l,a\n\tora h\n\tret\nlut_next:\n\tinx b\n\tinx b\n\tinx b\n\tjmp lut_l\n"},s_read:{uses:null,code:"\tlhld datapoint\n\tmov e,m\n\tinx h\n\tmov d,m\n\tinx h\n\tshld datapoint\n\txchg\n\tret\n"},s_strcpy:{uses:null,code:" push h\ns_strcpy2:\n ldax d\n mov m,a\n ora a\n jz strcpe\n inx d\n inx h\n jmp s_strcpy2\nstrcpe:\n pop h\n ret \n"},s_div10:{uses:null,code:"\tmvi c,10\n\tmvi b,16\n\txra a\ns_d10_1:dad h\n\tral\n\tcmp c\n\tjc s_d10_2\n\tinr l\n\tsub c\ns_d10_2: dcr b\n\tjnz s_d10_1\n\tRET\n"},s_mul10:{uses:null,code:" push d\n dad h\n mov d,h\n mov e,l\n dad h\n dad h\n dad d\n pop d\n ret\n"},s_mul10add:{uses:null,code:" push d\n dad h\n mov d,h\n mov e,l\n dad h\n dad h\n dad d\n pop d\n dad d\n ret\n"},s_check:{uses:["erridx"],code:" mov a,h\n cmp b\n jc s_c_g\n mov a,l\n cmp c\n jnc erridx\ns_c_g:\n dad h\n dad d\n ret\n"},o_logic:{uses:null,code:"olofix: LXI B,8000h\n\tDAD B\n\tXCHG\n\tDAD B\n\tXCHG\n\tRET\ndofalse: LXI H,0\n\tRET\ndotrue: LXI H,1\n\tRET\n"},o_lt:{uses:["o_logic"],code:"\tCALL olofix\n\tMOV A,H\n\tCMP D\n\tJC dofalse\n\tJNZ dotrue\n\tMOV A,L\n\tCMP E\n\tJZ dofalse\n\tJC dofalse\n\tJMP dotrue\n"},o_ge:{uses:["o_logic"],code:"\tCALL olofix\n\tMOV A,H\n\tCMP D\n\tJC dotrue\n\tJNZ dofalse\n\tMOV A,L\n\tCMP E\n\tJZ dotrue\n\tJC dotrue\n\tJMP dofalse\n"},o_gt:{uses:["o_logic"],code:"\tCALL olofix\n\tMOV A,D\n\tCMP H\n\tJC dofalse\n\tJNZ dotrue\n\tMOV A,E\n\tCMP L\n\tJZ dofalse\n\tJC dofalse\n\tJMP dotrue\n"},o_le:{uses:["o_logic"],code:"\tCALL olofix\n\tMOV A,D\n\tCMP H\n\tJC dotrue\n\tJNZ dofalse\n\tMOV A,E\n\tCMP L\n\tJZ dotrue\n\tJC dotrue\n\tJMP dofalse\n"},o_eq:{uses:["o_logic"],code:"\tMOV A,L\n\tCMP E\n\tJNZ dofalse\n\tMOV A,H\n\tCMP D\n\tJNZ dofalse\n\tJMP dotrue\n"},o_neq:{uses:["o_logic"],code:"\tMOV A,L\n\tCMP E\n\tJNZ dotrue\n\tMOV A,H\n\tCMP D\n\tJNZ dotrue\n\tJMP dofalse\n"},o_streq:{uses:["o_logic"],code:"\tLDAX D\n\tCMP M\n\tJNZ dofalse\n\tORA A\n\tJZ dotrue\n\tINX D\n\tINX H\n\tJMP o_streq\n"},o_bitand:{uses:null,code:"\tMOV A,H\n\tANA D\n\tMOV H,A\n\tMOV A,L\n\tANA E\n\tMOV L,A\n\tRET\n"},o_bitor:{uses:null,code:"\tMOV A,H\n\tORA D\n\tMOV H,A\n\tMOV A,L\n\tORA E\n\tMOV L,A\n\tRET\n"},o_bitxor:{uses:null,code:"\tMOV A,H\n\tXRA D\n\tMOV H,A\n\tMOV A,L\n\tXRA E\n\tMOV L,A\n\tRET\n"},o_and:{uses:null,code:"\tMOV A,H\n\tORA L\n\tRZ\n\tXCHG\n\tRET\n"},o_or:{uses:null,code:"\tMOV A,H\n\tORA L\n\tRNZ\n\tXCHG\n\tRET\n"},o_add:{uses:null,inline:!0,code:"\tDAD D\t;o_add\n"},o_mul:{uses:["mul16","errovfl","f_abs"],code:"\tmov a,h\n\txra d\n\tani 80h\n\tjm o_mul_minus\n\tcall o_mulabs\n\tmov a,d\n\tora e\n\tjnz errovfl\n\tRET\no_mul_minus:\n\tcall o_mulabs\n\tmov a,d\n\tora e\n\tjnz errovfl\n\tmov a,h\n\tcma\n\tmov h,a\n\tmov a,l\n\tcma\n\tmov l,a\n\tinx h\n\tRET\no_mulabs:\n\tcall f_abs\n\txchg \n\tcall f_abs\n\tjmp mul16\n"},o_sub:{uses:null,inline:!0,code:"\tMOV A, E\n\tSUB L\n\tMOV L, A\n\tMOV A, D\n\tSBB H\n\tMOV H, A\n"},o_div:{uses:["div16","errdiv","f_abs"],code:"\tmov a,h\n\tora l\n\tjz errdiv\n\tmov a,h\n\txra d\n\tani 80h\n\tjm o_div_minus\n\tcall o_divabs\n\txchg\n\tRET\no_div_minus:\n\tcall o_divabs\n\txchg\n\tmov a,h\n\tcma\n\tmov h,a\n\tmov a,l\n\tcma\n\tmov l,a\n\tinx h\n\tRET\no_divabs:\n\tcall f_abs\n\txchg \n\tcall f_abs\n\tjmp div16\n"},o_mod:{uses:["div16","errdiv","f_abs"],code:"\tmov a,h\n\tora l\n\tjz errdiv\n\tmov a,h\n\txra d\n\tani 80h\n\tjm o_mod_minus\n\tcall o_modabs\n\tRET\no_mod_minus:\n\tcall o_modabs\n\tmov a,h\n\tcma\n\tmov h,a\n\tmov a,l\n\tcma\n\tmov l,a\n\tinx h\n\tRET\no_modabs:\n\tcall f_abs\n\txchg \n\tcall f_abs\n\tjmp div16\n"},o_concat:{uses:["__heap"],code:"\tpush h\n\tpush d\n\tlxi b,0\no_cc_cnt:\n\tmov a,m\n\tinx h\n\tora a\n\tjz o_cc_cnt1\n\tinx b\n\tjmp o_cc_cnt\no_cc_cnt1:\n\tldax d\n\tinx d\n\tora a\n\tjz o_cc_a\n\tinx b\n\tjmp o_cc_cnt1\no_cc_a:\n\tinx b\n\tcall hp_a\n\tpush h\n\tpop b\n\tpop d\no_cc_l1:\n\tldax d\n\tora a\n\tjz o_cc_l2\n\tmov m,a\n\tinx d\n\tinx h\n\tjmp o_cc_l1\no_cc_l2:\n\tpop d\no_cc_l3:\n\tldax d\n\tora a\n\tmov m,a\n\tjz o_cc_l4\n\tinx d\n\tinx h\n\tjmp o_cc_l3\no_cc_l4:\n\tpush b\n\tpop h\n\tRET\n"},mkslice:{uses:["__heap"],code:"\tMOV A,B\n\tORA C\n\tJZ mks_skip\n\tDCX B\n\tDCX D\n\tINX H\n\tJMP mkslice\nmks_skip:\n\tINX D\n\t;maximum\n\tpush h\n\t;lxi b,0\nmks_fix:\n\tmov a,m\n\tora a\n\tjz mks_m\n\tinx h\n\tinx b\n\tdcx d\n\tmov a,d\n\tora e\n\tjnz mks_fix\nmks_m:\n\tpop h\n\tPUSH B\n\tPUSH H\n\tCALL hp_a\n\tPOP D\n\tPOP B\n\tPUSH H\nmks_loop:\n\tMOV A,B\n\tORA C\n\tJZ mks_end0\n\tLDAX D\n\tMOV M,A\n\tORA A\n\tJZ mks_end\n\tDCX B\n\tINX D\n\tINX H\n\tJMP mks_loop\nmks_end0:\n\tMVI M,0\nmks_end:\n\tPOP H\n\tRET\n"},stslice:{uses:["__heap"],code:"\tMOV A,B\n\tORA C\n\tJZ sts_skip\n\tDCX B\n\tDCX D\n\tINX H\n\tJMP stslice\nsts_skip:\n\tINX D\n\tpush h\n\t;lxi b,0\nsts_fix:\n\tmov a,m\n\tora a\n\tjz sts_m\n\tinx h\n\tinx b\n\tdcx d\n\tmov a,d\n\tora e\n\tjnz sts_fix\nsts_m:\n\tpop h\n\tRET\n"},stcpy:{uses:["__heap"],code:"\tMOV A,M\n\tORA A\n\tJZ stcp_d\n\tLDAX D\n\tORA A\n\tJZ stcp_d\n\tMOV M,A\n\tINX H\n\tINX D\n\tDCX B\n\tMOV A,B\n\tORA C\n\tJNZ stcpy\nstcp_d: RET\n"},strclone:{uses:["__heap"],code:"\tLXI B,0\n\tPUSH H\nstrc_len: MOV A,M\n\tORA A\n\tJZ strc_g\n\tINX B\n\tINX H\n\tJMP strc_len\nstrc_g: MOV A,B\n\tORA C\n\tRZ\n\tCALL hp_a\n\tPOP D\n\tPUSH H\nstrc_c: LDAX D\n\tORA A\n\tJZ strc_f\n\tMOV M,A\n\tINX H\n\tINX D\n\tJMP strc_c\nstrc_f: POP H\n\tRET\n"},f_max:{uses:null,code:"\tRET\n"},f_abs:{uses:null,code:"\tMOV A,H\n\tORA A\n\tRP\n\tCMA\n\tMOV H,A\n\tMOV A,L\n\tCMA\n\tMOV L,A\n\tINX H\n\tRET\n"},f_neg:{uses:null,code:"\tMOV A,H\n\tCMA\n\tMOV H,A\n\tMOV A,L\n\tCMA\n\tMOV L,A\n\tINX H\n\tRET\n"},f_sgn:{uses:null,code:"\tMOV A,H\n\tRLCA\n\tJC f_sgn_m\n\tLXI H,1\n\tRET\nf_sgn_m: LXI H,0FFFFh\n\tRET\n"},f_rnd:{uses:null,code:"\tLHLD sv_seed1\n\tMOV b,h\n\tMOV c,l\n\tdad h\n\tdad h\n\tinr l\n\tdad b\n\tshld sv_seed1\n\tlhld sv_seed2\n\tdad h\n\tsbb a\n\tani 00101101b\n\txra l\n\tmov l,a\n\tshld sv_seed2\n\tdad b\n\tRET\n"},f_peek:{uses:null,code:"\tMOV A,M\n\tMVI H,0\n\tMOV L,A\n\tRET\n"},f_in:{uses:null,sysdq:["iofix"],code:"\tMOV A,L\n\tLXI H,00dbh\n\tSHLD sv_iofix\n\tMVI L,0c9h\n\tSHLD sv_iofix+2\n\tSTA sv_iofix+1\n\tCALL sv_iofix\n\tMOV L,A\n\tRET\n"},f_dpeek:{uses:null,code:"\tMOV A,M\n\tINX H\n\tMOV H,M\n\tMOV L,A\n\tRET\n"},f_len:{uses:[],code:"\tPUSH D\n\tLXI D,0\nf_ll:MOV A,M\n\tORA A\n\tJZ f_le\n\tINX D\n\tINX H\n\tJMP f_ll\nf_le:\tXCHG\n\tPOP D\n\tRET\n"},f_asc:{uses:[],code:"\tMOV L,M\n\tMVI H,0\n\tRET\n"},f_val:{uses:["s_mul10add","f_neg"],code:"\tpush d\n\nmvi c,0 ;sign\n\nlxi d,0\n\nmov a,m\n\ncpi 2Dh ;-\n\njnz f_v_c1\n\ninx h\n\nmvi c,1 ;sign\nf_v_c:\n\nmov a,m\nf_v_c1:\n\nora a\n\njz f_v_ret\n\ncpi 30h ;0\n\njc f_v_ret\n\ncpi 3ah\n\njnc f_v_ret\n\npush h\n\nxchg\n\nsui 30h\n\nmov e,a\n\nmvi d,0\n\ncall s_mul10add\n\nxchg\n\npop h\n\ninx h\n\njmp f_v_c\nf_v_ret:\n\nxchg\n\tpop d\n\nmov a,c\n\nora a\n\nrz\n\njmp f_neg\n"},f_low:{uses:null,inline:!0,code:"\tMVI H,0\n"},f_high:{uses:null,inline:!0,code:"\tMOV L,H\n\tMVI H,0\n"},f_chrS:{uses:["__heap"],code:"\tMOV A,L\n\tpush psw\n\tlxi b,2\n\tcall hp_a\n\tpop psw\n\tmov m,a\n\tinx h\n\tmvi m,0\n\tdcx h\n\tRET\n"}};var BASIC={I8080:{xp:{_dirty:function(n){return n.indexOf(!1)},_exprAsm:function(n,t,e,r,u,i){var a=t(e,r,u,i);return a.indexOf("[*DD*]")<0?a:a="\tPUSH D\n"+(a=a.replace(";[*DD*]\n",""))+"\tPOP D\n"},num:function(n,t){return"\tLXI H,"+n.value+"\n"},numL:function(n,t){return";[*DD*]\n\tLXI D,"+n.value+"\n"},str:function(n,t,e){return"\tLXI H,cs_"+e+"\t;"+n.value+"\n"},strL:function(n,t){return";[*DD*]\n\tLXI D,"+n.value+"\n"},var:function(n,t){return"\tLHLD v_"+n.value+"\n"},varL:function(n,t){return";[*DD*]\n\tXCHG\n\tLHLD v_"+n.value+"\n\tXCHG\n"},varIndirect:function(n,t){return"str"==n.varType?"\tLHLD H,vs_"+n.value+"\n":"\tLXI H,v_"+n.value+"\n"},varIndirectL:function(n,t){return"str"==n.varType?";[*DD*]\n\tXCHG\n\tLHLD vs_"+n.value+"\n\tXCHG\n":";[*DD*]\n\tLXI D,v_"+n.value+"\n"},varS:function(n,t){return"\tLHLD vs_"+n.value+"\n"},varSL:function(n,t){return";[*DD*]\n\tXCHG\n\tLHLD vs_"+n.value+"\n\tXCHG\n"},varA:function(n,t,e,r){e.addUse("s_check");var u=";[*DD*]\n"+r(n.index,t,"int");return u+="\tLXI D,vai_"+n.value+"\n",u+="\tLXI B,"+e.intarr[n.value]+"\n",u+="\tCALL s_check\n",u+="\tMOV E,M\n\tINX H\n\tMOV D,M\n\tXCHG\n"},varAIndirect:function(n,t,e,r){e.addUse("s_check");var u=";[*DD*]\n"+r(n.ex.index,t,"int");return u+="\tLXI D,vai_"+n.value+"\n",u+="\tLXI B,"+e.intarr[n.value]+"\n",u+="\tCALL s_check\n"},varAI:function(n,t){return n.index.value?"\tLHLD vai_"+n.value+"+"+2*n.index.value+"\n":"\tLHLD vai_"+n.value+"\n"},varAIIndirect:function(n,t){return n.ex.index.value?"\tLXI H,vai_"+n.value+"+"+2*n.ex.index.value+"\n":"\tLXI H,vai_"+n.value+"\n"},varAL:function(n,t,e,r){e.addUse("s_check");var u="\tPUSH H\n"+r(n.index,t,"int");return u+="\tLXI D,vai_"+n.value+"\n",u+="\tLXI B,"+e.intarr[n.value]+"\n",u+="\tCALL s_check\n",u+="\tMOV E,M\n\tINX H\n\tMOV D,M\n\tPOP H\n"},varAIndirectL:function(n,t,e,r){e.addUse("s_check");var u="\tPUSH H\n"+r(n.ex.index,t,"int");return u+="\tLXI D,vai_"+n.value+"\n",u+="\tLXI B,"+e.intarr[n.value]+"\n",u+="\tCALL s_check\n",u+="\tXCHG\n\tPOP H\n"},varAIL:function(n,t){return n.index.value?";[*DD*]\n\tXCHG\n\tLHLD vai_"+n.value+"+"+2*n.index.value+"\n\tXCHG\n":";[*DD*]\n\tXCHG\n\tLHLD vai_"+n.value+"\n\tXCHG\n"},varAIIndirectL:function(n,t){return n.ex.index.value?";[*DD*]\n\tLXI D,vai_"+n.value+"+"+2*n.ex.index.value+"\n":";[*DD*]\n\tLXI D,vai_"+n.value+"\n"},sliceS:function(n,t,e,r){e.addUse("mkslice");var u="\tPUSH D\n\tPUSH H\n";return u+=r(n.from,t,"int"),u+="\tMOV C,L\n\tMOV B,H\n",u+=r(n.to,t,"int",!0),u+="\tPOP H\n",u+="\tCALL mkslice\n",u+="\tPOP D\n"},sliceSL:function(n,t,e,r){e.addUse("mkslice");var u="\tPUSH H\n";return u+=r(n.from,t,"int"),u+="\tMOV C,L\n\tMOV B,H\n",u+=r(n.to,t,"int",!0),u+="\tPOP H\n",u+="\tCALL mkslice\n",u+="\tXCHG\n"},userfn:function(n,t,e,r,u){var i="\tPUSH D\n";return i+=r(n.operands[1],t,"int"),3==n.operands.length&&(i+=r(n.operands[2],t,"int",!0)),i+="\tCALL CMD"+u+"\n",i+="\tPOP D\n"},userfnL:function(n,t,e,r,u){var i="\tPUSH H\n";return i+=r(n.operands[1],t,"int"),3==n.operands.length&&(i+=r(n.operands[2],t,"int",!0)),i+="\tCALL CMD"+u+"\n",i+="\tPOP D\n\tXCHG\n"},fn:function(n,t,e,r,u){var i="";if(1==n.operands.length)i+=r(n.operands[0]);else if(2==n.operands.length)i+=r(n.operands[0],!0),i+=r(n.operands[1]);else for(var a=0;a<n.operands.length;a++)i+=r(n.operands[a])+"\tPUSH H\n";return e.addUse("f_"+n.value),u["f_"+n.value].inline?i+=u["f_"+n.value].code:i+="\tCALL f_"+n.value+"\n"},fnL:function(n,t,e,r,u){var i=";[*DD*]\n";if(1==n.operands.length)i+=r(n.operands[0]);else if(2==n.operands.length)i+=r(n.operands[0],!0),i+=r(n.operands[1]);else for(var a=0;a<n.operands.length;a++)i+=r(n.operands[a])+"\tPUSH H\n";return e.addUse("f_"+n.value),u["f_"+n.value].inline?(i+=u["f_"+n.value].code)+"\tXCHG\n":i+="\tCALL f_"+n.value+"\n\tXCHG\n"},shortcuts:function(n,t,e,r,u){return"num"==n.right.type&&1==n.right.value&&"+"==n.operator?u(n.left,t,e)+"\tINX H\n":"num"==n.left.type&&1==n.left.value&&"+"==n.operator?u(n.right,t,e)+"\tINX H\n":"num"==n.right.type&&1==n.right.value&&"-"==n.operator?u(n.left,t,e)+"\tDCX H\n":"num"==n.right.type&&2==n.right.value&&"*"==n.operator?u(n.left,t,e)+"\tDAD H\n":"num"==n.right.type&&4==n.right.value&&"*"==n.operator&&u(n.left,t,e)+"\tDAD H\n\tDAD H\n"},binary:function(n,t,e,r,u,i){var a="";a="num"==n.left.type&&"binary"==n.right.type?u(n.right,t,e)+u(n.left,t,e,!0):"num"==n.left.type&&"fn"==n.right.type?u(n.right,t,e)+u(n.left,t,e,!0):(a=u(n.left,t,e,!0)+this._exprAsm(this,u,n.right,t,e)).replace(";[*DD*]\n","");var v="o_"+opAsm(n.operator,t,e);return i[v]||croak("Not implemented operator "+v,t),i[v].inline?a+=i[v].code:(r.addUse(v),a+="\tCALL "+v+"\n")},binaryL:function(n,t,e,r,u,i){return this.binary(n,t,e,r,u,i)+"\tXCHG\n"}},asm:{jmp:function(n){return"\tJMP "+n+"\n"},jmpNZ:function(n){return"\tJNZ "+n+"\n"},jmpZ:function(n){return"\tJZ "+n+"\n"},jmpEx0:function(n){return"\tMOV A,H\n\tORA L\n\tJZ "+n+"\n"},docall:function(n){return"\tCALL "+n+"\n"},ret:function(){return"\tRET\n"},end:function(){return"\tRST 0\n"},dopush:function(){return"\tPUSH H\n"},dopop:function(){return"\tPOP H\n"},stackSwap:function(){return"\tXTHL\n"},swap:function(){return"\tXCHG\n"},varplus1:function(n){return"\tLHLD v_"+n+"\n\tINX H\n\tSHLD v_"+n+"\n"},varminus1:function(n){return"\tLHLD v_"+n+"\n\tDCX H\n\tSHLD v_"+n+"\n"},varplus2:function(n){return"\tLHLD v_"+n+"\n\tINX H\n\tINX H\n\tSHLD v_"+n+"\n"},varminus2:function(n){return"\tLHLD v_"+n+"\n\tDCX H\n\tDCX H\n\tSHLD v_"+n+"\n"},vartimes2:function(n){return"\tLHLD v_"+n+"\n\tDAD H\n\tSHLD v_"+n+"\n"},storeInt:function(n){return"\tSHLD v_"+n+"\n"},storeStr:function(n){return"\tSHLD vs_"+n+"\n\tCALL hp_assign\n\tcall hp_gc\n"},storeSlice:function(n,t,e,r,u){r.addUse("stslice"),r.addUse("strclone"),r.addUse("stcpy");var i="\tPUSH H\n";return i+="\tLHLD vs_"+n+"\n",i+="\tCALL strclone\n",i+="\tSHLD vs_"+n+"\n\tPUSH H\n\tCALL hp_assign\n\tcall hp_gc\n",i+="",i+=u(t.from,e,"int"),i+="\tMOV C,L\n\tMOV B,H\n",i+=u(t.to,e,"int",!0),i+="\tPOP H\n",i+="\tCALL stslice\n",i+="\tPOP D\n",i+="\tCALL stcpy\n"},storeStrNoGC:function(n){return"\tSHLD vs_"+n+"\n\tCALL hp_assign\n"},storeA:function(n,t,e,r,u){var i="";return r.addUse("s_check"),i+="\tPUSH H\n",i+=u(n.index,t,e),i+="\tLXI D,vai_"+n.value+"\n",i+="\tLXI B,"+r.intarr[n.value]+"\n",i+="\tCALL s_check\n",i+="\tPOP D\n",i+="\tMOV M,E\n",i+="\tINX H\n",i+="\tMOV M,D\n"},storeAI:function(n,t){return t?"\tSHLD vai_"+n+"+"+2*t+"\n":"\tSHLD vai_"+n+"\n"},storeAnyInt:function(n){return"\tSHLD "+n+"\n"},ioOut:function(n,t,e,r,u,i,a){var v="";return"num"==n.type?(v+=u(e,i,r),v+="\tMOV A,L\n",v+="\tOUT "+n.value+"\n"):(a.addVar("iofix","sysdq"),v+="\tLXI H,00d3h\n",v+="\tSHLD sv_iofix\n",v+="\tMVI L,c9h\n",v+="\tSHLD sv_iofix+2\n",v+=u(n,i,t),v+="\tMOV A,L\n",v+="\tSTA sv_iofix+1\n",v+=u(e,i,r),v+="\tMOV A,L\n",v+="\tCALL sv_iofix\n")},wait:function(n,t,e,r,u,i,a,v,o,L){var s="",H="s_wa"+a;return s+=H+":\n","num"==n.type?s+="\tIN "+n.value+"\n":(L.addVar("iofix","sysdq"),s+="\tLXI H,00dbh\n",s+="\tSHLD sv_iofix\n",s+="\tMVI L,c9h\n",s+="\tSHLD sv_iofix+2\n",s+=v(n,o,t),s+="\tSTA sv_iofix+1\n",s+="\tCALL sv_iofix\n"),"num"==u.type?0!==u.value&&(s+="\tXRI "+u.value+"\n"):(s+="\tPUSH PSW\n",s+=v(u,o,i),s+="\tPOP PSW\n",s+="\tXRA L\n"),"num"==e.type?s+="\tANI "+e.value+"\n":(s+="\tPUSH PSW\n",s+=v(e,o,r),s+="\tPOP PSW\n",s+="\tAND L\n"),s+="\tJZ "+H+"\n"},poke:function(n,t,e,r,u,i){var a="";return"num"!=e.type&&(a+=u(e,i,r),a+="\tpush h\n"),a+=u(n,i,t),"num"!=e.type?(a+="\tpop d\n",a+="\tmov m,e\n"):a+="\tmvi m,"+e.value%256+"\n",a},dpoke:function(n,t,e,r,u,i){var a="";return"num"==n.type?(a+=u(e,i,r),a+="\tSHLD "+n.value+"\n"):("num"!=e.type&&(a+=u(e,i,r),a+="\tpush h\n"),a+=u(n,i,t),"num"!=e.type?(a+="\tpop d\n",a+="\tmov m,e\n",a+="\tinx h\n",a+="\tmov m,d\n"):(a+="\tmvi m,"+e.value%256+"\n",a+="\tinx h\n",a+="\tmvi m,"+(e.value>>8)+"\n"),a)},_forstep:function(n){var t="",e=n[0][4];return"ex"==e?(t+="\tXCHG\n",t+="\tLHLD sv_forS"+n[0][2]+"\n",t+="\tDAD D\n"):1==e?t+="\tINX H\n":(t+="\tLXI D,"+e+"\n",t+="\tDAD D\n"),t},_fortest:function(n){var t="",e=n[0][5];return"ex"==e?(t+="\tXCHG\n",t+="\tLHLD sv_forL"+n[0][2]+"\n"):t+="\tLXI D,"+e+"\n",t+="\tMOV A,L\n",t+="\tCMP E\n",t+="\tJNZ FLCMD"+n[0][2]+"\n",t+="\tMOV A,H\n",t+="\tCMP D\n",t+="\tJNZ FLCMD"+n[0][2]+"\n"},ongoto:function(n){var t="";for(t+="\tinr l\n";n.length;)t+="\tdcr l\n",t+="\tjz CMD"+n[0]+"\n",n.shift();return t},ongosub:function(n,t){var e="";for(e+="\tlxi h,onsub_"+t+"\n",e+="\tpush h\n",e+="\tinr l\n";n.length;)e+="\tdcr l\n",e+="\tjz CMD"+n[0]+"\n",n.shift();return e+="\tpop h\n",e+="onsub_"+t+":\n"},strUnassign:function(n){return"\tLHLD vs_"+n+"\n\tCALL hp_unass\n"}}}};var CONFIG={OMENALPHA:{org:"8000h",ramtop:"0f800h",goback:"RST 0",system:{serout:{uses:null,sysdb:["prtchan"],code:"\tPUSH PSW\nso_wait: IN 0deh ;acias\n\tani 2\n\tjz so_wait\n\tpop psw ;aciad\n\tout 0dfh\n\tRET\n"},serin:{uses:["serout"],sysdb:["prtchan","inpchan"],code:"\tIN 0deh ;acias\n\tani 1\n\trz\n\tin 0dfh ;aciad\n\tcall serout\n\tora a\n\tRET\n"}},xp:{},asm:{}}};function InputStream(n){var t=0,r=1,u=0;return{next:function(){var e=n.charAt(t++);"\n"==e?(r++,u=0):u++;return e},peek:e,eof:function(){return""==e()},croak:function(e){throw new Error(e+" ("+r+":"+u+")")}};function e(){return n.charAt(t)}}function TokenStream(u){var n=null,t=" if then else endif rem print input goto let for to next step gosub return end stop data read restore repeat until continue break poke dpoke dim ramtop push pop take def call swap out on write wait while endwhile wend ",r=" abs neg rnd max chr$ sgn len val peek dpeek low high fn in asc ";return{next:function(){var e=n;return n=null,e||c()},peek:e,eof:function(){return null==e()},croak:u.croak};function o(e){return 0<=r.indexOf(" "+e.toLowerCase()+" ")}function a(e){return/[0-9]/i.test(e)}function l(e){return/[a-z_]/i.test(e)}function s(e){return l(e)||0<="?!0123456789".indexOf(e)}function p(e){return 0<="+-*/%=&|^<>!".indexOf(e)}function i(e){return 0<=" \t\n\r".indexOf(e)}function f(e){for(var n="";!u.eof()&&e(u.peek());)n+=u.next();return n}function k(){var e,n=f(s);return"$"==u.peek()?(u.next(),o(n+"$")?{type:"fn",value:n.toLowerCase()+"S"}:{type:"var$",value:n.toLowerCase()}):{type:(e=n,0<=t.indexOf(" "+e.toLowerCase()+" ")?"kw":o(n)?"fn":"var"),value:n.toLowerCase()}}function v(){return{type:"str",value:function(e){var n=!1,t="";for(u.next();!u.eof();){var r=u.next();if(n)t+=r,n=!1;else if("\\"==r)n=!0;else{if(r==e)break;t+=r}}return t}('"')}}function c(){if(f(i),u.eof())return null;var n,e,t=u.peek();if('"'==t)return v();if("$"==t)return function(){u.next();var e=f(function(e){return/[0-9a-fA-F]/i.test(e)});return{type:"num",value:parseInt(e,16)}}();if(a(t))return n=!1,e=f(function(e){return"."==e?!n&&(n=!0):a(e)}),{type:"num",value:parseFloat(e)};if(l(t)){var r=k();return"kw"==r.type&&"rem"==r.value?{type:"remark",value:f(function(e){return"\n"!=e})}:r}return 0<=":".indexOf(t)?{type:"colon",value:u.next()}:0<=",;#(){}[]".indexOf(t)?{type:"punc",value:u.next()}:p(t)?{type:"op",value:f(p)}:void u.croak("Can't handle character: "+t)}function e(){return n||(n=c())}}function parse(e){for(var n=e.split("\n"),t=[],r=!1,u=0;u<n.length;u++){for(var o=n[u],a={source:o,rawTokens:[],label:null,_numline:u,_cmd:1},l=TokenStream(InputStream(o));!l.eof();){var s=l.next();a.rawTokens.push(s)}if(a.rawTokens.length&&(a.tokens=[].concat(a.rawTokens),("num"!=a.tokens[0].type||(a.label=a.tokens.shift().value,a.tokens.length))&&(!("var"==a.tokens[0].type&&1<a.tokens.length&&"colon"==a.tokens[1].type&&":"==a.tokens[1].value)||(a.label=a.tokens.shift().value,a.tokens.shift(),a.tokens.length)))){for(var p=[];a.tokens.length;){"kw"==(s=a.tokens.shift()).type&&"end"==s.value&&(r=!0),"var"==s.type&&"and"==s.value&&(s.type="op"),"var"==s.type&&"or"==s.value&&(s.type="op"),"kw"!=s.type||"else"!=s.value||0!=p.length?"colon"==s.type||"kw"==s.type&&"then"==s.value||"kw"==s.type&&"else"==s.value?("var"==p[0].type&&p.unshift({type:"kw",value:"let"}),"var$"==p[0].type&&p.unshift({type:"kw",value:"let"}),"kw"==s.type&&"then"==s.value&&(p.push(s),a.tokens.length&&"num"==a.tokens[0].type&&p.push({type:"kw",value:"goto"})),"kw"==s.type&&"else"==s.value&&a.tokens.length&&"num"==a.tokens[0].type&&p.push({type:"kw",value:"goto"}),t.push({source:o,rawTokens:a.rawTokens,label:a.label,_numline:a._numline,_cmd:a._cmd,tokens:p,hasElse:"kw"==s.type&&"else"==s.value}),p=[],a.label=null,a._cmd++,"kw"==s.type&&"then"==s.value&&a.tokens.length&&"num"==a.tokens[0].type&&p.push({type:"kw",value:"goto"})):p.push(s):t[t.length-1].hasElse=!0}p.length&&("var"==p[0].type&&p.unshift({type:"kw",value:"let"}),"var$"==p[0].type&&p.unshift({type:"kw",value:"let"}),a.tokens=p,t.push(a))}}return r||t.push({source:"END",rawTokens:[{type:"kw",value:"end"}],label:a.label,_numline:a._numline,_cmd:a._cmd,tokens:[{type:"kw",value:"end"}]}),t}var PRECEDENCE={"=":1,"||":2,"&&":3,"<":7,">":7,"<=":7,">=":7,"==":7,"<>":7,"|":8,"^":8,"&":9,"+":10,"-":10,"*":20,"/":20,"%":20,or:10,and:20},ARITY={max:["int","int"],abs:["int"],neg:["int"],low:["int"],high:["int"],peek:["int"],in:["int"],fn:["int","int"],dpeek:["int"],sgn:["int"],rnd:[],len:["str"],asc:["str"],val:["str"],chrS:["int"]},exprType=function(e,t){var r=e.type;if("num"==r)return"int";if("str"==r)return"str";if("var"==r)return"int";if("var[]"==r)return"int";if("var$"==r)return"str";if("ptr"==r)return"int";if("slice$"==r)return"str";if("binary"==r){var n=exprType(e.left,t);if(n==exprType(e.right,t))return n;croak("Mismatched types in expression",t)}if("fn"==r){var a=e.value;return"S"==a[a.length-1]?"str":"int"}croak("Invalid expression type",t)},compute=function(e,t,r){switch(r){case"+":return e+t;case"-":return e-t;case"*":return e*t;case"/":return e/t}},expr=function(i,v,l){var s=function(e){var t=i.shift();t||croak(e+" is missing",v),"punc"!=t.type&&croak(e+" is missing, "+t.type+"instead",v),t.value!=e&&croak(e+" is missing, "+t.value+" instead",v)},p=function(){var e=i.shift();if("op"==e.type&&"-"==e.value)return(e=i.shift()).value=-1*e.value,e;if("punc"==e.type&&"["==e.value){"var"!=(n=expr(i,v,l)).type&&"var[]"!=n.type&&"var$"!=n.type&&"str"!=n.type&&croak("You cannot get pointer to this!",v);var t=exprType(n,v);return s("]"),{type:"ptr",value:n.value,varType:t,ex:n}}if("var"==e.type&&i.length&&"punc"==i[0].type&&"("==i[0].value){if(ENV.fns[e.value]==e.value){var r=[{type:"var",value:e.value}];s("(");var n=expr(i,v,l);return r.push(n),"punc"==i[0].type&&","==i[0].value&&(s(","),n=expr(i,v,l),r.push(n)),s(")"),{type:"fn",value:"fn",operands:r}}s("(");n=expr(i,v,l),t=exprType(n,v);return s(")"),{type:"var[]",value:e.value,index:n}}if("var$"==e.type&&i.length&&"punc"==i[0].type&&"("==i[0].value){if(s("("),"kw"==i[0].type&&"to"==i[0].value){i.shift();n={type:"num",value:0};if("punc"==i[0].type&&")"==i[0].value)var a={type:"num",value:32767};else a=expr(i,v,l)}else{n=expr(i,v,l);if(i.length&&"kw"==i[0].type&&"to"==i[0].value)if(i.shift(),"punc"==i[0].type&&")"==i[0].value)a={type:"num",value:32767};else a=expr(i,v,l)}return s(")"),{type:"slice$",value:e.value,from:n,to:a}}if("fn"==e.type){var u=ARITY[e.value].length;r=[];s("(");for(;0<u;){n=expr(i,v,l),t=exprType(n,v);if(ARITY[e.value][0]!=t&&croak("Argument type mismatch, given:"+t+", expected: "+ARITY[e.value][0],v),r.push(n),"fn"==e.value){if("punc"==i[0].type&&")"==i[0].value)break;"punc"==i[0].type&&","==i[0].value&&u++}--u&&s(",")}return s(")"),{type:"fn",value:e.value,operands:r}}if("punc"==e.type&&"("==e.value){var p=expr(i,v,l);return s(")"),p}return e},y=function(e,t){if(!i.length)return e;var r=i[0];if("op"!=r.type)return e;var n=PRECEDENCE[r.value];if(t<n){i.shift();var a=y(p(),n),u={type:"="!=r.value||l?"binary":"assign",operator:r.value,left:e,right:a};return"num"==e.type&&"num"==a.type&&(u={type:"num",value:compute(e.value,a.value,r.value)}),"str"==e.type&&"str"==a.type&&"+"==r.value&&(u={type:"str",value:e.value+a.value}),y(u,t)}return e};return y(p(),0)};var labelIndex=function(a){for(var e={},r=0;r<a.length;r++){if(a[r].label)e[a[r].label]=r}return e},findNewLine=function(a,e){if(!e[a])return null;for(var r=e[a]._numline;a<e.length;){if(!e[++a])return null;if(e[a]._numline>r)return a}return null},skipMark=function(a,e){var r=findNewLine(a,e);r&&(e[r]._skip||(e[r]._skip=[]),e[r]._skip.push(a))},findLabel=function(a,e){return void 0!==e[a]?e[a]:null},croak=function(a,e){throw new Error(a+" ("+e._numline+":"+e._cmd+")")},opAsm=function(a,e,r){if("str"==r){switch(a){case"+":return"concat";case"=":return"streq"}croak("Invalid string operator",e)}switch(a){case"+":return"add";case"-":return"sub";case"*":return"mul";case"/":return"div";case"%":return"mod";case"=":return"eq";case"<>":return"neq";case"<":return"lt";case">":return"gt";case"<=":return"le";case">=":return"ge";case"&":return"bitand";case"|":return"bitor";case"^":return"bitxor";case"and":return"and"}},varAsm=function(){var a="";for(var e in ENV.vars){var r=ENV.vars[e],t=e.split("_")[0];switch(r){case"int":a+="v_"+t+":\t DS 2\n";continue;case"str":a+="vs_"+t+":\t DS 2\n";continue;case"sysdb":a+="sv_"+t+":\t DS 1\n";continue;case"sysdw":a+="sv_"+t+":\t DS 2\n";continue;case"sysdq":a+="sv_"+t+":\t DS 4\n";continue}}for(var e in ENV.intarr){a+="vai_"+e+":\t DS "+2*ENV.intarr[e]+"\n"}return a},strAsm=function(){for(var a="",e=0;e<ENV.strs.length;e++){a+="cs_"+e+':\t DB "'+ENV.strs[e]+'",0\n'}return a},fnAsm=function(){for(var a,e="";a=ENV.uses.shift();){var r=LIB[a];if(!r)throw new Error("Cannot link "+a);if(r.sysdb)for(var t=0;t<r.sysdb.length;t++)ENV.addVar(r.sysdb[t],"sysdb");if(r.sysdw)for(t=0;t<r.sysdw.length;t++)ENV.addVar(r.sysdw[t],"sysdw");if(r.sysdq)for(t=0;t<r.sysdq.length;t++)ENV.addVar(r.sysdq[t],"sysdq");e+=";---"+a+"---\n",e+=a+":\n",e+=r.code,e+=";---"+a+"-end---\n\n"}return e},ENV={vars:{},addVar:function(a,e){ENV.vars[a+"_"+e]=e},fns:{},addFn:function(a){a=a.toLowerCase(),ENV.fns[a]=a},procs:{},addProc:function(a){a=a.toLowerCase(),ENV.procs[a]=a},intarr:{},addArrInt:function(a,e){ENV.intarr[a]=e},strs:[],addStr:function(a){return ENV.strs.indexOf(a)<0&&ENV.strs.push(a),ENV.strs.indexOf(a)},datas:[],datalabels:[],addData:function(a,e){e&&(ENV.datas.push("dt_"+e+":\n"),ENV.datalabels.push(e)),ENV.datas.push("\t DW "+a+"\n")},uses:[],addUse:function(a){if(ENV.uses.indexOf(a)<0){ENV.uses.push(a);var e=LIB[a];if(!e)throw new Error("Cannot link "+a);if(e.uses)for(var r=0;r<e.uses.length;r++){var t=e.uses[r];ENV.addUse(t)}}return ENV.uses.indexOf(a)}},generator=function(a,d,e){for(var r in ENV.vars={},ENV.strs=[],ENV.uses=[],ENV.fns={},ENV.procs={},ENV.datas=[],ENV.datalabels=[],d.system)LIB[r]=d.system[r];for(var r in e.xp)d.xp[r]||(d.xp[r]=e.xp[r]);for(var r in e.asm)d.asm[r]||(d.asm[r]=e.asm[r]);var u=function(a,e,r,t){void 0===r&&(r="int"),void 0===t&&(t=!1);var n=a.type;if("num"==n&&!t)return d.xp.num(a,e);if("str"==n&&!t){var s=ENV.addStr(a.value);return d.xp.str(a,e,s)}if("num"==n&&t)return d.xp.numL(a,e);if("str"==n&&t){s=ENV.addStr(a.value);return d.xp.strL(a,e,s)}if("var"==n&&!t)return ENV.addVar(a.value,"int"),d.xp.var(a,e);if("var"==n&&t)return ENV.addVar(a.value,"int"),d.xp.varL(a,e);if("ptr"==n&&!t){if("str"==a.ex.type){s=ENV.addStr(a.value);return d.xp.str(a,e,s)}return"var[]"==a.ex.type?(ENV.intarr[a.value]||croak("You have to DIM array first",e),"num"==a.ex.index.type&&a.ex.index.value>=ENV.intarr[a.value]&&croak("Index out of bound",e),"num"==a.ex.index.type?d.xp.varAIIndirect(a,e):d.xp.varAIndirect(a,e,ENV,u)):(ENV.addVar(a.value,a.varType),d.xp.varIndirect(a,e))}if("ptr"==n&&t){if("str"==a.ex.type){s=ENV.addStr(a.value);return d.xp.strL(a,e,s)}return"var[]"==a.ex.type?(ENV.intarr[a.value]||croak("You have to DIM array first",e),"num"==a.ex.index.type&&a.ex.index.value>=ENV.intarr[a.value]&&croak("Index out of bound",e),"num"==a.ex.index.type?d.xp.varAIIndirectL(a,e):d.xp.varAIndirectL(a,e,ENV,u)):(ENV.addVar(a.value,a.varType),d.xp.varIndirectL(a,e))}if("var$"==n&&!t)return ENV.addVar(a.value,"str"),d.xp.varS(a,e);if("slice$"==n&&!t)return ENV.addVar(a.value,"str"),d.xp.varS(a,e)+d.xp.sliceS(a,e,ENV,u);if("slice$"==n&&t)return ENV.addVar(a.value,"str"),d.xp.varS(a,e)+d.xp.sliceSL(a,e,ENV,u);if("var$"==n&&t)return ENV.addVar(a.value,"str"),d.xp.varSL(a,e);if("var[]"==n&&(ENV.intarr[a.value]||croak("You have to DIM array first",e),"num"==a.index.type&&a.index.value>=ENV.intarr[a.value]&&croak("Index out of bound",e)),"var[]"==n&&!t)return"num"==a.index.type?d.xp.varAI(a,e):d.xp.varA(a,e,ENV,u);if("var[]"==n&&t)return"num"==a.index.type?d.xp.varAIL(a,e):d.xp.varAL(a,e,ENV,u);if("binary"==n){var i=d.xp.shortcuts(a,e,r,ENV,u);return i||(t?d.xp.binaryL(a,e,r,ENV,u,LIB):d.xp.binary(a,e,r,ENV,u,LIB))}if("fn"==n&&!t){if("fn"==a.value){var o=a.operands[0];return null===(l=findLabel(o.value,ENV.labels))&&croak("Target line not found",e),d.xp.userfn(a,e,ENV,u,l)}return d.xp.fn(a,e,ENV,u,LIB)}if("fn"==n&&t){if("fn"==a.value){var l;o=a.operands[0];return null===(l=findLabel(o.value,ENV.labels))&&croak("Target line not found",e),d.xp.userfnL(a,e,ENV,u,l)}return d.xp.fnL(a,e,ENV,u,LIB)}croak("Cannot evaluate "+JSON.stringify(a),e)},t=function(a){return!!h.length&&("punc"==h[0].type&&(h[0].value==a&&(h.shift(),!0)))},n=function(a){return!!h.length&&("op"==h[0].type&&(h[0].value==a&&(h.shift(),!0)))},s=function(a){return!!h.length&&("kw"==h[0].type&&(h[0].value==a&&(h.shift(),!0)))},i=function(){return!!h.length&&("var"==h[0].type&&h.shift())},o="";o+=";----CODE SEGMENT (ROMable)\n";var l=labelIndex(a);ENV.labels=l;for(var p=[],c=[],v=[],f=0;f<a.length;f++){var m,E=a[f];if(o+="CMD"+f+":\n",E._skip){for(;c.length;)o+="ELSKIP"+c[0]+":\n",c.shift();o+="SKIP"+E._skip[0]+":\n"}var h=[].concat(E.tokens);if("kw"==h[0].type){var V=h[0].value;switch(h.shift(),o+="; "+V+"\n",V){case"goto":R=h[0],null===(S=findLabel(R.value,l))&&croak("Target line not found",E),o+=d.asm.jmp("CMD"+S);break;case"gosub":R=h[0],null===(S=findLabel(R.value,l))&&croak("Target line not found",E),o+=d.asm.docall("CMD"+S);break;case"return":if(h.length){var k=expr(h,E),N=exprType(k,E);if(o+=u(k,E,N),t(";")){for(o+=d.asm.swap();h.length;){(k=i())||croak("POP needs a variable name",E),ENV.addVar(k.value,"int"),o+=d.asm.dopop(),o+=d.asm.storeInt(k.value,E),h.length&&(t(",")||croak("Separate names with a comma",E))}o+=d.asm.swap()}}o+=d.asm.ret();break;case"end":o+=d.asm.end();break;case"stop":ENV.addUse("errstop"),o+=d.asm.jmp("ERRSTOP");break;case"repeat":p.unshift(["CMD"+f,"R"]);break;case"endwhile":case"wend":p.length||croak("ENDWHILE without WHILE",E),"W"!=p[0][1]&&croak("WHILE / ENDWHILE mismatched",E),o+=d.asm.jmp(p[0][0]),o+="WB"+p[0][0]+":\n",p.shift();break;case"break":p.length||croak("BREAK outside the loop",E),o+=d.asm.jmp(p[0][1]+"B"+p[0][0]);break;case"continue":p.length||croak("CONTINUE outside the loop",E),o+=d.asm.jmp(p[0][1]+"C"+p[0][0]);break;case"dim":"var[]"!=(T=expr(h,E)).type&&croak("DIM needs a variable name",E),"num"!=T.index.type&&croak("DIM needs a constant size",E),ENV.addArrInt(T.value,T.index.value);break;case"data":for(var x=E.label;R=h.shift();){if("num"==R.type){if(ENV.addData(R.value,x),!t(","))break}else if("str"==R.type){if(ENV.addData("cs_"+ENV.addStr(R.value),x),!t(","))break}else croak("Invalid data",E);x=null}break;case"restore":if(h.length){ENV.addUse("s_lut"),ENV.addUse("errnodata");k=expr(h,E),N=exprType(k,E);o+=u(k,E,N),o+=d.asm.docall("s_lut"),o+=d.asm.jmpZ("errnodata"),o+=d.asm.storeAnyInt("datapoint");break}o+=d.xp.num({value:"databegin"},E),o+=d.asm.storeAnyInt("datapoint");break;case"read":for(ENV.addUse("s_read");h.length;){(k=!!h.length&&("var"==h[0].type||"var$"==h[0].type)&&h.shift())||croak("READ needs a variable name",E),"var"==k.type?(ENV.addVar(k.value,"int"),o+=d.asm.docall("s_read"),o+=d.asm.storeInt(k.value,E)):(ENV.addUse("__heap"),ENV.addVar(k.value,"int"),o+=d.asm.strUnassign(k.value),o+=d.asm.docall("s_read"),o+=d.asm.storeStr(k.value,E)),h.length&&(t(",")||croak("Separate names with a comma",E))}break;case"def":if("fn"==(R=h[0]).type&&"fn"==R.value){h.shift(),R=h.shift(),null===(S=findLabel(R.value,l))&&croak("Target line not found",E),ENV.addFn(R.value);break}if("var"==R.type&&"proc"==R.value){h.shift(),R=h.shift(),null===(S=findLabel(R.value,l))&&croak("Target line not found",E),ENV.addProc(R.value);break}croak("DEF without FN",E);break;case"ramtop":"num"!=(R=h[0]).type&&croak("RAMTOP needs a constant value",E),d.ramtop=R.value;break;case"swap":if((k=i())||croak("SWAP needs a variable name",E),o+=d.xp.var(k,E),ENV.addVar(k.value,"int"),!h.length)break;t(",")||croak("Separate names with a comma",E),(I=i())||croak("SWAP needs two variables",E),ENV.addVar(I.value,"int"),o+=d.asm.swap(),o+=d.xp.var(I,E),o+=d.asm.storeInt(k.value),o+=d.asm.swap(),o+=d.asm.storeInt(I.value);break;case"on":if((k=i())||croak("ON needs a variable name",E),o+=d.xp.var(k,E),ENV.addVar(k.value,"int"),h.length||croak("ON needs a GOTO/GOSUB",E),s("goto")){for(var b=[];h.length;){null===(S=findLabel(h[0].value,l))&&croak("Target line "+h[0].value+" not found",E),b.push(S),h.shift(),h.length&&(t(",")||croak("Syntax error",E))}127<b.length&&croak("Too much targets",E),o+=d.asm.ongoto(b);break}if(s("gosub")){for(b=[];h.length;){null===(S=findLabel(h[0].value,l))&&croak("Target line "+h[0].value+" not found",E),b.push(S),h.shift(),h.length&&(t(",")||croak("Syntax error",E))}127<b.length&&croak("Too much targets",E),o+=d.asm.ongosub(b,f);break}croak("Syntax error: ON without GOTO/GOSUB",E);case"push":for(;h.length;){(k=i())||croak("PUSH needs a variable name",E),o+=d.xp.var(k,E),ENV.addVar(k.value,"int"),o+=d.asm.dopush(),h.length&&(t(",")||croak("Separate names with a comma",E))}break;case"pop":for(;h.length;){(k=i())||croak("POP needs a variable name",E),ENV.addVar(k.value,"int"),o+=d.asm.dopop(),o+=d.asm.storeInt(k.value,E),h.length&&(t(",")||croak("Separate names with a comma",E))}break;case"take":if((k=i())||croak("TAKE needs a variable name",E),ENV.addVar(k.value,"int"),!h.length){o+=d.asm.storeInt(k.value,E);break}if(t(";")){for(;h.length;){o+=d.asm.dopush(),(g=i())||croak("TAKE PUSH needs a variable name",E),ENV.addVar(g.value,"int"),o+=d.xp.var(g,E),o+=d.asm.stackSwap(),h.length&&(t(",")||croak("Separate names with a comma",E))}o+=d.asm.storeInt(k.value,E);break}var y=d.asm.storeInt(k.value,E)+d.asm.swap();if(t(",")||croak("Separate names with a comma",E),(k=i())||croak("Second TAKE needs a variable name",E),ENV.addVar(k.value,"int"),!h.length){o+=y+d.asm.storeInt(k.value,E);break}if(t(";")){for(;h.length;){var g;o+=d.asm.dopush(),(g=i())||croak("TAKE PUSH needs a variable name",E),ENV.addVar(g.value,"int"),o+=d.xp.var(g,E),o+=d.asm.stackSwap(),h.length&&(t(",")||croak("Separate names with a comma",E))}o+=y+d.asm.storeInt(k.value,E);break}if(o+=y+d.asm.storeInt(k.value,E),!h.length)break;croak("TAKE has 2 parameters max",E);break;case"call":R=h[0],null===(S=findLabel(R.value,l))&&croak("Target line not found",E),h.shift(),t(",")||croak("Syntax error",E);k=expr(h,E),N=exprType(k,E);if(o+=u(k,E,N),t(",")){var I=expr(h,E);N=exprType(I,E);o+=u(I,E,L,!0)}o+=d.asm.docall("CMD"+S);break;case"let":if("var"==h[0].type&&ENV.procs[h[0].value]==h[0].value){var S;R=h[0],null===(S=findLabel(R.value,l))&&croak("Target line not found",E),h.shift();k=expr(h,E),N=exprType(k,E);if(o+=u(k,E,N),t(",")){I=expr(h,E),N=exprType(I,E);o+=u(I,E,L,!0)}o+=d.asm.docall("CMD"+S);break}var T,w=[];if("var"==(T=expr(h,E)).type){if(h.length||croak("LET should assign something",E),n("++")){ENV.addVar(T.value,"int"),o+=d.asm.varplus1(T.value),h.shift();break}if(n("--")){ENV.addVar(T.value,"int"),o+=d.asm.varminus1(T.value),h.shift();break}if(n("**")){ENV.addVar(T.value,"int"),o+=d.asm.vartimes2(T.value),h.shift();break}if(n("+++")){ENV.addVar(T.value,"int"),o+=d.asm.varplus2(T.value),h.shift();break}if(n("---")){ENV.addVar(T.value,"int"),o+=d.asm.varminus2(T.value),h.shift();break}if("punc"==h[0].type&&","==h[0].value)for(;t(",");)"var"!=T.type&&croak("Multiassigning needs a scalar int",E),w.push(T),T=expr(h,E);else croak("LET syntax mismatch",E)}"assign"!==T.type&&croak("LET should assign",E),"var"!=(R=T.left).type&&"var[]"!=R.type&&"var$"!=R.type&&"slice$"!=R.type&&croak("No variable name",E),"var$"==R.type&&(ENV.addVar(R.value,"str"),ENV.addUse("__heap"),o+=d.asm.strUnassign(R.value)),"slice$"==R.type&&(ENV.addVar(R.value,"str"),ENV.addUse("__heap"),o+=d.asm.strUnassign(R.value));k=T.right,N=exprType(k,E);if(o+=u(k,E,N),"var"==R.type)for("int"!=N&&croak("Cannot assign this to int variable",E),ENV.addVar(R.value,"int"),o+=d.asm.storeInt(R.value);w.length;)R=w.pop(),o+=d.asm.storeInt(R.value);else"var[]"==R.type?("int"!=N&&croak("Cannot assign this to int variable",E),ENV.intarr[R.value]||croak("You have to DIM array first",E),"num"==R.index.type&&R.index.value>=ENV.intarr[R.value]&&croak("Index out of bound",E),"num"==R.index.type?o+=d.asm.storeAI(R.value,R.index.value):o+=d.asm.storeA(R,E,N,ENV,u)):"var$"==R.type?("str"!=N&&croak("Cannot assign this to string variable",E),o+=d.asm.storeStr(R.value)):"slice$"==R.type&&("str"!=N&&croak("Cannot assign this to string slice",E),o+=d.asm.storeSlice(R.value,R,E,ENV,u));break;case"poke":k=expr(h,E),N=exprType(k,E);t(",")||croak("Syntax error",E);I=expr(h,E);var L=exprType(I,E);o+=d.asm.poke(k,N,I,L,u,E);break;case"dpoke":k=expr(h,E),N=exprType(k,E);t(",")||croak("Syntax error",E);I=expr(h,E),L=exprType(I,E);o+=d.asm.dpoke(k,N,I,L,u,E);break;case"out":k=expr(h,E),N=exprType(k,E);t(",")||croak("Syntax error",E);I=expr(h,E),L=exprType(I,E);o+=d.asm.ioOut(k,N,I,L,u,E,ENV);break;case"wait":k=expr(h,E),N=exprType(k,E);t(",")||croak("Syntax error",E);I=expr(h,E),L=exprType(I,E);var _={type:"num",value:0};t(",")&&(_=expr(h,E));var A=exprType(I,E);o+=d.asm.wait(k,N,I,L,_,A,f,u,E,ENV);break;case"for":"var"!=(R=h.shift()).type&&croak("No usable variable name",E),"op"==(m=h.shift()).type&&"="==m.value||croak("FOR without an initial assignment",E);var U=expr(h,E),D=exprType(U,E);"kw"==(m=h.shift()).type&&"to"==m.value||croak("FOR without TO",E);var O="ex";k=expr(h,E),N=exprType(k,E);"num"==k.type?O=k.value:(o+=u(k,E,N),o+=d.asm.storeAnyInt("sv_forL"+f),ENV.addVar("forL"+f,"sysdw"));var M=1;if(h.length){"kw"==(m=h.shift()).type&&"step"==m.value||croak("Did you mean STEP?",E);k=expr(h,E),N=exprType(k,E);"num"==k.type?M=k.value:(o+=u(k,E,N),o+=d.asm.storeAnyInt("sv_forS"+f),ENV.addVar("forS"+f,"sysdw"),M="ex")}o+=u(U,E,D),ENV.addVar(R.value,"int"),o+=d.asm.storeInt(R.value),o+=d.asm.jmp("FTCMD"+f),o+="FLCMD"+f+":\n",p.unshift(["CMD"+f,"F",f,R.value,M,O]);break;case"next":p.length||croak("NEXT without FOR",E),"F"!=p[0][1]&&croak("Loops mismatched",E),"var"!=(R=h.shift()).type&&croak("No usable variable name",E),R.value!=p[0][3]&&croak("FOR / NEXT variable mismatch",E),o+="FC"+p[0][0]+":\n",o+=d.xp.var(R.value),o+=d.asm._forstep(p),o+=d.asm.storeInt(R.value),o+="FT"+p[0][0]+":\n",o+=d.asm._fortest(p),o+="FB"+p[0][0]+":\n",p.shift();break;case"if":k=expr(h,E,!0),N=exprType(k,E);s("then")||croak("IF without THEN",E),a[f]._numline==a[f+1]._numline?skipMark(f,a):v.unshift(f),o+=u(k,E,N),o+=d.asm.jmpEx0("ELSKIP"+f),c.unshift(f);break;case"endif":v.length||croak("ENDIF without IF",E),c.length&&(o+="ELSKIP"+c[0]+":\n",c.shift()),o+="SKIP"+v[0]+":\n",v.shift();break;case"until":p.length||croak("UNTIL without REPEAT",E),"R"!=p[0][1]&&croak("UNTIL / REPEAT mismatched",E);k=expr(h,E,!0);o+="RC"+p[0][0]+":\n",o+=u(k,E),o+=d.asm.jmpEx0(p[0][0]),o+="RB"+p[0][0]+":\n",p.shift();break;case"while":p.unshift(["CMD"+f,"W"]);k=expr(h,E,!0);o+="WC"+p[0][0]+":\n",o+=u(k,E),o+=d.asm.jmpEx0("WB"+p[0][0]);break;case"input":for(var C=!1;h.length;)if(t("#")){var P=expr(h,E,!0);o+=u(P,E,"int"),ENV.addUse("inpchan"),o+=d.asm.docall("inpchan"),t(",")||croak("Syntax error",E)}else{var R;if("var"!=(R=expr(h,E)).type)if("var[]"!=R.type)if("var$"!=R.type){k=R,N=exprType(k,E);o+=u(k,E,N),ENV.addUse("print"+N),o+=d.asm.docall("print"+N),F=!0,t(";")?F=!1:t(",")&&(ENV.addUse("printtab"),o+=d.asm.docall("printtab"),F=!1)}else{if(ENV.addVar(R.value,"str"),o+=d.asm.strUnassign(R.value),ENV.addUse("inputstr"),o+=d.asm.docall("inputstr"),ENV.addUse("__heap"),C=!0,o+=d.asm.storeStrNoGC(R.value),!h.length)break;t(",")||croak("Syntax error",E),h.shift()}else{if(ENV.intarr[R.value]||croak("You have to DIM array first",E),"num"==R.index.type&&R.index.value>=ENV.intarr[R.value]&&croak("Index out of bound",E),ENV.addUse("inputint"),o+=d.asm.docall("inputint"),"num"==R.index.type?o+=d.asm.storeAI(R.value,R.index.value):o+=d.asm.storeA(R,E,N,ENV,u),!h.length)break;t(",")||croak("Syntax error",E)}else{if(ENV.addUse("inputint"),ENV.addVar(R.value,"int"),o+=d.asm.docall("inputint"),o+=d.asm.storeInt(R.value),!h.length)break;t(",")||croak("Syntax error",E)}}C&&(o+=d.asm.docall("hp_gc"));break;case"write":for(C=!1;h.length;)if(t("#")){P=expr(h,E,!0);o+=u(P,E,"int"),ENV.addUse("prtchan"),o+=d.asm.docall("prtchan"),o+="\tCALL prtchan\n",t(",")||croak("Syntax error",E)}else{k=expr(h,E),N=exprType(k,E);o+=u(k,E,N),ENV.addUse("print"+N),"str"==N&&(ENV.addUse("printquot"),o+=d.asm.docall("printquot")),o+=d.asm.docall("print"+N),"str"==N&&(o+=d.asm.docall("printquot"),C=!0),F=!0,t(",")&&(ENV.addUse("printcomma"),o+=d.asm.docall("printcomma"))}ENV.addUse("println"),o+=d.asm.docall("println"),C&&(o+=d.asm.docall("hp_gc"));break;case"print":var F=!0;for(C=!1;h.length;)if(t("#")){P=expr(h,E,!0);o+=u(P,E,"int"),ENV.addUse("prtchan"),o+=d.asm.docall("prtchan"),o+="\tCALL prtchan\n",t(",")||croak("Syntax error",E)}else{k=expr(h,E),N=exprType(k,E);o+=u(k,E,N),ENV.addUse("print"+N),o+=d.asm.docall("print"+N),"str"==N&&(C=!0),F=!0,t(";")?F=!1:t(",")&&(ENV.addUse("printtab"),o+=d.asm.docall("printtab"),F=!1)}F&&(ENV.addUse("println"),o+=d.asm.docall("println")),C&&(o+=d.asm.docall("hp_gc"));break;default:croak("Keyword not implemented",E)}E.hasElse&&(o+=d.asm.jmp("SKIP"+c[0]),o+="ELSKIP"+c[0]+":\n",c.shift()),h.length&&croak("Extra characters "+JSON.stringify(h),E)}}v.length&&croak("Non-closed multiline IF",a[v[0]]),p.length&&croak("Non-closed loops",E);var B=!1,$=!1;if(0<=ENV.uses.indexOf("inputint")&&(B=!0),0<=ENV.uses.indexOf("inputstr")&&(B=!0),0<=ENV.uses.indexOf("f_rnd")&&($=!0),0<=ENV.uses.indexOf("__heap")&&(o="\tCALL HP_INIT\n"+o),o="\tORG "+d.org+"\n\t.ent $\n\n"+o,o+="ERRGO:\t"+d.goback+"\n",o+=fnAsm(),o+=";----DATA SEGMENT (ROM)\n",o+=strAsm(),o+=";----INITIALIZED DATA SEGMENT (RAM)\n",ENV.datas.length){o+="datapoint: dw $+2\n",o+="databegin:\n",o+=ENV.datas.join(""),o+="datatable: dw 0\n",ENV.datalabels=ENV.datalabels.sort(function(a,e){return e-a});for(f=0;f<ENV.datalabels.length;f++){var K=ENV.datalabels[f];o+="\tdw "+K+",dt_"+K+"\n"}o+="\tdw 0\n"}return $&&(o+="sv_seed1: dw "+Math.floor(65535*Math.random()+1)+"\n",o+="sv_seed2: dw "+Math.floor(65535*Math.random()+1)+"\n"),o+=";----BSS SEGMENT\n",o+=varAsm(),B&&(o+="i_buffer: ds 257\n"),o+="\n\nHEAP EQU $\nRAMTOP EQU "+d.ramtop+"\nds RAMTOP-$\n\n"}; return { compile: function(source) { return generator(parse(source),CONFIG.OMENALPHA,BASIC.I8080) } } }));