ffa_ch4_ffacalc.kv      1 
ffa_ch4_ffacalc.kv      2 
ffa_ch4_ffacalc.kv      3 
ffa_ch4_ffacalc.kv      4 
ffa_ch4_ffacalc.kv      5 
ffa_ch4_ffacalc.kv      6 
ffa_ch4_ffacalc.kv      7 
ffa_ch4_ffacalc.kv      8 
ffa_ch4_ffacalc.kv      9 
ffa_ch4_ffacalc.kv     10 
ffa_ch4_ffacalc.kv     11 
ffa_ch4_ffacalc.kv     12 
ffa_ch4_ffacalc.kv     13 
ffa_ch4_ffacalc.kv     14 
ffa_ch4_ffacalc.kv     15 
ffa_ch4_ffacalc.kv     16 
ffa_ch4_ffacalc.kv     17 
ffa_ch4_ffacalc.kv     18 
ffa_ch4_ffacalc.kv     19 
ffa_ch4_ffacalc.kv     20 
ffa_ch4_ffacalc.kv     21 with OS;          use OS;
ffa_ch4_ffacalc.kv     22 with CmdLine;     use CmdLine;
ffa_ch4_ffacalc.kv     23 
ffa_ch4_ffacalc.kv     24 
ffa_ch4_ffacalc.kv     25 with FZ_Lim;   use FZ_Lim;
ffa_ch4_ffacalc.kv     26 with Words;    use Words;
ffa_ch4_ffacalc.kv     27 with W_Pred;   use W_Pred;
ffa_ch4_ffacalc.kv     28 with FZ_Type;  use FZ_Type;
ffa_ch4_ffacalc.kv     29 with FZ_Basic; use FZ_Basic;
ffa_ch4_ffacalc.kv     30 with FZ_Arith; use FZ_Arith;
ffa_ch4_ffacalc.kv     31 with FZ_Cmp;   use FZ_Cmp;
ffa_ch4_ffacalc.kv     32 with FZ_Pred;  use FZ_Pred;
ffa_ch4_ffacalc.kv     33 with FZ_BitOp; use FZ_BitOp;
ffa_ch4_ffacalc.kv     34 with FZ_Shift; use FZ_Shift;
ffa_ch5_egypt.kv       35 with FZ_Divis; use FZ_Divis;
ffa_ch5_egypt.kv       36 with FZ_Mul;   use FZ_Mul;
ffa_ch4_ffacalc.kv     37 
ffa_ch4_ffacalc.kv     38 
ffa_ch4_ffacalc.kv     39 with FFA_IO;   use FFA_IO;
ffa_ch4_ffacalc.kv     40 
ffa_ch4_ffacalc.kv     41 
ffa_ch4_ffacalc.kv     42 procedure FFA_Calc is
ffa_ch4_ffacalc.kv     43    
ffa_ch4_ffacalc.kv     44    Width  : Positive; 
ffa_ch4_ffacalc.kv     45    Height : Positive; 
ffa_ch4_ffacalc.kv     46    
ffa_ch4_ffacalc.kv     47 begin
ffa_ch4_ffacalc.kv     48    if Arg_Count /= 3 then
ffa_ch4_ffacalc.kv     49       Eggog("Usage: ./ffa_calc WIDTH HEIGHT");
ffa_ch4_ffacalc.kv     50    end if;
ffa_ch4_ffacalc.kv     51    
ffa_ch4_ffacalc.kv     52    declare
ffa_ch4_ffacalc.kv     53       Arg1 : CmdLineArg;
ffa_ch4_ffacalc.kv     54       Arg2 : CmdLineArg;
ffa_ch4_ffacalc.kv     55    begin
ffa_ch4_ffacalc.kv     56       
ffa_ch4_ffacalc.kv     57       Get_Argument(1, Arg1); 
ffa_ch4_ffacalc.kv     58       Get_Argument(2, Arg2); 
ffa_ch4_ffacalc.kv     59       
ffa_ch4_ffacalc.kv     60       
ffa_ch4_ffacalc.kv     61       Width  := Positive'Value(Arg1);
ffa_ch4_ffacalc.kv     62       Height := Positive'Value(Arg2);
ffa_ch4_ffacalc.kv     63    exception
ffa_ch4_ffacalc.kv     64       when others =>
ffa_ch4_ffacalc.kv     65          Eggog("Invalid arguments!");
ffa_ch4_ffacalc.kv     66    end;
ffa_ch4_ffacalc.kv     67    
ffa_ch4_ffacalc.kv     68    
ffa_ch4_ffacalc.kv     69    if not FZ_Valid_Bitness_P(Width) then
ffa_ch4_ffacalc.kv     70       Eggog("Invalid Width: " & FZ_Validity_Rule_Doc);
ffa_ch4_ffacalc.kv     71    end if;
ffa_ch4_ffacalc.kv     72    
ffa_ch4_ffacalc.kv     73    
ffa_ch4_ffacalc.kv     74    declare
ffa_ch4_ffacalc.kv     75       
ffa_ch4_ffacalc.kv     76       
ffa_ch4_ffacalc.kv     77       Wordness : Indices := Indices(Width / Bitness);
ffa_ch4_ffacalc.kv     78       
ffa_ch4_ffacalc.kv     79       
ffa_ch4_ffacalc.kv     80       
ffa_ch4_ffacalc.kv     81       
ffa_ch4_ffacalc.kv     82       
ffa_ch4_ffacalc.kv     83       subtype Stack_Positions is Natural range 0 .. Height;
ffa_ch4_ffacalc.kv     84       type Stacks is array(Stack_Positions range <>) of FZ(1 .. Wordness);
ffa_ch4_ffacalc.kv     85       Stack      : Stacks(Stack_Positions'Range);
ffa_ch4_ffacalc.kv     86       
ffa_ch4_ffacalc.kv     87       
ffa_ch4_ffacalc.kv     88       SP         : Stack_Positions := Stack_Positions'First;
ffa_ch4_ffacalc.kv     89       
ffa_ch4_ffacalc.kv     90       
ffa_ch4_ffacalc.kv     91       Flag       : WBool   := 0;
ffa_ch4_ffacalc.kv     92       
ffa_ch4_ffacalc.kv     93       
ffa_ch4_ffacalc.kv     94       Pos        : Natural := 0;
ffa_ch4_ffacalc.kv     95       
ffa_ch4_ffacalc.kv     96       
ffa_ch4_ffacalc.kv     97       QuoteLevel : Natural := 0;
ffa_ch4_ffacalc.kv     98       CommLevel  : Natural := 0;
ffa_ch4_ffacalc.kv     99       CondLevel  : Natural := 0;
ffa_ch4_ffacalc.kv    100       
ffa_ch4_ffacalc.kv    101       
ffa_ch4_ffacalc.kv    102       
ffa_ch4_ffacalc.kv    103       
ffa_ch4_ffacalc.kv    104       procedure Zap is
ffa_ch4_ffacalc.kv    105       begin
ffa_ch4_ffacalc.kv    106          
ffa_ch4_ffacalc.kv    107          for i in Stack'Range loop
ffa_ch4_ffacalc.kv    108             FZ_Clear(Stack(i));
ffa_ch4_ffacalc.kv    109          end loop;
ffa_ch4_ffacalc.kv    110          
ffa_ch4_ffacalc.kv    111          SP   := Stack_Positions'First;
ffa_ch4_ffacalc.kv    112          
ffa_ch4_ffacalc.kv    113          Flag := 0;
ffa_ch4_ffacalc.kv    114       end Zap;
ffa_ch4_ffacalc.kv    115       
ffa_ch4_ffacalc.kv    116       
ffa_ch4_ffacalc.kv    117       
ffa_ch4_ffacalc.kv    118       procedure E(S : in String) is
ffa_ch4_ffacalc.kv    119       begin
ffa_ch4_ffacalc.kv    120          Eggog("Pos:" & Natural'Image(Pos) & ": " & S);
ffa_ch4_ffacalc.kv    121       end E;
ffa_ch4_ffacalc.kv    122       
ffa_ch4_ffacalc.kv    123       
ffa_ch4_ffacalc.kv    124       
ffa_ch4_ffacalc.kv    125       procedure Push is
ffa_ch4_ffacalc.kv    126       begin
ffa_ch4_ffacalc.kv    127          if SP = Stack_Positions'Last then
ffa_ch4_ffacalc.kv    128             E("Stack Overflow!");
ffa_ch4_ffacalc.kv    129          else
ffa_ch4_ffacalc.kv    130             SP := SP + 1;
ffa_ch4_ffacalc.kv    131          end if;
ffa_ch4_ffacalc.kv    132       end Push;
ffa_ch4_ffacalc.kv    133       
ffa_ch4_ffacalc.kv    134       
ffa_ch4_ffacalc.kv    135       
ffa_ch4_ffacalc.kv    136       procedure Drop is
ffa_ch4_ffacalc.kv    137       begin
ffa_ch4_ffacalc.kv    138          FZ_Clear(Stack(SP));
ffa_ch4_ffacalc.kv    139          SP := SP - 1;
ffa_ch4_ffacalc.kv    140       end Drop;
ffa_ch4_ffacalc.kv    141       
ffa_ch4_ffacalc.kv    142       
ffa_ch4_ffacalc.kv    143       
ffa_ch4_ffacalc.kv    144       procedure Want(N : in Positive) is
ffa_ch4_ffacalc.kv    145       begin
ffa_ch4_ffacalc.kv    146          if SP < N then
ffa_ch4_ffacalc.kv    147             E("Stack Underflow!");
ffa_ch4_ffacalc.kv    148          end if;
ffa_ch4_ffacalc.kv    149       end Want;
ffa_ch4_ffacalc.kv    150       
ffa_ch4_ffacalc.kv    151       
ffa_ch5_egypt.kv      152       
ffa_ch5_egypt.kv      153       procedure MustNotZero(D : in FZ) is
ffa_ch5_egypt.kv      154       begin
ffa_ch5_egypt.kv      155          if FZ_ZeroP(D) = 1 then
ffa_ch5_egypt.kv      156             E("Division by Zero!");
ffa_ch5_egypt.kv      157          end if;
ffa_ch5_egypt.kv      158       end MustNotZero;
ffa_ch5_egypt.kv      159       
ffa_ch5_egypt.kv      160       
ffa_ch4_ffacalc.kv    161       
ffa_ch4_ffacalc.kv    162       procedure Ins_Hex_Digit(N : in out FZ;
ffa_ch4_ffacalc.kv    163                               D : in Nibble) is
ffa_ch4_ffacalc.kv    164          Overflow : Word := 0;
ffa_ch4_ffacalc.kv    165       begin
ffa_ch4_ffacalc.kv    166          
ffa_ch4_ffacalc.kv    167          FZ_ShiftLeft_O(N        => N,
ffa_ch4_ffacalc.kv    168                         ShiftedN => N,
ffa_ch4_ffacalc.kv    169                         Count    => 4,
ffa_ch4_ffacalc.kv    170                         Overflow => Overflow);
ffa_ch4_ffacalc.kv    171          
ffa_ch4_ffacalc.kv    172          
ffa_ch4_ffacalc.kv    173          if W_NZeroP(Overflow) = 1 then
ffa_ch4_ffacalc.kv    174             E("Constant Exceeds Bitness!");
ffa_ch4_ffacalc.kv    175          end if;
ffa_ch4_ffacalc.kv    176          
ffa_ch4_ffacalc.kv    177          
ffa_ch4_ffacalc.kv    178          FZ_Or_W(N, D);
ffa_ch4_ffacalc.kv    179       end;
ffa_ch4_ffacalc.kv    180       
ffa_ch4_ffacalc.kv    181       
ffa_ch4_ffacalc.kv    182       
ffa_ch4_ffacalc.kv    183       procedure Op_Normal(C : in Character) is
ffa_ch4_ffacalc.kv    184          
ffa_ch4_ffacalc.kv    185          
ffa_ch4_ffacalc.kv    186          F : Word;
ffa_ch4_ffacalc.kv    187          
ffa_ch4_ffacalc.kv    188       begin
ffa_ch4_ffacalc.kv    189          
ffa_ch4_ffacalc.kv    190          case C is
ffa_ch4_ffacalc.kv    191             
ffa_ch4_ffacalc.kv    192             
ffa_ch4_ffacalc.kv    193             
ffa_ch4_ffacalc.kv    194             
ffa_ch4_ffacalc.kv    195             
ffa_ch4_ffacalc.kv    196             when '(' =>
ffa_ch4_ffacalc.kv    197                CommLevel := 1;
ffa_ch4_ffacalc.kv    198                
ffa_ch4_ffacalc.kv    199                
ffa_ch4_ffacalc.kv    200             when ')' =>
ffa_ch4_ffacalc.kv    201                E("Mismatched close-comment parenthesis !");
ffa_ch4_ffacalc.kv    202                
ffa_ch4_ffacalc.kv    203                
ffa_ch4_ffacalc.kv    204             when '[' =>
ffa_ch4_ffacalc.kv    205                QuoteLevel := 1;
ffa_ch4_ffacalc.kv    206                
ffa_ch4_ffacalc.kv    207                
ffa_ch4_ffacalc.kv    208             when ']' =>
ffa_ch4_ffacalc.kv    209                E("Mismatched close-quote bracket !");
ffa_ch4_ffacalc.kv    210                
ffa_ch4_ffacalc.kv    211                
ffa_ch4_ffacalc.kv    212             when '{' =>
ffa_ch4_ffacalc.kv    213                Want(1);
ffa_ch4_ffacalc.kv    214                if FZ_ZeroP(Stack(SP)) = 1 then
ffa_ch4_ffacalc.kv    215                   CondLevel := 1;
ffa_ch4_ffacalc.kv    216                end if;
ffa_ch4_ffacalc.kv    217                Drop;
ffa_ch4_ffacalc.kv    218                
ffa_ch4_ffacalc.kv    219                
ffa_ch4_ffacalc.kv    220                
ffa_ch4_ffacalc.kv    221             when '}' =>
ffa_ch4_ffacalc.kv    222                Push;
ffa_ch4_ffacalc.kv    223                WBool_To_FZ(0, Stack(SP));
ffa_ch4_ffacalc.kv    224                
ffa_ch4_ffacalc.kv    225                
ffa_ch4_ffacalc.kv    226                
ffa_ch4_ffacalc.kv    227                
ffa_ch4_ffacalc.kv    228                
ffa_ch4_ffacalc.kv    229                
ffa_ch4_ffacalc.kv    230                
ffa_ch4_ffacalc.kv    231                
ffa_ch4_ffacalc.kv    232             when '0' .. '9' =>
ffa_ch4_ffacalc.kv    233                Want(1);
ffa_ch4_ffacalc.kv    234                Ins_Hex_Digit(Stack(SP),
ffa_ch4_ffacalc.kv    235                              Character'Pos(C) - Character'Pos('0'));
ffa_ch4_ffacalc.kv    236                
ffa_ch4_ffacalc.kv    237             when 'A' .. 'F' =>
ffa_ch4_ffacalc.kv    238                Want(1);
ffa_ch4_ffacalc.kv    239                Ins_Hex_Digit(Stack(SP),
ffa_ch4_ffacalc.kv    240                              10 + Character'Pos(C) - Character'Pos('A'));
ffa_ch4_ffacalc.kv    241                
ffa_ch4_ffacalc.kv    242             when 'a' .. 'f' =>
ffa_ch4_ffacalc.kv    243                Want(1);
ffa_ch4_ffacalc.kv    244                Ins_Hex_Digit(Stack(SP),
ffa_ch4_ffacalc.kv    245                              10 + Character'Pos(C) - Character'Pos('a'));
ffa_ch4_ffacalc.kv    246                
ffa_ch4_ffacalc.kv    247                
ffa_ch4_ffacalc.kv    248                
ffa_ch4_ffacalc.kv    249                
ffa_ch4_ffacalc.kv    250                
ffa_ch4_ffacalc.kv    251                
ffa_ch4_ffacalc.kv    252             when '.' =>
ffa_ch4_ffacalc.kv    253                Push;
ffa_ch4_ffacalc.kv    254                FZ_Clear(Stack(SP));
ffa_ch4_ffacalc.kv    255                
ffa_ch4_ffacalc.kv    256                
ffa_ch4_ffacalc.kv    257             when '"' =>
ffa_ch4_ffacalc.kv    258                Want(1);
ffa_ch4_ffacalc.kv    259                Push;
ffa_ch4_ffacalc.kv    260                Stack(SP) := Stack(SP - 1);
ffa_ch4_ffacalc.kv    261                
ffa_ch4_ffacalc.kv    262                
ffa_ch4_ffacalc.kv    263             when '_' =>
ffa_ch4_ffacalc.kv    264                Want(1);
ffa_ch4_ffacalc.kv    265                Drop;
ffa_ch4_ffacalc.kv    266                
ffa_ch4_ffacalc.kv    267                
ffa_ch4_ffacalc.kv    268             when ''' =>
ffa_ch4_ffacalc.kv    269                Want(2);
ffa_ch4_ffacalc.kv    270                FZ_Swap(Stack(SP), Stack(SP - 1));
ffa_ch4_ffacalc.kv    271                
ffa_ch4_ffacalc.kv    272                
ffa_ch4_ffacalc.kv    273             when '`' =>
ffa_ch4_ffacalc.kv    274                Want(2);
ffa_ch4_ffacalc.kv    275                Push;
ffa_ch4_ffacalc.kv    276                Stack(SP) := Stack(SP - 2);
ffa_ch4_ffacalc.kv    277                
ffa_ch4_ffacalc.kv    278                
ffa_ch4_ffacalc.kv    279                
ffa_ch4_ffacalc.kv    280                
ffa_ch4_ffacalc.kv    281                
ffa_ch4_ffacalc.kv    282                
ffa_ch4_ffacalc.kv    283             when '=' =>
ffa_ch4_ffacalc.kv    284                Want(2);
ffa_ch4_ffacalc.kv    285                WBool_To_FZ(FZ_Eqp(X => Stack(SP),
ffa_ch4_ffacalc.kv    286                                   Y => Stack(SP - 1)),
ffa_ch4_ffacalc.kv    287                            Stack(SP - 1));
ffa_ch4_ffacalc.kv    288                Drop;
ffa_ch4_ffacalc.kv    289                
ffa_ch4_ffacalc.kv    290                
ffa_ch4_ffacalc.kv    291             when '<' =>
ffa_ch4_ffacalc.kv    292                Want(2);
ffa_ch4_ffacalc.kv    293                WBool_To_FZ(FZ_LessThanP(X => Stack(SP - 1),
ffa_ch4_ffacalc.kv    294                                         Y => Stack(SP)),
ffa_ch4_ffacalc.kv    295                            Stack(SP - 1));
ffa_ch4_ffacalc.kv    296                Drop;
ffa_ch4_ffacalc.kv    297                
ffa_ch4_ffacalc.kv    298                
ffa_ch4_ffacalc.kv    299             when '>' =>
ffa_ch4_ffacalc.kv    300                Want(2);
ffa_ch4_ffacalc.kv    301                WBool_To_FZ(FZ_GreaterThanP(X => Stack(SP - 1),
ffa_ch4_ffacalc.kv    302                                            Y => Stack(SP)),
ffa_ch4_ffacalc.kv    303                            Stack(SP - 1));
ffa_ch4_ffacalc.kv    304                Drop;
ffa_ch4_ffacalc.kv    305                
ffa_ch4_ffacalc.kv    306                
ffa_ch4_ffacalc.kv    307                
ffa_ch4_ffacalc.kv    308                
ffa_ch4_ffacalc.kv    309                
ffa_ch4_ffacalc.kv    310                
ffa_ch4_ffacalc.kv    311             when '-' =>
ffa_ch4_ffacalc.kv    312                Want(2);
ffa_ch4_ffacalc.kv    313                FZ_Sub(X          => Stack(SP - 1),
ffa_ch4_ffacalc.kv    314                       Y          => Stack(SP),
ffa_ch4_ffacalc.kv    315                       Difference => Stack(SP - 1),
ffa_ch4_ffacalc.kv    316                       Underflow  => F);
ffa_ch4_ffacalc.kv    317                Flag := W_NZeroP(F);
ffa_ch4_ffacalc.kv    318                Drop;
ffa_ch4_ffacalc.kv    319                
ffa_ch4_ffacalc.kv    320                
ffa_ch4_ffacalc.kv    321             when '+' =>
ffa_ch4_ffacalc.kv    322                Want(2);
ffa_ch4_ffacalc.kv    323                FZ_Add(X        => Stack(SP - 1),
ffa_ch4_ffacalc.kv    324                       Y        => Stack(SP),
ffa_ch4_ffacalc.kv    325                       Sum      => Stack(SP - 1),
ffa_ch4_ffacalc.kv    326                       Overflow => F);
ffa_ch4_ffacalc.kv    327                Flag := W_NZeroP(F);
ffa_ch4_ffacalc.kv    328                Drop;
ffa_ch4_ffacalc.kv    329                
ffa_ch5_egypt.kv      330                
ffa_ch5_egypt.kv      331             when '\' =>
ffa_ch5_egypt.kv      332                Want(2);
ffa_ch5_egypt.kv      333                MustNotZero(Stack(SP));
ffa_ch5_egypt.kv      334                FZ_IDiv(Dividend  => Stack(SP - 1),
ffa_ch5_egypt.kv      335                        Divisor   => Stack(SP),
ffa_ch5_egypt.kv      336                        Quotient  => Stack(SP - 1),
ffa_ch5_egypt.kv      337                        Remainder => Stack(SP));
ffa_ch5_egypt.kv      338                
ffa_ch5_egypt.kv      339                
ffa_ch5_egypt.kv      340             when '/' =>
ffa_ch5_egypt.kv      341                Want(2);
ffa_ch5_egypt.kv      342                MustNotZero(Stack(SP));
ffa_ch5_egypt.kv      343                FZ_Div(Dividend  => Stack(SP - 1),
ffa_ch5_egypt.kv      344                       Divisor   => Stack(SP),
ffa_ch5_egypt.kv      345                       Quotient  => Stack(SP - 1));
ffa_ch5_egypt.kv      346                Drop;
ffa_ch5_egypt.kv      347                
ffa_ch5_egypt.kv      348                
ffa_ch5_egypt.kv      349             when '%' =>
ffa_ch5_egypt.kv      350                Want(2);
ffa_ch5_egypt.kv      351                MustNotZero(Stack(SP));
ffa_ch5_egypt.kv      352                FZ_Mod(Dividend  => Stack(SP - 1),
ffa_ch5_egypt.kv      353                       Divisor   => Stack(SP),
ffa_ch5_egypt.kv      354                       Remainder => Stack(SP - 1));
ffa_ch5_egypt.kv      355                Drop;
ffa_ch5_egypt.kv      356                
ffa_ch5_egypt.kv      357                
ffa_ch5_egypt.kv      358             when '*' =>
ffa_ch5_egypt.kv      359                Want(2);
ffa_ch5_egypt.kv      360                MustNotZero(Stack(SP));
ffa_ch5_egypt.kv      361                
ffa_ch5_egypt.kv      362                FZ_Mul_Egyptian(X     => Stack(SP - 1),
ffa_ch5_egypt.kv      363                                Y     => Stack(SP),
ffa_ch5_egypt.kv      364                                XY_Lo => Stack(SP - 1),
ffa_ch5_egypt.kv      365                                XY_Hi => Stack(SP));
ffa_ch5_egypt.kv      366                
ffa_ch4_ffacalc.kv    367                
ffa_ch4_ffacalc.kv    368                
ffa_ch4_ffacalc.kv    369                
ffa_ch4_ffacalc.kv    370                
ffa_ch4_ffacalc.kv    371                
ffa_ch4_ffacalc.kv    372             when '&' =>
ffa_ch4_ffacalc.kv    373                Want(2);
ffa_ch4_ffacalc.kv    374                FZ_And(X      => Stack(SP - 1),
ffa_ch4_ffacalc.kv    375                       Y      => Stack(SP),
ffa_ch4_ffacalc.kv    376                       Result => Stack(SP - 1));
ffa_ch4_ffacalc.kv    377                Drop;
ffa_ch4_ffacalc.kv    378                
ffa_ch4_ffacalc.kv    379                
ffa_ch4_ffacalc.kv    380             when '|' =>
ffa_ch4_ffacalc.kv    381                Want(2);
ffa_ch4_ffacalc.kv    382                FZ_Or(X      => Stack(SP - 1),
ffa_ch4_ffacalc.kv    383                      Y      => Stack(SP),
ffa_ch4_ffacalc.kv    384                      Result => Stack(SP - 1));
ffa_ch4_ffacalc.kv    385                Drop;
ffa_ch4_ffacalc.kv    386                
ffa_ch4_ffacalc.kv    387                
ffa_ch4_ffacalc.kv    388             when '^' =>
ffa_ch4_ffacalc.kv    389                Want(2);
ffa_ch4_ffacalc.kv    390                FZ_Xor(X      => Stack(SP - 1),
ffa_ch4_ffacalc.kv    391                       Y      => Stack(SP),
ffa_ch4_ffacalc.kv    392                       Result => Stack(SP - 1));
ffa_ch4_ffacalc.kv    393                Drop;
ffa_ch4_ffacalc.kv    394                
ffa_ch4_ffacalc.kv    395                
ffa_ch4_ffacalc.kv    396             when '~' =>
ffa_ch4_ffacalc.kv    397                Want(1);
ffa_ch4_ffacalc.kv    398                FZ_Not(Stack(SP), Stack(SP));
ffa_ch4_ffacalc.kv    399                
ffa_ch4_ffacalc.kv    400                
ffa_ch4_ffacalc.kv    401                
ffa_ch4_ffacalc.kv    402                
ffa_ch4_ffacalc.kv    403                
ffa_ch4_ffacalc.kv    404                
ffa_ch4_ffacalc.kv    405             when 'U' =>
ffa_ch4_ffacalc.kv    406                Want(3);
ffa_ch4_ffacalc.kv    407                FZ_Mux(X      => Stack(SP - 2),
ffa_ch4_ffacalc.kv    408                       Y      => Stack(SP - 1),
ffa_ch4_ffacalc.kv    409                       Result => Stack(SP - 2),
ffa_ch4_ffacalc.kv    410                       Sel    => FZ_NZeroP(Stack(SP)));
ffa_ch4_ffacalc.kv    411                Drop;
ffa_ch4_ffacalc.kv    412                Drop;
ffa_ch4_ffacalc.kv    413                
ffa_ch4_ffacalc.kv    414                
ffa_ch4_ffacalc.kv    415             when 'O' =>
ffa_ch4_ffacalc.kv    416                Push;
ffa_ch4_ffacalc.kv    417                WBool_To_FZ(Flag, Stack(SP));
ffa_ch4_ffacalc.kv    418                
ffa_ch4_ffacalc.kv    419                
ffa_ch4_ffacalc.kv    420             when '#' =>
ffa_ch4_ffacalc.kv    421                Want(1);
ffa_ch4_ffacalc.kv    422                Dump(Stack(SP));
ffa_ch4_ffacalc.kv    423                Drop;
ffa_ch4_ffacalc.kv    424                
ffa_ch4_ffacalc.kv    425                
ffa_ch4_ffacalc.kv    426             when 'Z' =>
ffa_ch4_ffacalc.kv    427                Zap;
ffa_ch4_ffacalc.kv    428                
ffa_ch4_ffacalc.kv    429                
ffa_ch4_ffacalc.kv    430             when 'Q' =>
ffa_ch4_ffacalc.kv    431                for I in reverse Stack'First + 1 .. SP loop
ffa_ch4_ffacalc.kv    432                   Dump(Stack(I));
ffa_ch4_ffacalc.kv    433                end loop;
ffa_ch4_ffacalc.kv    434                Quit(0);
ffa_ch4_ffacalc.kv    435                
ffa_ch4_ffacalc.kv    436                
ffa_ch4_ffacalc.kv    437                
ffa_ch4_ffacalc.kv    438                
ffa_ch4_ffacalc.kv    439                
ffa_ch4_ffacalc.kv    440                
ffa_ch4_ffacalc.kv    441             when others =>
ffa_ch4_ffacalc.kv    442                null;
ffa_ch4_ffacalc.kv    443                
ffa_ch4_ffacalc.kv    444          end case;
ffa_ch4_ffacalc.kv    445          
ffa_ch4_ffacalc.kv    446       end Op_Normal;
ffa_ch4_ffacalc.kv    447       
ffa_ch4_ffacalc.kv    448       
ffa_ch4_ffacalc.kv    449       
ffa_ch4_ffacalc.kv    450       procedure Op(C : in Character) is
ffa_ch4_ffacalc.kv    451       begin
ffa_ch4_ffacalc.kv    452          
ffa_ch4_ffacalc.kv    453          
ffa_ch4_ffacalc.kv    454          
ffa_ch4_ffacalc.kv    455          if CommLevel > 0 then
ffa_ch4_ffacalc.kv    456             case C is
ffa_ch4_ffacalc.kv    457                when ')' =>  
ffa_ch4_ffacalc.kv    458                   CommLevel := CommLevel - 1;
ffa_ch4_ffacalc.kv    459                when '(' =>  
ffa_ch4_ffacalc.kv    460                   CommLevel := CommLevel + 1;
ffa_ch4_ffacalc.kv    461                when others =>
ffa_ch4_ffacalc.kv    462                   null; 
ffa_ch4_ffacalc.kv    463             end case;
ffa_ch4_ffacalc.kv    464             
ffa_ch4_ffacalc.kv    465             
ffa_ch4_ffacalc.kv    466          elsif QuoteLevel > 0 then
ffa_ch4_ffacalc.kv    467             case C is
ffa_ch4_ffacalc.kv    468                when ']' =>   
ffa_ch4_ffacalc.kv    469                   QuoteLevel := QuoteLevel - 1;
ffa_ch4_ffacalc.kv    470                when '[' =>   
ffa_ch4_ffacalc.kv    471                   QuoteLevel := QuoteLevel + 1;
ffa_ch4_ffacalc.kv    472                when others =>
ffa_ch4_ffacalc.kv    473                   null; 
ffa_ch4_ffacalc.kv    474             end case;
ffa_ch4_ffacalc.kv    475             
ffa_ch4_ffacalc.kv    476             
ffa_ch4_ffacalc.kv    477             if QuoteLevel > 0 then
ffa_ch4_ffacalc.kv    478                Write_Char(C);
ffa_ch4_ffacalc.kv    479             end if;
ffa_ch4_ffacalc.kv    480             
ffa_ch4_ffacalc.kv    481             
ffa_ch4_ffacalc.kv    482          elsif CondLevel > 0 then
ffa_ch4_ffacalc.kv    483             case C is
ffa_ch4_ffacalc.kv    484                when '}' =>   
ffa_ch4_ffacalc.kv    485                   CondLevel := CondLevel - 1;
ffa_ch4_ffacalc.kv    486                   
ffa_ch4_ffacalc.kv    487                   
ffa_ch4_ffacalc.kv    488                   
ffa_ch4_ffacalc.kv    489                   if CondLevel = 0 then
ffa_ch4_ffacalc.kv    490                      Push;
ffa_ch4_ffacalc.kv    491                      WBool_To_FZ(1, Stack(SP));
ffa_ch4_ffacalc.kv    492                   end if;
ffa_ch4_ffacalc.kv    493                   
ffa_ch4_ffacalc.kv    494                when '{' =>   
ffa_ch4_ffacalc.kv    495                   CondLevel := CondLevel + 1;
ffa_ch4_ffacalc.kv    496                when others =>
ffa_ch4_ffacalc.kv    497                   null; 
ffa_ch4_ffacalc.kv    498             end case;
ffa_ch4_ffacalc.kv    499          else
ffa_ch4_ffacalc.kv    500             
ffa_ch4_ffacalc.kv    501             Op_Normal(C);
ffa_ch4_ffacalc.kv    502          end if;
ffa_ch4_ffacalc.kv    503          
ffa_ch4_ffacalc.kv    504       end Op;
ffa_ch4_ffacalc.kv    505       
ffa_ch4_ffacalc.kv    506       
ffa_ch4_ffacalc.kv    507       
ffa_ch4_ffacalc.kv    508       C : Character;
ffa_ch4_ffacalc.kv    509       
ffa_ch4_ffacalc.kv    510    begin
ffa_ch4_ffacalc.kv    511       
ffa_ch4_ffacalc.kv    512       Zap;
ffa_ch4_ffacalc.kv    513       
ffa_ch4_ffacalc.kv    514       loop
ffa_ch4_ffacalc.kv    515          if Read_Char(C) then
ffa_ch4_ffacalc.kv    516             
ffa_ch4_ffacalc.kv    517             Op(C);
ffa_ch4_ffacalc.kv    518             
ffa_ch4_ffacalc.kv    519             Pos := Pos + 1;
ffa_ch4_ffacalc.kv    520          else
ffa_ch4_ffacalc.kv    521             Zap;
ffa_ch4_ffacalc.kv    522             Quit(0); 
ffa_ch4_ffacalc.kv    523          end if;
ffa_ch4_ffacalc.kv    524       end loop;
ffa_ch4_ffacalc.kv    525    end;
ffa_ch4_ffacalc.kv    526    
ffa_ch4_ffacalc.kv    527 end FFA_Calc;