home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / programming / misc_programming / AGUL / SCREEN.ADB < prev    next >
Encoding:
Text File  |  1990-10-25  |  8.4 KB  |  271 lines

  1. --        ╔═════════════════════════════════════════════════════════════╗
  2. --        ║█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█║
  3. --        ║█                                                           █║
  4. --        ║█                 Meridian Software Systems                 █║
  5. --        ║█                                                           █║
  6. --        ║█                    Copyright (C)  1990                    █║
  7. --        ║█                                                           █║
  8. --        ║█                    ALL RIGHTS RESERVED                    █║
  9. --        ║█                                                           █║
  10. --        ║█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█║
  11. --        ╚═════════════════════════════════════════════════════════════╝
  12.  
  13. ------------------------------------------------------------------------------
  14. --
  15. --  Unit Name:  Screen - package specification
  16. --
  17. --  Purpose of unit :  Package Screen performs selection of the active graphics
  18. --                     page, swapping of graphics pages, and copying of one
  19. --                     graphics page to another graphics page.  Package Screen
  20. --                     also performs the save and load operations of graphics
  21. --                     screens to and from disk files.
  22. --
  23. ------------------------------------------------------------------------------
  24.  
  25. with INTERRUPT, MOVEASM, PORT, WINDOW_IO, SPY, SYSTEM, VIDEO;
  26. with BIT_OPS, COMMON_GRAPHIC_TYPES;
  27. use  BIT_OPS, COMMON_GRAPHIC_TYPES;
  28.  
  29. package body SCREEN is
  30.  
  31.   BYTE_RECORD : WINDOW_IO.BYTE_REC;
  32.   INT_NUMBER  : INTERRUPT.INTERRUPT_RANGE;
  33.   REGISTER    : INTERRUPT.REGISTERS;
  34.   INDEX       : integer;
  35.  
  36.   --╔════════════════════════════════════════════════════════════════════════╗
  37.  
  38.   procedure SELECT_SCREEN ( New_page : DISPLAY_PAGE ) is
  39.   begin
  40.     if SCREEN_FLAG then
  41.       ACTIVE_PAGE := New_page;
  42.       CURRENT_VIDEO_PAGE := New_page;
  43.     end if;
  44.   end SELECT_SCREEN;
  45.  
  46.   --╚════════════════════════════════════════════════════════════════════════╝
  47.  
  48.   --╔════════════════════════════════════════════════════════════════════════╗
  49.  
  50.   procedure COPY_SCREEN is
  51.   begin
  52.     if ACTIVE_PAGE = 0 then
  53.       MOVEASM.COPY_SCREEN(0);
  54.     else
  55.       MOVEASM.COPY_SCREEN(1);
  56.     end if;
  57.   end COPY_SCREEN;
  58.  
  59.   --╚════════════════════════════════════════════════════════════════════════╝
  60.  
  61.   --╔════════════════════════════════════════════════════════════════════════╗
  62.  
  63.   procedure SWAP_SCREEN is
  64.   begin
  65.     if SCREEN_FLAG then
  66.       if CURRENT_PAGE = 0 then
  67.         CURRENT_PAGE := 1;
  68.  
  69.         -- change video page to 1
  70.         REGISTER.AX := 16#0501#;
  71.         REGISTER.BX := 16#0000#;
  72.         REGISTER.CX := 16#0000#;
  73.         REGISTER.DX := 16#0000#;
  74.  
  75.         -- Call interrupt 10h
  76.     INTERRUPT.VECTOR (ON             => 16#0010#,
  77.               REGISTER_BLOCK => REGISTER);
  78.       else
  79.         CURRENT_PAGE := 0;
  80.  
  81.         -- change video page to 0
  82.         REGISTER.AX := 16#0500#;
  83.         REGISTER.BX := 16#0000#;
  84.         REGISTER.CX := 16#0000#;
  85.         REGISTER.DX := 16#0000#;
  86.  
  87.         -- Call interrupt 10h
  88.     INTERRUPT.VECTOR (ON             => 16#0010#,
  89.               REGISTER_BLOCK => REGISTER);
  90.       end if;
  91.     end if;
  92.   end SWAP_SCREEN;
  93.  
  94.   --╚════════════════════════════════════════════════════════════════════════╝
  95.  
  96.   --╔════════════════════════════════════════════════════════════════════════╗
  97.  
  98.   procedure SAVE_SCREEN ( FILENAME : string ) is
  99.     BYTES_PER_ROW,
  100.     NUMBER_OF_BYTES,
  101.     SYSTEM_ADDRESS   : long_integer;
  102.     COUNT            : integer := 1;
  103.     INDEX            : integer := 0;
  104.   begin
  105.     if GRAPH_SCREEN = 14 then
  106.       BYTES_PER_ROW := 40;
  107.     else
  108.       BYTES_PER_ROW := 80;
  109.     end if;
  110.  
  111.     NUMBER_OF_BYTES := BYTES_PER_ROW;
  112.  
  113.     if not WINDOW_IO.CREATE( FILE_NAME => FILENAME ) then
  114.       return;
  115.     end if;
  116.  
  117.     if GRAPH_SCREEN >= 4 and GRAPH_SCREEN <= 6 then
  118.       SYSTEM_ADDRESS := PAGE1_MEMORY_START;
  119.  
  120.       for I in 0 .. ( integer(SCREEN_DIMENSION_LOWER_RIGHT_Y / 2) + 1) loop
  121.         INDEX := 1;
  122.         for J in 1 .. (2 * NUMBER_OF_BYTES) loop
  123.       BYTE_RECORD.BYTE_ARRAY(INDEX) :=
  124.           SPY.PEEK(SYSTEM.ADDRESS(SYSTEM_ADDRESS));
  125.           BYTE_RECORD.BYTE_ARRAY(INDEX) :=
  126.           SHL(BYTE_RECORD.BYTE_ARRAY(INDEX), 8);
  127.           SYSTEM_ADDRESS := SYSTEM_ADDRESS + 1;
  128.       BYTE_RECORD.BYTE_ARRAY(INDEX) :=
  129.           BYTE_RECORD.BYTE_ARRAY(INDEX) +
  130.           SPY.PEEK(SYSTEM.ADDRESS(SYSTEM_ADDRESS));
  131.           SYSTEM_ADDRESS := SYSTEM_ADDRESS + 1;
  132.           INDEX := INDEX + 1;
  133.         end loop;
  134.     if not WINDOW_IO.WRITE( REC => BYTE_RECORD ) then
  135.       return;
  136.     end if;
  137.         INDEX := 1;
  138.       end loop;
  139.       if not WINDOW_IO.WRITE( REC => BYTE_RECORD ) then
  140.     return;
  141.       end if;
  142.     else
  143.       if ACTIVE_PAGE = 0 then
  144.     SYSTEM_ADDRESS := PAGE1_MEMORY_START;
  145.       else
  146.     SYSTEM_ADDRESS := PAGE2_MEMORY_START;
  147.       end if;
  148.  
  149.       for I in 0 .. SCREEN_DIMENSION_LOWER_RIGHT_Y loop
  150.         for J in 1 .. 80 loop
  151.           INDEX := INDEX + 1;
  152.           PORT.OUT_WORD(16#03CE#, 16#0004#);
  153.       BYTE_RECORD.BYTE_ARRAY(INDEX) :=
  154.           SPY.PEEK(SYSTEM.ADDRESS(SYSTEM_ADDRESS));
  155.           PORT.OUT_WORD(16#03CE#, 16#0104#);
  156.           INDEX := INDEX + 1;
  157.       BYTE_RECORD.BYTE_ARRAY(INDEX) :=
  158.           SPY.PEEK(SYSTEM.ADDRESS(SYSTEM_ADDRESS));
  159.           PORT.OUT_WORD(16#03CE#, 16#0204#);
  160.           INDEX := INDEX + 1;
  161.       BYTE_RECORD.BYTE_ARRAY(INDEX) :=
  162.           SPY.PEEK(SYSTEM.ADDRESS(SYSTEM_ADDRESS));
  163.           PORT.OUT_WORD(16#03CE#, 16#0304#);
  164.           INDEX := INDEX + 1;
  165.       BYTE_RECORD.BYTE_ARRAY(INDEX) :=
  166.           SPY.PEEK(SYSTEM.ADDRESS(SYSTEM_ADDRESS));
  167.           SYSTEM_ADDRESS := SYSTEM_ADDRESS + 1;
  168.         end loop;
  169.         INDEX := 0;
  170.     if not WINDOW_IO.WRITE( REC => BYTE_RECORD ) then
  171.       return;
  172.     end if;
  173.       end loop;
  174.       if not WINDOW_IO.CLOSE then
  175.     null;
  176.       end if;
  177.     end if;
  178.   end SAVE_SCREEN;
  179.  
  180.   --╚════════════════════════════════════════════════════════════════════════╝
  181.  
  182.  
  183.   --╔════════════════════════════════════════════════════════════════════════╗
  184.  
  185.   procedure LOAD_SCREEN ( FILENAME : string ) is
  186.     BYTES_PER_ROW,
  187.     NUMBER_OF_BYTES,
  188.     SYSTEM_ADDRESS   : long_integer;
  189.     COUNT            : integer := 1;
  190.     INDEX            : integer := 0;
  191.     TEMP_BYTE        : SPY.byte;
  192.     GOOD             : boolean;
  193.  
  194.   begin
  195.     -- Check to see if file exists
  196.     if GRAPH_SCREEN = 14 then
  197.       BYTES_PER_ROW := 40;
  198.     else
  199.       BYTES_PER_ROW := 80;
  200.     end if;
  201.  
  202.     NUMBER_OF_BYTES := BYTES_PER_ROW;
  203.  
  204.     if not WINDOW_IO.OPEN( FILE_NAME => FILENAME ) then
  205.       return;
  206.     end if;
  207.  
  208.     if GRAPH_SCREEN >= 4 and GRAPH_SCREEN <= 6 then
  209.       SYSTEM_ADDRESS := PAGE1_MEMORY_START;
  210.  
  211.       while not WINDOW_IO.END_OF_FILE loop
  212.     WINDOW_IO.READ( REC => BYTE_RECORD, OK => GOOD );
  213.     if not GOOD then
  214.       return;
  215.     end if;
  216.         INDEX := 1;
  217.         for J in 1 .. NUMBER_OF_BYTES loop
  218.       SPY.POKE(BYTE_RECORD.BYTE_ARRAY(INDEX),
  219.            SYSTEM.ADDRESS(SYSTEM_ADDRESS));
  220.           SYSTEM_ADDRESS := SYSTEM_ADDRESS + 1;
  221.           INDEX := INDEX + 1;
  222.         end loop;
  223.       end loop;
  224.     else
  225.       if ACTIVE_PAGE = 0 then
  226.     SYSTEM_ADDRESS := PAGE1_MEMORY_START;
  227.       else
  228.     SYSTEM_ADDRESS := PAGE2_MEMORY_START;
  229.       end if;
  230.  
  231.       while not WINDOW_IO.END_OF_FILE loop
  232.     WINDOW_IO.READ( REC => BYTE_RECORD, OK => GOOD );
  233.     if not GOOD then
  234.       return;
  235.     end if;
  236.         for J in 1 .. 80 loop
  237.           PORT.OUT_WORD(16#03CE#, 16#0008#);
  238.           PORT.OUT_WORD(16#03CF#, 16#00FF#);
  239.           TEMP_BYTE := SPY.PEEK(SYSTEM.ADDRESS(SYSTEM_ADDRESS));
  240.           SPY.POKE(16#00#, SYSTEM.ADDRESS(SYSTEM_ADDRESS));
  241.           PORT.OUT_WORD(16#03C4#, 16#0002#);
  242.           PORT.OUT_WORD(16#03C5#, 16#0001#);
  243.           INDEX := INDEX + 1;
  244.           TEMP_BYTE := BYTE_RECORD.BYTE_ARRAY(INDEX);
  245.           SPY.POKE(TEMP_BYTE, SYSTEM.ADDRESS(SYSTEM_ADDRESS));
  246.           PORT.OUT_WORD(16#03C5#, 16#0002#);
  247.           INDEX := INDEX + 1;
  248.           TEMP_BYTE := BYTE_RECORD.BYTE_ARRAY(INDEX);
  249.           SPY.POKE(TEMP_BYTE, SYSTEM.ADDRESS(SYSTEM_ADDRESS));
  250.           PORT.OUT_WORD(16#03C5#, 16#0004#);
  251.           INDEX := INDEX + 1;
  252.           TEMP_BYTE := BYTE_RECORD.BYTE_ARRAY(INDEX);
  253.           SPY.POKE(TEMP_BYTE, SYSTEM.ADDRESS(SYSTEM_ADDRESS));
  254.           PORT.OUT_WORD(16#03C5#, 16#0008#);
  255.           INDEX := INDEX + 1;
  256.           TEMP_BYTE := BYTE_RECORD.BYTE_ARRAY(INDEX);
  257.           SPY.POKE(TEMP_BYTE, SYSTEM.ADDRESS(SYSTEM_ADDRESS));
  258.           SYSTEM_ADDRESS := SYSTEM_ADDRESS + 1;
  259.         end loop;
  260.         INDEX := 0;
  261.       end loop;
  262.     end if;
  263.     if not WINDOW_IO.CLOSE then
  264.       null;
  265.     end if;
  266.   end LOAD_SCREEN;
  267.  
  268.   --╚════════════════════════════════════════════════════════════════════════╝
  269.  
  270. end SCREEN;
  271.