blinkenlights_0.1.0_339e553e/src/blinkenlights.adb

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
with Ada.Exceptions;
with Ada.Integer_Text_IO;
with Ada.Text_IO;
with BBS;
with BBS.embed;
with BBS.embed.i2c;
use type BBS.embed.i2c.err_code;
with i2c;
with Panel;
with BBS.web;
with BBS.web.server;
--
--  The main routine does some initialization and then starts the
--  simulation and web server.
--
procedure blinkenlights is
   package Hex_IO is new Ada.Text_IO.Integer_IO(Integer);
   data : BBS.uint16;
   err  : BBS.embed.i2c.err_code;
   res  : i2c.result;
   selection : Integer := 0;
   internal_map : BBS.web.proc_tables.Map;
begin
   Ada.Text_IO.Put_Line("Raspberry Pi based mainframe simulator");
   loop
      Ada.Text_IO.Put_Line("Available simulators are:");
      Ada.Text_IO.Put_Line("1. Blinkenlights");
      Ada.Text_IO.Put_Line("2. Intel 8080/8085");
      Ada.Text_IO.Put_Line("3. Motorola 68000");
      Ada.Text_IO.Put("Selection: ");
      Ada.Integer_Text_IO.Get(selection, 0);
      --
      --  This is just to clear out any text on the rest of the line.
      --
      declare
         dummy : String := Ada.Text_IO.Get_line;
      begin
         null;  --  Nothing to do here.
      end;
      exit when (selection > 0) and (selection < 4);
   end loop;
   i2c.init_i2c;
   Hex_IO.Default_Width := 4;
   Hex_IO.Default_Base  := 16;
   for i in i2c.MCP23017_use loop
      if i2c.MCP23017_found(i) then
         data := i2c.MCP23017_info(i).get_data(err);
         Ada.Text_IO.Put("MCP23017(" & i2c.MCP23017_use'Image(i) &
            ") read ");
         if err /= BBS.embed.i2c.NONE then
            Ada.Text_IO.put_line("failed: " &
               BBS.embed.i2c.err_code'Image(err));
         else
            Ada.Text_IO.Put("data: ");
            Hex_IO.put(Integer(data));
            Ada.Text_IO.New_Line;
         end if;
      end if;
   end loop;
   case selection is
      when 1 =>
         Panel.CPU := Panel.sim_example'Access;
         Panel.init_sim_example;
         Ada.Text_IO.Put_Line("Blinkenlights selected.");
      when 2 =>
         Panel.CPU := Panel.sim_8080'Access;
         Panel.init_sim_8080;
         Ada.Text_IO.Put_Line("Intel 8080 selected.");
      when 3 =>
         Panel.CPU := Panel.sim_68000'Access;
         Panel.init_sim_68000;
         Ada.Text_IO.Put_Line("Motorola 68000 selected.");
      when others =>  --  Should never happen
         null;
   end case;
   Panel.run.Start;
   BBS.web.server.server(internal_map, "web/config.txt", 31415);
exception
   when error : others =>
      --
      --  Whatever else happens, turn the LEDs off.
      --
      i2c.set_addr_data(0, res);
      i2c.set_ctrl(0, res);
      Ada.Text_IO.Put_Line("Unexpected exeption in simulator: " &
                             Ada.Exceptions.Exception_Information(error));
      raise;
end blinkenlights;