Advertisement
Guest User

Untitled

a guest
Mar 20th, 2022
637
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.49 KB | None | 0 0
  1. // __________________________
  2. // ██▀█▀██▀▀▀█▀▀█▀█  ▄▄▄ ▄▄  │   ▄▄▄                ▄▄      
  3. // █  ▄ █▄ ▀██▄ ▀▄█ ██   ██  │  ▀█▄  ▄▀██ ▄█▄█ ██▀▄ ██  ▄███
  4. // █  █ █▀▀ ▄█  █ █ ▀█▄█ ██▄▄│  ▄▄█▀ ▀▄██ ██ █ ██▀  ▀█▄ ▀█▄▄
  5. // ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀──────────┘                 ▀▀
  6. //  Simple scroller using 16x16 metatiles
  7. //─────────────────────────────────────────────────────────────────────────────
  8.  
  9. //=============================================================================
  10. // INCLUDES
  11. //=============================================================================
  12. #include "msxgl.h"
  13.  
  14. //=============================================================================
  15. // READ-ONLY DATA
  16. //=============================================================================
  17.  
  18. // Data table
  19. const unsigned char s_tiles[] =
  20. {
  21.     // brick
  22.  
  23.     0b00000001,
  24.     0b00000001,
  25.     0b00000001,
  26.     0b11111111,
  27.     0b00010000,
  28.     0b00010000,
  29.     0b00010000,
  30.     0b11111111,
  31.  
  32.     //block 1
  33.    
  34.     0b01111111,
  35.     0b10111111,
  36.     0b11011111,
  37.     0b11101010,
  38.     0b11110101,
  39.     0b11101010,
  40.     0b11110101,
  41.     0b11101010,
  42.  
  43.     0b11111110,
  44.     0b11111100,
  45.     0b11111000,
  46.     0b10101000,
  47.     0b01010000,
  48.     0b10101000,
  49.     0b01010000,
  50.     0b10101000,
  51.  
  52.     0b11110101,
  53.     0b11101010,
  54.     0b11110101,
  55.     0b11101010,
  56.     0b11110101,
  57.     0b11100000,
  58.     0b11000000,
  59.     0b10000000,
  60.  
  61.     0b01010000,
  62.     0b10101000,
  63.     0b01010000,
  64.     0b10101000,
  65.     0b01010000,
  66.     0b00000100,
  67.     0b00000010,
  68.     0b00000001,    
  69.    
  70.     //block 2
  71.    
  72.     0b11111111,
  73.     0b11010101,
  74.     0b10101010,
  75.     0b11010101,
  76.     0b10101010,
  77.     0b11010101,
  78.     0b10101010,
  79.     0b11010101,
  80.    
  81.     0b10111110,
  82.     0b00110100,
  83.     0b10101010,
  84.     0b00110100,
  85.     0b10101010,
  86.     0b00000001,
  87.     0b10111110,
  88.     0b00110100,
  89.    
  90.     0b10101010,
  91.     0b11010101,
  92.     0b00101010,
  93.     0b11000101,
  94.     0b10110000,
  95.     0b11011110,
  96.     0b10101010,
  97.     0b00000001,
  98.    
  99.     0b10101010,
  100.     0b00110100,
  101.     0b01101010,
  102.     0b11010100,
  103.     0b10101010,
  104.     0b11010100,
  105.     0b10101000,
  106.     0b10000000,    
  107. };
  108.  
  109. // 16x16 metatiles are made of 4 8x8 tiles
  110.  
  111. const unsigned char g_metatile[] = {
  112.     0,0,0,0,  // brick
  113.     1,2,3,4,  // block 1
  114.     5,6,7,8   // block 2
  115.  };
  116.  
  117. // list of metatiles to scroll
  118. const unsigned char s_level[] = {0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,0,0,0,0,1,1,1,0,0,1,1,1,0,0,2,0,0,0,1,1,1,1,0,0,0,1,1};
  119.  
  120. struct SEQ
  121. {
  122.     unsigned char a, b;
  123. };
  124.  
  125. #define PATTERN_SIZE 32
  126. struct SEQ data[PATTERN_SIZE];
  127. unsigned char g_patterns[8*PATTERN_SIZE];
  128. unsigned char g_table_names_size = 0;
  129. unsigned char g_table_names[32*4]; // 4 rows
  130.  
  131. inline void scroll(unsigned char p1, unsigned char p2, unsigned char offset, unsigned char  dest)
  132. {
  133.     unsigned char offset2 = 8-offset;    
  134.     unsigned char *pchar1 =  s_tiles + p1*8;    
  135.     unsigned char *pchar2 =  s_tiles + p2*8;
  136.     unsigned char *dptr   =  g_patterns + dest*8;  
  137.  
  138.     *dptr++ = (*pchar1++ << offset) | (*pchar2++ >> offset2);
  139.     *dptr++ = (*pchar1++ << offset) | (*pchar2++ >> offset2);
  140.     *dptr++ = (*pchar1++ << offset) | (*pchar2++ >> offset2);
  141.     *dptr++ = (*pchar1++ << offset) | (*pchar2++ >> offset2);
  142.     *dptr++ = (*pchar1++ << offset) | (*pchar2++ >> offset2);
  143.     *dptr++ = (*pchar1++ << offset) | (*pchar2++ >> offset2);
  144.     *dptr++ = (*pchar1++ << offset) | (*pchar2++ >> offset2);
  145.     *dptr++ = (*pchar1++ << offset) | (*pchar2++ >> offset2);
  146. }
  147.  
  148. void begin_frame()
  149. {
  150.     g_table_names_size = 0;
  151. }
  152.  
  153. void scroll_level_ab(unsigned char a, unsigned char b, unsigned char o, unsigned char offset_l)
  154. {
  155.     // check if we have alerady computed that pattern
  156.     for(unsigned char i=0;i<g_table_names_size;i++)
  157.     {
  158.         if ((a==data[i].a) && (b==data[i].b))
  159.         {            
  160.             g_table_names[o]=i+1;
  161.             return;
  162.         }
  163.     }
  164.  
  165.     data[g_table_names_size].a=a;
  166.     data[g_table_names_size].b=b;
  167.  
  168.     scroll(a, b, offset_l, g_table_names_size);
  169.    
  170.     g_table_names_size++;
  171.    
  172.     g_table_names[o]=g_table_names_size;                
  173. }
  174.  
  175. ////////////////////////////// 16x16 tiles
  176.  
  177. inline unsigned char get_data(const unsigned char * level, unsigned char x, unsigned char y)
  178. {
  179.     return g_metatile[4*level[x/2] + (x&1) + y];
  180. }
  181.  
  182. inline void get_meta(unsigned char * level, unsigned char x, unsigned char y, unsigned char * a, unsigned char * b)
  183. {
  184.     *a = get_data(level, x, y);
  185.     *b = get_data(level, x + 1, y);    
  186. }
  187.  
  188. void scroll_level_meta(const unsigned char * level, unsigned int offset, unsigned char dest)
  189. {
  190.     unsigned char  offset_h = offset / 8;
  191.     unsigned char  offset_l = offset & 7;
  192.  
  193.     for(unsigned char y=0;y<2;y++)
  194.     {
  195.         for(unsigned char o=0;o<32;o++)
  196.         {
  197.             unsigned char a,b;
  198.             get_meta(level, o + offset_h, y*2, &a, &b);
  199.             scroll_level_ab(a, b, o+y*32, offset_l);
  200.         }
  201.     }    
  202.    
  203.     // write names
  204.     VDP_WriteVRAM_16K( g_table_names, g_ScreenLayoutLow + dest, 32*2);    
  205. }
  206.  
  207. void end_frame()
  208. {
  209.     // write patterns
  210.     VDP_WriteVRAM_16K( g_patterns, g_ScreenPatternLow + 8, g_table_names_size * 8);      
  211. }
  212.  
  213. //=============================================================================
  214. // MAIN LOOP
  215. //=============================================================================
  216. #include "font\font_mgl_std0.h"
  217.  
  218. //-----------------------------------------------------------------------------
  219. /// Program entry point
  220. void main()
  221. {
  222.     VDP_SetMode(VDP_MODE_GRAPHIC2);
  223.    
  224.     VDP_SetColor(0xF0);
  225.     VDP_FillVRAM(0x00, 0x0000, 0, 256*64); // Clear 16KB VRAM
  226.     VDP_EnableVBlank(true);
  227.  
  228.     Print_SetTextFont(g_Font_MGL_Std0, 1);
  229.        
  230.     unsigned char offset = 0;
  231.     while(1)
  232.     {
  233.         Halt();
  234.        
  235.         if(Keyboard_IsKeyPressed(KEY_RIGHT))
  236.             offset+=1;
  237.         if(Keyboard_IsKeyPressed(KEY_LEFT) && offset>0)
  238.             offset-=1;
  239.                
  240.         begin_frame();
  241.         scroll_level_meta(s_level, offset, 0);
  242.         end_frame();        
  243.        
  244.         Print_SetPosition(0, 10);        Print_DrawHex8(offset);
  245.         Print_SetPosition(4, 10);        Print_DrawHex8(g_table_names_size);
  246.    }
  247.     Bios_ClearHook(H_TIMI);
  248.     Bios_Exit(0);
  249. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement