:- initialization(main, main). % --- Global State --- :- dynamic gdispstr/1, gfnumenting/1, gax/1, gbx/1, gbinop/1. gdispstr("0"). gfnumenting(false). gax(0.0). gbx(0.0). gbinop(11). % --- Key Definition Table & Mappings --- kbd(0, "Off", 2628095). kbd(1, "C", 2628095). kbd(2, " Text = "0" ; Text = Psz), format('F 0 16777215~nFR 0 0 0 9900 600~nF 0 ~d~nR 0 100 100 9800 500~nR$ 0 9800 520"~w"~n', [Color, Text]), flush_output. itorect(Pref, BX, BY, EX, EY, I) :- X_Off is (I mod 4) * 2000, Y_Off is (I // 4) * 1200, X1 is X_Off + BX, Y1 is Y_Off + BY, X2 is X_Off + EX, Y2 is Y_Off + EY, format('~w 0 ~d ~d ~d ~d~n', [Pref, X1, Y1, X2, Y2]). % --- UI Rendering --- drawapp :- myputs("Fo 0 611 3\nFo 2 140 3\n"), myputs("F 0 16777215\nFR 0 0 0 10000 10000\n"), gdispstr(D), dispstr(D, 6052991), forall(between(0, 19, I), ( kbd(I, Label, Color), itorect("F 0 10526880\nFR", 220, 1220, 2080, 2280, I), itorect("F 0 986895\nR", 200, 1200, 2100, 2300, I), format('F 0 ~d~n', [Color]), X_Text is (I mod 4) * 2000 + 1100, Y_Text is (I // 4) * 1200 + 1700, format('C$ 0 ~d ~d "~w"~n', [X_Text, Y_Text, Label]) )), myputs("F 0 255\nC$ 0 5000 800 \"Prolog cloud app shell\"\n"), myputs("F 2 255\nC$ 2 5000 7200 \"Corrie Zucker Technologies LLC.\"\n"), myputs("C$ 2 5000 7340 \"d/b/a CZ Technologies\"\nZ \n"), flush_output. % --- Calculator Engine --- key_to_exe(0) :- myputs("O 0 0 0\n"), halt. key_to_exe(1) :- retractall(gdispstr(_)), assertz(gdispstr("")), retractall(gfnumenting(_)), assertz(gfnumenting(false)), dispstr("0", 6052991). key_to_exe(2) :- gdispstr(Current), (string_length(Current, L), L > 0 -> (L == 1 -> New = "" ; sub_string(Current, 1, _, 0, New)), retractall(gdispstr(_)), assertz(gdispstr(New)), dispstr(New, 6052991) ; true). key_to_exe(RC) :- member(RC, [4,5,6,8,9,10,12,13,14,16,17]), !, kbd(RC, Digit, _), numappend(Digit). key_to_exe(RC) :- member(RC, [3,7,11,15]), !, gdispstr(D), (D == "" -> V = 0.0 ; atom_number(D, V)), retractall(gax(_)), assertz(gax(V)), retractall(gdispstr(_)), assertz(gdispstr("")), retractall(gfnumenting(_)), assertz(gfnumenting(false)), retractall(gbinop(_)), assertz(gbinop(RC)). key_to_exe(18) :- gdispstr(D), string_length(D, L), L > 0, (sub_string(D, 0, 1, _, "-") -> sub_string(D, 1, _, 0, New) ; string_concat("-", D, New)), retractall(gdispstr(_)), assertz(gdispstr(New)), dispstr(New, 6052991). key_to_exe(19) :- !, gfnumenting(Flag), (Flag == true -> gdispstr(D), (D == "" -> V = 0.0 ; atom_number(D, V)), retractall(gbx(_)), assertz(gbx(V)), retractall(gfnumenting(_)), assertz(gfnumenting(false)) ; true), gax(A), gbx(B), gbinop(Op), (Op == 3 -> Res is A * B ; Op == 7 -> Res is A / B ; Op == 11 -> Res is A + B ; Op == 15 -> Res is A - B ; Res = A), atom_string(Res, S), retractall(gax(_)), assertz(gax(Res)), retractall(gdispstr(_)), assertz(gdispstr(S)), dispstr(S, 6052991). numappend(Digit) :- gfnumenting(Flag), gdispstr(Current), (Flag == true -> string_concat(Current, Digit, New) ; New = Digit), retractall(gdispstr(_)), assertz(gdispstr(New)), retractall(gfnumenting(_)), assertz(gfnumenting(true)), dispstr(New, 6052991). % --- Main Controller & Loop --- main :- prompt(_, ''), % Set prompt to empty string to silence |: loop. loop :- read_line_to_string(user_input, Line), (Line == end_of_file -> true ; process_line(Line), loop). process_line("drawapp") :- !, drawapp. process_line(Line) :- split_string(Line, " ", " ", [BtnS, XS, YS]), atom_number(BtnS, B), atom_number(XS, X), atom_number(YS, Y), !, handle_input(B, X, Y). process_line(_). handle_input(Btn, -2, _) :- !, (keymap(Btn, RC) -> key_to_exe(RC) ; true). handle_input(Btn, -4, Y) :- !, format('Rz ~d ~d~n', [Btn, Y]). handle_input(Btn, -5, Y) :- !, format('Mv ~d ~d~n', [Btn, Y]). handle_input(1, X, Y) :- X >= 0, !, Row is (Y - 1200) // 1200, Col is (X - 200) // 2000, RC is Row * 4 + Col, key_to_exe(RC). handle_input(_, _, _).