Poraka BASIC is a small integer-only BASIC interpreter for the ilo virtual computer. Enter numbered program lines to build or edit a program. Use: - `RUN` to execute the current program - `NEW` to erase all stored lines - `BYE` to exit Supported statements: - `PRINT "TEXT"` - `PRINT ` - `LET A = ` - `INPUT A` - `GOTO ` - `IF = GOTO ` - `IF < GOTO ` - `IF > GOTO ` - `REM ...` - `END` Variables are `A` through `Z`. Expressions are integer only and are evaluated left-to-right using `+`, `-`, `*`, and `/`. ~~~ : start i lica.... r init : repl i lica.... r load_program i liju.... r repl : init i lica.... r clear_program i liju.... r clear_variables : clear_variables i lili.... r Variables r ClearPtr i stlili.. d 26 r ClearCount i st...... : clear_variables_loop i life.... r ClearCount i ligtli.. d 0 r clear_variables_body i cj...... i re...... : clear_variables_body i li...... d 0 i life.... r ClearPtr i st...... i life.... r ClearPtr i liadli.. d 1 r ClearPtr i stlife.. r ClearCount i lisuli.. d 1 r ClearCount i stliju.. r clear_variables_loop : clear_program i lili.... r ProgramBuffer r ProgramWrite i stlili.. d 0 r LineCount i stlili.. d 0 r CurrentIndex i stlili.. d 0 r EOFFlag i st...... i re...... : halt i liio.... d 6 : load_program : lp_loop i lica.... r read_line i life.... r EOFFlag i lieqli.. d -1 r halt i cj...... i lili.... r InputBuffer r SrcPtr i stlica.. r skip_spaces i lifefeli r SrcPtr r TempChar i st...... i life.... r TempChar i lieqli.. d 0 r lp_loop i cj...... i lica.... r is_bye_command i life.... r ByeFlag i lieqli.. d -1 r halt i cj...... i lica.... r is_new_command i life.... r NewFlag i lieqli.. d -1 r lp_new i cj...... i lica.... r is_run_command i life.... r RunFlag i lieqli.. d -1 r lp_run i cj...... i life.... r TempChar i liltli.. d 48 r lp_loop i cj...... i life.... r TempChar i ligtli.. d 57 r lp_loop i cj...... i lica.... r store_line i liju.... r lp_loop : lp_new i lica.... r clear_program i liju.... r lp_loop : lp_run i lica.... r clear_variables i lica.... r execute_program i re...... : is_run_command i lili.... d 0 r RunFlag i st...... i life.... r SrcPtr i fe...... i lieqli.. d 82 r ir_match i cj...... i re...... : ir_match i lili.... d -1 r RunFlag i stre.... : is_new_command i lili.... d 0 r NewFlag i st...... i life.... r SrcPtr i fe...... i lieqli.. d 78 r in_match i cj...... i re...... : in_match i lili.... d -1 r NewFlag i stre.... : is_bye_command i lili.... d 0 r ByeFlag i st...... i life.... r SrcPtr i fe...... i lieqli.. d 66 r ib_match i cj...... i re...... : ib_match i lili.... d -1 r ByeFlag i stre.... : read_line i lili.... r InputBuffer r InputPtr i stlili.. d 0 r ReadLen i stlili.. d 0 r EOFFlag i st...... : rl_loop i liio.... d 1 i duli.... d -1 i eqli.... r rl_eof i cj...... i duli.... d 10 i eqli.... r rl_finish i cj...... i duli.... d 13 i eqli.... r rl_finish i cj...... i life.... r InputPtr i st...... i life.... r InputPtr i liadli.. d 1 r InputPtr i stlife.. r ReadLen i liadli.. d 1 r ReadLen i stliju.. r rl_loop : rl_eof i life.... r ReadLen i lieqli.. d 0 r rl_set_eof i cj...... i liju.... r rl_finish : rl_set_eof i lili.... d -1 r EOFFlag i st...... : rl_finish i drli.... d 0 i life.... r InputPtr i stre.... i re...... : store_line i lili.... r InputBuffer r SrcPtr i stlica.. r parse_number i lifeli.. r ParseResult r TargetLine i stlica.. r find_line i life.... r FoundFlag i lieqli.. d 0 r sl_new i cj...... i life.... r ProgramWrite i life.... r FoundIndex i liad.... r LineAddrs i st...... i liju.... r sl_copy_setup : sl_new i life.... r TargetLine i life.... r LineCount i liad.... r LineNumbers i st...... i life.... r ProgramWrite i life.... r LineCount i liad.... r LineAddrs i st...... : sl_copy_setup i life.... r ProgramWrite i li...... r DstPtr i st...... i lili.... r InputBuffer r SrcPtr i st...... : sl_copy i lifefeli r SrcPtr r TempChar i stlife.. r TempChar i life.... r DstPtr i st...... i life.... r SrcPtr i liadli.. d 1 r SrcPtr i stlife.. r DstPtr i liadli.. d 1 r DstPtr i stlife.. r TempChar i lieqli.. d 0 r sl_done i cj...... i liju.... r sl_copy : sl_done i lifeli.. r DstPtr r ProgramWrite i stlife.. i life.... r FoundFlag i lieqli.. d 0 r sl_bump_count i cj...... i re...... : sl_bump_count i life.... r LineCount i liadli.. d 1 r LineCount i stre.... : execute_program i lili.... d 0 r CurrentIndex i st...... : ep_loop i life.... r CurrentIndex i life.... r LineCount i ltli.... r ep_body i cj...... i re...... : ep_body i life.... r CurrentIndex i liad.... r LineAddrs i feli.... r SrcPtr i stlica.. r parse_number i lica.... r skip_spaces i lifefeli r SrcPtr r TempChar i st...... i life.... r TempChar i lieqli.. d 80 r stmt_print i cj...... i life.... r TempChar i lieqli.. d 76 r stmt_let i cj...... i life.... r TempChar i lieqli.. d 73 r stmt_i i cj...... i life.... r TempChar i lieqli.. d 71 r stmt_goto i cj...... i life.... r TempChar i lieqli.. d 82 r stmt_rem i cj...... i life.... r TempChar i lieqli.. d 69 r stmt_end i cj...... i lica.... r next_line i liju.... r ep_loop : stmt_i i life.... r SrcPtr i liad.... d 1 i fe...... i lieqli.. d 78 r stmt_input i cj...... i liju.... r stmt_if : stmt_print i life.... r SrcPtr i liadli.. d 5 r SrcPtr i stlica.. r skip_spaces i lifefeli r SrcPtr r TempChar i st...... i life.... r TempChar i lieqli.. d 34 r print_string_stmt i cj...... i lica.... r parse_expression i lifeli.. r ExprResult r NumberTemp i stlica.. r print_number i lica.... r print_line_end i lica.... r next_line i liju.... r ep_loop : print_string_stmt i life.... r SrcPtr i liadli.. d 1 r SrcPtr i st...... : pss_loop i lifefeli r SrcPtr r TempChar i st...... i life.... r TempChar i lieqli.. d 34 r pss_done i cj...... i life.... r TempChar i lieqli.. d 0 r pss_done i cj...... i life.... r TempChar i liio.... d 0 i life.... r SrcPtr i liadli.. d 1 r SrcPtr i stliju.. r pss_loop : pss_done i life.... r SrcPtr i liadli.. d 1 r SrcPtr i stlica.. r print_line_end i lica.... r next_line i liju.... r ep_loop : stmt_let i life.... r SrcPtr i liadli.. d 3 r SrcPtr i stlica.. r skip_spaces i lifefeli r SrcPtr r TempChar i stlife.. r TempChar i lisuli.. d 65 r TargetVar i stlife.. r SrcPtr i liadli.. d 1 r SrcPtr i stlica.. r skip_spaces i lifefeli r SrcPtr r TempChar i st...... i life.... r TempChar i lieqli.. d 61 r let_have_eq i cj...... i liju.... r let_have_eq : let_have_eq i life.... r SrcPtr i liadli.. d 1 r SrcPtr i stlica.. r parse_expression i life.... r ExprResult i life.... r TargetVar i liad.... r Variables i stlica.. r next_line i liju.... r ep_loop : stmt_input i life.... r SrcPtr i liadli.. d 5 r SrcPtr i stlica.. r skip_spaces i lifefeli r SrcPtr r TempChar i stlife.. r TempChar i lisuli.. d 65 r TargetVar i stlili.. d 63 d 0 i io...... i liio.... d 32 i lica.... r read_line i lili.... r InputBuffer r SrcPtr i stlica.. r parse_number i life.... r ParseResult i life.... r TargetVar i liad.... r Variables i stlica.. r next_line i liju.... r ep_loop : stmt_goto i life.... r SrcPtr i liadli.. d 4 r SrcPtr i stlica.. r parse_number i lifeli.. r ParseResult r TargetLine i stlica.. r find_line i life.... r FoundFlag i lieqli.. d 0 r halt i cj...... i lifeli.. r FoundIndex r CurrentIndex i stliju.. r ep_loop : stmt_if i life.... r SrcPtr i liadli.. d 2 r SrcPtr i stlica.. r parse_expression i lifeli.. r ExprResult r LeftValue i stlica.. r skip_spaces i lifefeli r SrcPtr r CompChar i stlife.. r SrcPtr i liadli.. d 1 r SrcPtr i stlica.. r parse_expression i lifeli.. r ExprResult r RightValue i stlica.. r skip_spaces i life.... r SrcPtr i liadli.. d 4 r SrcPtr i stlica.. r parse_number i lifeli.. r ParseResult r TargetLine i st...... i life.... r CompChar i lieqli.. d 61 r if_eq i cj...... i life.... r CompChar i lieqli.. d 60 r if_lt i cj...... i liju.... r if_gt : if_eq i life.... r LeftValue i life.... r RightValue i eq...... i liju.... r if_after_compare : if_lt i life.... r LeftValue i life.... r RightValue i lt...... i liju.... r if_after_compare : if_gt i life.... r LeftValue i life.... r RightValue i gt...... : if_after_compare i lieqli.. d 0 r if_false i cj...... i lica.... r find_line i life.... r FoundFlag i lieqli.. d 0 r halt i cj...... i lifeli.. r FoundIndex r CurrentIndex i stliju.. r ep_loop : if_false i lica.... r next_line i liju.... r ep_loop : stmt_rem i lica.... r next_line i liju.... r ep_loop : stmt_end i life.... r LineCount r CurrentIndex i stliju.. r ep_loop : next_line i life.... r CurrentIndex i liadli.. d 1 r CurrentIndex i stre.... : skip_spaces : ss_loop i lifefeli r SrcPtr r TempChar i st...... i life.... r TempChar i lieqli.. d 32 r ss_advance i cj...... i re...... : ss_advance i life.... r SrcPtr i liadli.. d 1 r SrcPtr i stliju.. r ss_loop : parse_number i lica.... r skip_spaces i lili.... d 1 r NumSign i stlili.. d 0 r ParseResult i stlifeli r SrcPtr r TempChar i st...... i life.... r TempChar i lieqli.. d 45 r pn_neg i cj...... i liju.... r pn_digits : pn_neg i lili.... d -1 r NumSign i stlife.. r SrcPtr i liadli.. d 1 r SrcPtr i st...... : pn_digits i lifefeli r SrcPtr r TempChar i st...... i life.... r TempChar i liltli.. d 48 r pn_done i cj...... i life.... r TempChar i ligtli.. d 57 r pn_done i cj...... i life.... r ParseResult i limuli.. d 10 r ParseResult i stlife.. r TempChar i lisuli.. d 48 r Temp i stlife.. r ParseResult i life.... r Temp i adli.... r ParseResult i stlife.. r SrcPtr i liadli.. d 1 r SrcPtr i stliju.. r pn_digits : pn_done i life.... r NumSign i lieqli.. d -1 r pn_apply_sign i cj...... i re...... : pn_apply_sign i lili.... d 0 r ParseResult i fesuli.. r ParseResult i st...... i re...... : parse_value i lica.... r skip_spaces i lifefeli r SrcPtr r TempChar i st...... i life.... r TempChar i liltli.. d 65 r pv_number i cj...... i life.... r TempChar i ligtli.. d 90 r pv_number i cj...... i life.... r TempChar i lisuli.. d 65 r Temp i stlife.. r Temp i liad.... r Variables i feli.... r ParseResult i stlife.. r SrcPtr i liadli.. d 1 r SrcPtr i st...... i re...... : pv_number i liju.... r parse_number : parse_expression i lica.... r parse_value i lifeli.. r ParseResult r ExprResult i st...... : pe_loop i lica.... r skip_spaces i lifefeli r SrcPtr r OpChar i st...... i life.... r OpChar i lieqli.. d 43 r pe_plus i cj...... i life.... r OpChar i lieqli.. d 45 r pe_minus i cj...... i life.... r OpChar i lieqli.. d 42 r pe_mul i cj...... i life.... r OpChar i lieqli.. d 47 r pe_div i cj...... i re...... : pe_plus i life.... r SrcPtr i liadli.. d 1 r SrcPtr i stlica.. r parse_value i life.... r ExprResult i life.... r ParseResult i adli.... r ExprResult i stliju.. r pe_loop : pe_minus i life.... r SrcPtr i liadli.. d 1 r SrcPtr i stlica.. r parse_value i life.... r ExprResult i life.... r ParseResult i suli.... r ExprResult i stliju.. r pe_loop : pe_mul i life.... r SrcPtr i liadli.. d 1 r SrcPtr i stlica.. r parse_value i life.... r ExprResult i life.... r ParseResult i muli.... r ExprResult i stliju.. r pe_loop : pe_div i life.... r SrcPtr i liadli.. d 1 r SrcPtr i stlica.. r parse_value i life.... r ExprResult i life.... r ParseResult i di...... i swdrli.. r ExprResult i stliju.. r pe_loop : find_line i lili.... d 0 r SearchIndex i stlili.. d 0 r FoundFlag i st...... : fl_loop i life.... r SearchIndex i life.... r LineCount i ltli.... r fl_body i cj...... i re...... : fl_body i life.... r SearchIndex i liad.... r LineNumbers i fe...... i life.... r TargetLine i eqli.... r fl_found i cj...... i life.... r SearchIndex i liadli.. d 1 r SearchIndex i stliju.. r fl_loop : fl_found i lili.... d -1 r FoundFlag i stlifeli r SearchIndex r FoundIndex i st...... i re...... : print_number i life.... r NumberTemp i lieqli.. d 0 r pn_zero i cj...... i life.... r NumberTemp i liltli.. d 0 r pn_neg_out i cj...... i liju.... r pn_prepare : pn_neg_out i liio.... d 45 i lili.... d 0 r NumberTemp i fesuli.. r NumberTemp i st...... : pn_prepare i lili.... d 0 r DigitCount i st...... : pn_split i life.... r NumberTemp i lidi.... d 10 i swli.... r Remainder i stli.... r NumberTemp i stlife.. r Remainder i life.... r DigitCount i liad.... r Digits i stlife.. r DigitCount i liadli.. d 1 r DigitCount i stlife.. r NumberTemp i ligtli.. d 0 r pn_split i cj...... : pn_emit_loop i life.... r DigitCount i lieqli.. d 0 r pn_done_emit i cj...... i life.... r DigitCount i lisuli.. d 1 r DigitCount i stlife.. r DigitCount i liad.... r Digits i fe...... i liadli.. d 48 d 0 i io...... i liju.... r pn_emit_loop : pn_zero i lili.... d 48 d 0 i io...... i re...... : pn_done_emit i re...... : newline i lili.... d 10 d 0 i io...... i re...... : print_line_end i lica.... r skip_spaces i lifefeli r SrcPtr r TempChar i st...... i life.... r TempChar i lieqli.. d 59 r ple_no_newline i cj...... i lica.... r newline i re...... : ple_no_newline i re...... o 56000 : Variables * 26 : LineNumbers * 256 : LineAddrs * 256 : Digits * 16 : ProgramBuffer * 4096 : InputBuffer * 256 : ProgramWrite d 0 : LineCount d 0 : CurrentIndex d 0 : SrcPtr d 0 : DstPtr d 0 : InputPtr d 0 : ReadLen d 0 : EOFFlag d 0 : ParseResult d 0 : ExprResult d 0 : TargetLine d 0 : FoundIndex d 0 : FoundFlag d 0 : SearchIndex d 0 : NumSign d 0 : Temp d 0 : TempChar d 0 : OpChar d 0 : TargetVar d 0 : LeftValue d 0 : RightValue d 0 : CompChar d 0 : NumberTemp d 0 : DigitCount d 0 : Remainder d 0 : RunFlag d 0 : NewFlag d 0 : ByeFlag d 0 : ClearPtr d 0 : ClearCount d 0 ~~~