Advertisement
Kitomas

gb platformer as of 2024-08-16

Aug 16th, 2024
719
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 18.24 KB | None | 0 0
  1. #ifndef _UTILS_H
  2. #define _UTILS_H
  3.  
  4.  
  5.  
  6.  
  7.  
  8. #include <stdbool.h>
  9. #include <stdint.h>
  10.  
  11. typedef uint8_t  u8;
  12. typedef  int8_t  s8;
  13. typedef uint16_t u16;
  14. typedef  int16_t s16;
  15. typedef uint32_t u32;
  16. typedef  int32_t s32;
  17.  
  18. typedef union r16u {
  19.   u16 v;
  20.   struct { u8 l,h; };
  21. } r16u;
  22.  
  23. typedef union r16s {
  24.   s16 v;
  25.   struct { u8 l; s8 h; };
  26. } r16s;
  27.  
  28.  
  29.  
  30.  
  31.  
  32. #define _drlb(p,s) ( ((unsigned char)(p&1))<<s )
  33. #define _drhb(p,s) ( ((unsigned char)((p>>1)&1))<<s )
  34.  
  35. #define DEFSPRITE_ROW(p0,p1,p2,p3,p4,p5,p6,p7) \
  36.   _drlb(p0,7)|_drlb(p1,6)|_drlb(p2,5)|_drlb(p3,4)|_drlb(p4,3)|_drlb(p5,2)|_drlb(p6,1)|_drlb(p7,0), \
  37.   _drhb(p0,7)|_drhb(p1,6)|_drhb(p2,5)|_drhb(p3,4)|_drhb(p4,3)|_drhb(p5,2)|_drhb(p6,1)|_drhb(p7,0)
  38.  
  39. #define DEFSPRITE(p00,p01,p02,p03,p04,p05,p06,p07,p08,p09,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56,p57,p58,p59,p60,p61,p62,p63) \
  40.   DEFSPRITE_ROW(p00,p01,p02,p03,p04,p05,p06,p07), \
  41.   DEFSPRITE_ROW(p08,p09,p10,p11,p12,p13,p14,p15), \
  42.   DEFSPRITE_ROW(p16,p17,p18,p19,p20,p21,p22,p23), \
  43.   DEFSPRITE_ROW(p24,p25,p26,p27,p28,p29,p30,p31), \
  44.   DEFSPRITE_ROW(p32,p33,p34,p35,p36,p37,p38,p39), \
  45.   DEFSPRITE_ROW(p40,p41,p42,p43,p44,p45,p46,p47), \
  46.   DEFSPRITE_ROW(p48,p49,p50,p51,p52,p53,p54,p55), \
  47.   DEFSPRITE_ROW(p56,p57,p58,p59,p60,p61,p62,p63)
  48.  
  49. /*
  50.   Template:
  51.  
  52.   DEFSPRITE(
  53.   0,0,0,0,0,0,0,0,
  54.   0,0,0,0,0,0,0,0,
  55.   0,0,0,0,0,0,0,0,
  56.   0,0,0,0,0,0,0,0,
  57.   0,0,0,0,0,0,0,0,
  58.   0,0,0,0,0,0,0,0,
  59.   0,0,0,0,0,0,0,0,
  60.   0,0,0,0,0,0,0,0),
  61. */
  62.  
  63.  
  64.  
  65.  
  66.  
  67. //audio register stuff
  68. #define _A_R_1_1_1_1_1_1_1_1(b7, b6, b5, b4, b3, b2, b1, b0) \
  69.   (  (unsigned char)( (((b7)&1)<<7) | (((b6)&1)<<6) | (((b5)&1)<<5) | (((b4)&1)<<4) | (((b3)&1)<<3) | (((b2)&1)<<2) | (((b1)&1)<<1) | ((b0)&1))  )
  70.  
  71. #define _A_R_1_3_1_3(b7, b6_4, b3, b2_0) \
  72.   (  (unsigned char)( (((b7)&1)<<7) | (((b6_4)&7)<<4) | (((b3)&1)<<3) | ((b2_0)&7) )  )
  73.  
  74. #define _A_R_2_6(b7_6, b5_0) \
  75.   (  (unsigned char)( (((b7_6)&3)<<6) | (b5_0&63) )  )
  76.  
  77. #define _A_R_4_1_3(b7_4, b3, b2_0) \
  78.   (  (unsigned char)( (((b7_4)&15)<<4) | (((b3)&1)<<3) | ((b2_0)&7) )  )
  79.  
  80. #define _A_R_1_1_3_3(b7, b6, b5_3, b2_0) \
  81.   (  (unsigned char)( (((b7)&1)<<7) | (((b6)&1)<<6) | (((b5_3)&7)<<3) | ((b2_0)&7) )  )
  82.  
  83.  
  84.  
  85. #define APU_CTL NR52_REG
  86.  
  87. #define APU_CTL_OFF APU_CTL &= 0x7f
  88. #define APU_CTL_ON  APU_CTL |= 0x80
  89.  
  90. #define APU_CTL_CH4_ISON ((APU_CTL&8) != 0)
  91. #define APU_CTL_CH3_ISON ((APU_CTL&4) != 0)
  92. #define APU_CTL_CH2_ISON ((APU_CTL&2) != 0)
  93. #define APU_CTL_CH1_ISON ((APU_CTL&1) != 0)
  94.  
  95.  
  96.  
  97. #define APU_PAN NR51_REG
  98.  
  99. #define APU_PAN_ASN(ch4l, ch3l, ch2l, ch1l,  ch4r, ch3r, ch2r, ch1r) \
  100.   APU_PAN = _A_R_1_1_1_1_1_1_1_1(ch4l, ch3l, ch2l, ch1l,  ch4r, ch3r, ch2r, ch1r)
  101.  
  102. #define APU_PAN_SET(ch4l, ch3l, ch2l, ch1l,  ch4r, ch3r, ch2r, ch1r) \
  103.   APU_PAN |= _A_R_1_1_1_1_1_1_1_1(ch4l, ch3l, ch2l, ch1l,  ch4r, ch3r, ch2r, ch1r)
  104.  
  105. #define APU_PAN_CLR(ch4l, ch3l, ch2l, ch1l,  ch4r, ch3r, ch2r, ch1r) \
  106.   APU_PAN &= ~_A_R_1_1_1_1_1_1_1_1(ch4l, ch3l, ch2l, ch1l,  ch4r, ch3r, ch2r, ch1r)
  107.  
  108.  
  109.  
  110. #define APU_VOL NR50_REG
  111.  
  112. #define APU_VOL_ASN(left_3, right_3, VIN_left_1, VIN_right_1) \
  113.   APU_VOL = _A_R_1_3_1_3(VIN_left_1, left_3, VIN_right_1, right_3)
  114.  
  115. #define APU_VOL_SET(left_3, right_3, VIN_left_1, VIN_right_1) \
  116.   APU_VOL |= _A_R_1_3_1_3(VIN_left_1, left_3, VIN_right_1, right_3)
  117.  
  118. #define APU_VOL_CLR(left_3, right_3, VIN_left_1, VIN_right_1) \
  119.   APU_VOL &= ~_A_R_1_3_1_3(VIN_left_1, left_3, VIN_right_1, right_3)
  120.  
  121.  
  122.  
  123. #define APU_CH1_SWEEP NR10_REG
  124.  
  125. #define APU_CH1_SWEEP_ASN(pace_3, direction_1, individual_step_3) \
  126.   APU_CH1_SWEEP = _A_R_1_3_1_3(0, pace_3, direction_1, individual_step_3)
  127.  
  128. #define APU_CH1_SWEEP_SET(pace_3, direction_1, individual_step_3) \
  129.   APU_CH1_SWEEP |= _A_R_1_3_1_3(0, pace_3, direction_1, individual_step_3)
  130.  
  131. #define APU_CH1_SWEEP_CLR(pace_3, direction_1, individual_step_3) \
  132.   APU_CH1_SWEEP &= ~_A_R_1_3_1_3(0, pace_3, direction_1, individual_step_3)
  133.  
  134.  
  135.  
  136. #define APU_CH1_LENCYCLE NR11_REG
  137.  
  138. #define APU_CH1_LENCYCLE_ASN(wave_duty_2, WO_initial_length_timer_6) \
  139.   APU_CH1_LENCYCLE = _A_R_2_6(wave_duty_2, WO_initial_length_timer_6)
  140.  
  141. #define APU_CH1_LENCYCLE_SET(wave_duty_2, WO_initial_length_timer_6) \
  142.   APU_CH1_LENCYCLE |= _A_R_2_6(wave_duty_2, WO_initial_length_timer_6)
  143.  
  144. #define APU_CH1_LENCYCLE_CLR(wave_duty_2, WO_initial_length_timer_6) \
  145.   APU_CH1_LENCYCLE &= ~_A_R_2_6(wave_duty_2, WO_initial_length_timer_6)
  146.  
  147.  
  148.  
  149. #define APU_CH1_VOLENV NR12_REG
  150.  
  151. #define APU_CH1_VOLENV_ASN(initial_volume_4, env_dir_1, sweep_pace_3) \
  152.   APU_CH1_VOLENV = _A_R_4_1_3(initial_volume_4, env_dir_1, sweep_pace_3)
  153.  
  154. #define APU_CH1_VOLENV_SET(initial_volume_4, env_dir_1, sweep_pace_3) \
  155.   APU_CH1_VOLENV |= _A_R_4_1_3(initial_volume_4, env_dir_1, sweep_pace_3)
  156.  
  157. #define APU_CH1_VOLENV_CLR(initial_volume_4, env_dir_1, sweep_pace_3) \
  158.   APU_CH1_VOLENV &= ~_A_R_4_1_3(initial_volume_4, env_dir_1, sweep_pace_3)
  159.  
  160.  
  161.  
  162. #define APU_CH1_PERIODLO NR13_REG
  163.  
  164. #define APU_CHR_PERIODLO_ASN(WO_period_low_8) \
  165.   APU_CH1_PERIODLO = ((WO_period_low_8)&255)
  166.  
  167. #define APU_CHR_PERIODLO_SET(WO_period_low_8) \
  168.   APU_CH1_PERIODLO |= ((WO_period_low_8)&255)
  169.  
  170. #define APU_CHR_PERIODLO_CLR(WO_period_low_8) \
  171.   APU_CH1_PERIODLO &= ~((WO_period_low_8)&255)
  172.  
  173.  
  174.  
  175. #define APU_CH1_PERIODHI NR14_REG
  176.  
  177. #define APU_CH1_PERIODHI_ASN(WO_trigger_1, length_enable_1, WO_period_3) \
  178.   APU_CH1_PERIODHI = _A_R_1_1_3_3(WO_trigger_1, length_enable_1, 0, WO_period_3)
  179.  
  180. #define APU_CH1_PERIODHI_SET(WO_trigger_1, length_enable_1, WO_period_3) \
  181.   APU_CH1_PERIODHI |= _A_R_1_1_3_3(WO_trigger_1, length_enable_1, 0, WO_period_3)
  182.  
  183. #define APU_CH1_PERIODHI_CLR(WO_trigger_1, length_enable_1, WO_period_3) \
  184.   APU_CH1_PERIODHI &= ~_A_R_1_1_3_3(WO_trigger_1, length_enable_1, 0, WO_period_3)
  185.  
  186.  
  187.  
  188. #endif /* _UTILS_H */
  189.  
  190. //(utils.h should be included before this)
  191.  
  192. #ifndef _TILES_H
  193. #define _TILES_H
  194.  
  195.  
  196.  
  197.  
  198.  
  199. #define B 3
  200. #define E 0
  201. #define _ 0
  202.  
  203. const static uint8_t sprite_tiles[] = {
  204.   DEFSPRITE( //0: run 0/5
  205.   _,B,B,B,B,B,B,_,
  206.   B,B,E,B,B,B,E,B,
  207.   B,B,E,B,B,B,E,B,
  208.   B,B,B,B,B,B,B,B,
  209.   B,B,B,E,E,B,B,B,
  210.   _,B,B,B,B,B,B,_,
  211.   _,B,B,_,_,B,B,_,
  212.   _,B,B,_,_,_,_,_),
  213.  
  214.   DEFSPRITE( //1: run 1/5
  215.   _,B,B,B,B,B,B,_,
  216.   B,B,E,B,B,B,E,B,
  217.   B,B,E,B,B,B,E,B,
  218.   B,B,B,B,B,B,B,B,
  219.   B,B,B,E,E,B,B,B,
  220.   _,B,B,B,B,B,B,B,
  221.   B,B,B,_,_,_,B,B,
  222.   B,B,_,_,_,_,_,_),
  223.  
  224.   DEFSPRITE( //2: run 2/5
  225.   _,B,B,B,B,B,B,_,
  226.   B,B,E,B,B,B,E,B,
  227.   B,B,E,B,B,B,E,B,
  228.   B,B,B,B,B,B,B,B,
  229.   B,B,B,E,E,B,B,B,
  230.   B,B,B,B,B,B,B,B,
  231.   B,B,_,_,_,_,B,B,
  232.   _,_,_,_,_,_,B,B),
  233.  
  234.   DEFSPRITE( //3: run 3/5
  235.   _,B,B,B,B,B,B,_,
  236.   B,B,E,B,B,B,E,B,
  237.   B,B,E,B,B,B,E,B,
  238.   B,B,B,B,B,B,B,B,
  239.   B,B,B,E,E,B,B,B,
  240.   _,B,B,B,B,B,B,_,
  241.   _,B,B,_,_,B,B,_,
  242.   _,_,_,_,_,B,B,_),
  243.  
  244.   DEFSPRITE( //4: run 4/5
  245.   _,B,B,B,B,B,B,_,
  246.   B,B,E,B,B,B,E,B,
  247.   B,B,E,B,B,B,E,B,
  248.   B,B,B,B,B,B,B,B,
  249.   B,B,B,E,E,B,B,B,
  250.   _,B,B,B,B,B,B,_,
  251.   _,_,B,B,B,B,_,_,
  252.   _,_,_,_,B,B,_,_),
  253.  
  254.   DEFSPRITE( //5: run 5/5
  255.   _,B,B,B,B,B,B,_,
  256.   B,B,E,B,B,B,E,B,
  257.   B,B,E,B,B,B,E,B,
  258.   B,B,B,B,B,B,B,B,
  259.   B,B,B,E,E,B,B,B,
  260.   _,B,B,B,B,B,B,_,
  261.   _,_,B,B,B,B,_,_,
  262.   _,_,B,B,_,_,_,_),
  263.  
  264.  
  265.   DEFSPRITE( //6: foot forward (+y velocity)
  266.   _,B,B,B,B,B,B,_,
  267.   B,B,E,B,B,B,E,B,
  268.   B,B,E,B,B,B,E,B,
  269.   B,B,B,B,B,B,B,B,
  270.   B,B,B,E,E,B,B,B,
  271.   B,B,B,B,B,B,B,_,
  272.   B,B,_,_,_,B,B,B,
  273.   _,_,_,_,_,_,B,B),
  274.  
  275.  
  276.   DEFSPRITE( //7: idle
  277.   _,B,B,B,B,B,B,_,
  278.   B,B,E,B,B,B,E,B,
  279.   B,B,E,B,B,B,E,B,
  280.   B,B,B,B,B,B,B,B,
  281.   B,B,B,E,E,B,B,B,
  282.   _,B,B,B,B,B,B,_,
  283.   _,B,B,_,_,B,B,_,
  284.   _,B,B,_,_,B,B,_),
  285.  
  286. };
  287.  
  288. #undef E
  289. #undef B
  290. #undef _
  291.  
  292.  
  293.  
  294.  
  295.  
  296. const static uint8_t background_tiles[] = {
  297.   DEFSPRITE( //1
  298.   3,3,3,3,3,3,3,3,
  299.   1,0,0,0,0,0,1,3,
  300.   1,1,0,0,0,1,1,3,
  301.   1,1,1,0,1,1,1,3,
  302.   1,1,1,2,1,1,1,3,
  303.   1,1,2,2,2,1,1,3,
  304.   1,2,2,2,2,2,1,3,
  305.   2,2,2,2,2,2,2,3),
  306.  
  307. };
  308.  
  309.  
  310.  
  311.  
  312.  
  313. #define _ 3
  314. #define T 1
  315.  
  316. const static uint8_t digit_tiles[] = {
  317. #ifndef TOP_LEFT_DIGIT_BIAS
  318.   DEFSPRITE( //0
  319.   _,_,_,_,_,_,_,_,
  320.   _,_,T,T,T,T,T,_,
  321.   _,T,T,_,_,_,T,T,
  322.   _,T,T,_,_,T,T,T,
  323.   _,T,T,_,T,T,T,T,
  324.   _,T,T,T,T,_,T,T,
  325.   _,T,T,T,_,_,T,T,
  326.   _,_,T,T,T,T,T,_),
  327.  
  328.   DEFSPRITE( //1
  329.   _,_,_,_,_,_,_,_,
  330.   _,_,_,T,T,_,_,_,
  331.   _,_,T,T,T,_,_,_,
  332.   _,_,_,T,T,_,_,_,
  333.   _,_,_,T,T,_,_,_,
  334.   _,_,_,T,T,_,_,_,
  335.   _,_,_,T,T,_,_,_,
  336.   _,T,T,T,T,T,T,_),
  337.  
  338.   DEFSPRITE( //2
  339.   _,_,_,_,_,_,_,_,
  340.   _,_,T,T,T,T,_,_,
  341.   _,T,T,_,_,T,T,_,
  342.   _,_,_,_,_,T,T,_,
  343.   _,_,_,T,T,T,_,_,
  344.   _,_,T,T,_,_,_,_,
  345.   _,T,T,_,_,T,T,_,
  346.   _,T,T,T,T,T,T,_),
  347.  
  348.   DEFSPRITE( //3
  349.   _,_,_,_,_,_,_,_,
  350.   _,_,T,T,T,T,_,_,
  351.   _,T,T,_,_,T,T,_,
  352.   _,_,_,_,_,T,T,_,
  353.   _,_,_,T,T,T,_,_,
  354.   _,_,_,_,_,T,T,_,
  355.   _,T,T,_,_,T,T,_,
  356.   _,_,T,T,T,T,_,_),
  357.  
  358.   DEFSPRITE( //4
  359.   _,_,_,_,_,_,_,_,
  360.   _,_,_,_,T,T,T,_,
  361.   _,_,_,T,T,T,T,_,
  362.   _,_,T,T,_,T,T,_,
  363.   _,T,T,_,_,T,T,_,
  364.   _,T,T,T,T,T,T,T,
  365.   _,_,_,_,_,T,T,_,
  366.   _,_,_,_,T,T,T,T),
  367.  
  368.   DEFSPRITE( //5
  369.   _,_,_,_,_,_,_,_,
  370.   _,T,T,T,T,T,T,_,
  371.   _,T,T,_,_,_,_,_,
  372.   _,T,T,T,T,T,_,_,
  373.   _,_,_,_,_,T,T,_,
  374.   _,_,_,_,_,T,T,_,
  375.   _,T,T,_,_,T,T,_,
  376.   _,_,T,T,T,T,_,_),
  377.  
  378.   DEFSPRITE( //6
  379.   _,_,_,_,_,_,_,_,
  380.   _,_,_,T,T,T,_,_,
  381.   _,_,T,T,_,_,_,_,
  382.   _,T,T,_,_,_,_,_,
  383.   _,T,T,T,T,T,_,_,
  384.   _,T,T,_,_,T,T,_,
  385.   _,T,T,_,_,T,T,_,
  386.   _,_,T,T,T,T,_,_),
  387.  
  388.   DEFSPRITE( //7
  389.   _,_,_,_,_,_,_,_,
  390.   _,T,T,T,T,T,T,_,
  391.   _,T,T,_,_,T,T,_,
  392.   _,_,_,_,_,T,T,_,
  393.   _,_,_,_,T,T,_,_,
  394.   _,_,_,T,T,_,_,_,
  395.   _,_,_,T,T,_,_,_,
  396.   _,_,_,T,T,_,_,_),
  397.  
  398.   DEFSPRITE( //8
  399.   _,_,_,_,_,_,_,_,
  400.   _,_,T,T,T,T,_,_,
  401.   _,T,T,_,_,T,T,_,
  402.   _,T,T,_,_,T,T,_,
  403.   _,_,T,T,T,T,_,_,
  404.   _,T,T,_,_,T,T,_,
  405.   _,T,T,_,_,T,T,_,
  406.   _,_,T,T,T,T,_,_),
  407.  
  408.   DEFSPRITE( //9
  409.   _,_,_,_,_,_,_,_,
  410.   _,_,T,T,T,T,_,_,
  411.   _,T,T,_,_,T,T,_,
  412.   _,T,T,_,_,T,T,_,
  413.   _,_,T,T,T,T,T,_,
  414.   _,_,_,_,_,T,T,_,
  415.   _,_,_,_,T,T,_,_,
  416.   _,_,T,T,T,_,_,_),
  417.  
  418. #else /* else ifdef TOP_LEFT_DIGIT_BIAS */
  419.   DEFSPRITE( //0
  420.   _,T,T,T,T,T,_,_,
  421.   T,T,_,_,_,T,T,_,
  422.   T,T,_,_,T,T,T,_,
  423.   T,T,_,T,T,T,T,_,
  424.   T,T,T,T,_,T,T,_,
  425.   T,T,T,_,_,T,T,_,
  426.   _,T,T,T,T,T,_,_,
  427.   _,_,_,_,_,_,_,_),
  428.  
  429.   DEFSPRITE( //1
  430.   _,_,T,T,_,_,_,_,
  431.   _,T,T,T,_,_,_,_,
  432.   _,_,T,T,_,_,_,_,
  433.   _,_,T,T,_,_,_,_,
  434.   _,_,T,T,_,_,_,_,
  435.   _,_,T,T,_,_,_,_,
  436.   T,T,T,T,T,T,_,_,
  437.   _,_,_,_,_,_,_,_),
  438.  
  439.   DEFSPRITE( //2
  440.   _,T,T,T,T,_,_,_,
  441.   T,T,_,_,T,T,_,_,
  442.   _,_,_,_,T,T,_,_,
  443.   _,_,T,T,T,_,_,_,
  444.   _,T,T,_,_,_,_,_,
  445.   T,T,_,_,T,T,_,_,
  446.   T,T,T,T,T,T,_,_,
  447.   _,_,_,_,_,_,_,_),
  448.  
  449.   DEFSPRITE( //3
  450.   _,T,T,T,T,_,_,_,
  451.   T,T,_,_,T,T,_,_,
  452.   _,_,_,_,T,T,_,_,
  453.   _,_,T,T,T,_,_,_,
  454.   _,_,_,_,T,T,_,_,
  455.   T,T,_,_,T,T,_,_,
  456.   _,T,T,T,T,_,_,_,
  457.   _,_,_,_,_,_,_,_),
  458.  
  459.   DEFSPRITE( //4
  460.   _,_,_,T,T,T,_,_,
  461.   _,_,T,T,T,T,_,_,
  462.   _,T,T,_,T,T,_,_,
  463.   T,T,_,_,T,T,_,_,
  464.   T,T,T,T,T,T,T,_,
  465.   _,_,_,_,T,T,_,_,
  466.   _,_,_,T,T,T,T,_,
  467.   _,_,_,_,_,_,_,_),
  468.  
  469.   DEFSPRITE( //5
  470.   T,T,T,T,T,T,_,_,
  471.   T,T,_,_,_,_,_,_,
  472.   T,T,T,T,T,_,_,_,
  473.   _,_,_,_,T,T,_,_,
  474.   _,_,_,_,T,T,_,_,
  475.   T,T,_,_,T,T,_,_,
  476.   _,T,T,T,T,_,_,_,
  477.   _,_,_,_,_,_,_,_),
  478.  
  479.   DEFSPRITE( //6
  480.   _,_,T,T,T,_,_,_,
  481.   _,T,T,_,_,_,_,_,
  482.   T,T,_,_,_,_,_,_,
  483.   T,T,T,T,T,_,_,_,
  484.   T,T,_,_,T,T,_,_,
  485.   T,T,_,_,T,T,_,_,
  486.   _,T,T,T,T,_,_,_,
  487.   _,_,_,_,_,_,_,_),
  488.  
  489.   DEFSPRITE( //7
  490.   T,T,T,T,T,T,_,_,
  491.   T,T,_,_,T,T,_,_,
  492.   _,_,_,_,T,T,_,_,
  493.   _,_,_,T,T,_,_,_,
  494.   _,_,T,T,_,_,_,_,
  495.   _,_,T,T,_,_,_,_,
  496.   _,_,T,T,_,_,_,_,
  497.   _,_,_,_,_,_,_,_),
  498.  
  499.   DEFSPRITE( //8
  500.   _,T,T,T,T,_,_,_,
  501.   T,T,_,_,T,T,_,_,
  502.   T,T,_,_,T,T,_,_,
  503.   _,T,T,T,T,_,_,_,
  504.   T,T,_,_,T,T,_,_,
  505.   T,T,_,_,T,T,_,_,
  506.   _,T,T,T,T,_,_,_,
  507.   _,_,_,_,_,_,_,_),
  508.  
  509.   DEFSPRITE( //9
  510.   _,T,T,T,T,_,_,_,
  511.   T,T,_,_,T,T,_,_,
  512.   T,T,_,_,T,T,_,_,
  513.   _,T,T,T,T,T,_,_,
  514.   _,_,_,_,T,T,_,_,
  515.   _,_,_,T,T,_,_,_,
  516.   _,T,T,T,_,_,_,_,
  517.   _,_,_,_,_,_,_,_),
  518.  
  519. #endif /* TOP_LEFT_DIGIT_BIAS */
  520.  
  521. };
  522.  
  523. #undef _
  524. #undef T
  525.  
  526.  
  527.  
  528.  
  529.  
  530. #endif /* _TILES_H */
  531.  
  532. #include <gb/gb.h>
  533. #include <gb/bcd.h>
  534. #include <rand.h>
  535. //#include <stdio.h>
  536. //#include <gbdk/emu_debug.h>
  537.  
  538. //#include "hUGEDriver.h"
  539. #include "utils.h"
  540. #include "tiles.h"
  541.  
  542. #define imm_mod(n, n_lvalue, m_ge) if((n)>=(m_ge)){ (n_lvalue) -= (m_ge); }
  543.  
  544.  
  545.  
  546.  
  547. typedef struct player_s {
  548.   r16u  x,  y;
  549.   r16s vx, vy;
  550.   r16u run;
  551.   bool on_ground;
  552.   u8   _;
  553. } player_s;
  554.  
  555. static player_s player;
  556.  
  557. //(does not update the physical position of the player's sprite)
  558. void move_player(void/*tbd: s16 dx, s16 dy*/){ //__critical, maybe?
  559.   //tbd, whatever
  560.   /*
  561.   if(dx){
  562.     set_sprite_prop(0, (dx<0) ? S_FLIPX : 0);
  563.    
  564.     //
  565.    
  566.     if(dx < 0) dx = -dx;
  567.     player.run.v += dx;
  568.     player.run.h %= 6;
  569.    
  570.   } else {
  571.     set_sprite_tile(0, 16|7);
  572.    
  573.   }
  574.  
  575.  
  576.   if(dy){
  577.    
  578.   } else {
  579.    
  580.   }
  581.  
  582.  
  583.  
  584.   if(player.on_ground){
  585.    
  586.   }
  587.   */
  588. }
  589.  
  590.  
  591.  
  592.  
  593.  
  594. static inline u8 count_bits_8(u8 n){
  595.   u8 count = 0;
  596.  
  597.   while(n){
  598.     count += n&1;
  599.     n >>= 1;
  600.   }
  601.  
  602.   return count;
  603.  
  604. }
  605.  
  606.  
  607.  
  608. static u16 score;
  609.  
  610. typedef union bcd {
  611.   BCD v;
  612.   struct { u8 a,b,c,d; };
  613. } bcd;
  614.  
  615. #define blit_score() _blit_u16(128, 152, score)
  616. #define blit_u16(n) _blit_u16(128, 152, (u16)(n))
  617.  
  618. void _blit_u16(u8 x, u8 y, u16 n){
  619.   static bcd score_bcd;
  620.  
  621.   //sprites 1-5 are the digits
  622.   move_sprite(1, x, y); x+=8;
  623.   move_sprite(2, x, y); x+=8;
  624.   move_sprite(3, x, y); x+=8;
  625.   move_sprite(4, x, y); x+=8;
  626.   move_sprite(5, x, y);
  627.  
  628.   //only update tile values if y > 0
  629.   if(y > 0){
  630.     score_bcd.v = 0;
  631.     uint2bcd(n, &score_bcd.v);
  632.  
  633.     #define lo_digit(_byte) ((_byte)&15)
  634.     #define hi_digit(_byte) (((_byte)>>4)&15)
  635.  
  636.     set_sprite_tile(1, lo_digit(score_bcd.c));
  637.     set_sprite_tile(2, hi_digit(score_bcd.b));
  638.     set_sprite_tile(3, lo_digit(score_bcd.b));
  639.     set_sprite_tile(4, hi_digit(score_bcd.a));
  640.     set_sprite_tile(5, lo_digit(score_bcd.a));
  641.  
  642.   }
  643.  
  644. }
  645.  
  646.  
  647.  
  648. static u8 clear_buffer[32];
  649.  
  650. void bkg_clear(u8 value){
  651.   for(u8 t=0; t<32; ++t)
  652.     clear_buffer[t] = value;
  653.  
  654.   for(u8 y=0; y<32; ++y)
  655.     set_bkg_tiles(0, y, 32,1, clear_buffer);
  656.  
  657. }
  658.  
  659.  
  660.  
  661. static u8 bkg_row[20];
  662.  
  663. static inline void stamp_row(u8 y){
  664.   set_bkg_tiles(0, y&31,  20, 1,  bkg_row);
  665. }
  666.  
  667. void generate_row(bool filled){
  668.   static r16u new_row;
  669.   //copy of new_row.l; used for bitwise stuff
  670.   static u8   tmp_row;
  671.   //solid floor at start
  672.   static u16  old_row = 0b111111111;
  673.  
  674.   //a row's edges are always supposed to be set no matter what
  675.   bkg_row[ 0] = 1;
  676.   bkg_row[19] = 1;
  677.  
  678.   if(!filled){
  679.     for(char i=1; i<19; ++i) bkg_row[i] = 0;
  680.     return;
  681.  
  682.   }
  683.  
  684.  
  685.  
  686.   //_generate_new_platform:
  687.   new_row.v = randw();
  688.   //put something in row if the call to randw
  689.    //either turned up empty or completely full
  690.   if(!new_row.v || (new_row.v&0b111111111)==0b111111111)
  691.     new_row.v = 0b101010101;
  692.   else
  693.     new_row.v &= 0b111111111;
  694.  
  695.  
  696.  
  697.   //if there are no platforms under any of the new platform's
  698.    //holes, then attempt to generate another row
  699.   if((new_row.v | old_row) == new_row.v){
  700.     new_row.v = ~old_row;
  701.     new_row.v &= 0b111111111;
  702.     //goto _generate_new_platform;
  703.   }
  704.  
  705.  
  706.  
  707.   //turn the first 9 bits of new_row into tile data,
  708.    //where 1 bit = 2 set tiles in a given row,
  709.    //for a total of 18 (excluding edges, which are always set)
  710.   tmp_row = new_row.l;
  711.   bkg_row[ 1] = tmp_row&1;  tmp_row >>= 1;
  712.   bkg_row[ 3] = tmp_row&1;  tmp_row >>= 1;
  713.   bkg_row[ 5] = tmp_row&1;  tmp_row >>= 1;
  714.   bkg_row[ 7] = tmp_row&1;  tmp_row >>= 1;
  715.   bkg_row[ 9] = tmp_row&1;  tmp_row >>= 1;
  716.   bkg_row[11] = tmp_row&1;  tmp_row >>= 1;
  717.   bkg_row[13] = tmp_row&1;  tmp_row >>= 1;
  718.   bkg_row[15] = tmp_row&1;  //no need to shift here
  719.   bkg_row[17] = new_row.h&1; //only the low bit of .h is used
  720.  
  721.   //copy the other half of the row's sections
  722.   bkg_row[ 2] = bkg_row[ 1];
  723.   bkg_row[ 4] = bkg_row[ 3];
  724.   bkg_row[ 6] = bkg_row[ 5];
  725.   bkg_row[ 8] = bkg_row[ 7];
  726.   bkg_row[10] = bkg_row[ 9];
  727.   bkg_row[12] = bkg_row[11];
  728.   bkg_row[14] = bkg_row[13];
  729.   bkg_row[16] = bkg_row[15];
  730.   bkg_row[18] = bkg_row[17];
  731.  
  732.   //because only tmp_row has actually been clobbered,
  733.    //it should be safe to update the value like this
  734.   old_row = new_row.v&0b111111111;
  735.  
  736. }
  737.  
  738.  
  739.  
  740.  
  741.  
  742. static r16u vscroll_pos; //global y scroll position; .v -= to advance downwards
  743. static r16u vscroll_change; //used to keep track of when to generate new
  744. static u8 vscroll_which;
  745. static u8 vscroll_tile = 253; // should start at 0 - 3
  746. static u16 vscroll_speed = 0x40;
  747.  
  748. //scrolls down vertically, potentially generating new rows
  749. void vscroll(u16 delta){
  750.   vscroll_pos.v    -= delta;
  751.   vscroll_change.v += delta;
  752.   player.y.v       += delta;
  753.  
  754.  
  755.   //generate new row(s)
  756.   if(vscroll_change.h >= 8){
  757.     //any change greater than 31 is pointless,
  758.      //since the background is only 32 tiles big
  759.     //so, the change is &='d with 0x1fff, which is
  760.      //about 31.996 when interpreted as an unsigned
  761.      //fixed-point number with an 8-bit fraction
  762.     //(hopefully this works as it should lol)
  763.     vscroll_change.v &= 0x1fff;
  764.  
  765.     static bool filled_row;
  766.     do {
  767.      
  768.       filled_row = !(++vscroll_which&3);
  769.  
  770.       if(filled_row){
  771.         ++score;
  772.       }
  773.  
  774.       __critical {
  775.         generate_row(filled_row);
  776.         stamp_row(vscroll_tile);
  777.       }
  778.      
  779.       --vscroll_tile;
  780.  
  781.     } while((vscroll_change.h-=8) >= 8);
  782.  
  783.   }
  784.  
  785.  
  786.   //only use high byte of position, (low byte denotes subpixels)
  787.   SCY_REG = vscroll_pos.h;
  788.  
  789. }
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796. void main(void){
  797.  
  798.   //set tile data
  799.   set_bkg_data(1, 1, background_tiles);
  800.   set_sprite_data( 0, 10, digit_tiles);
  801.   set_sprite_data(16,  8, sprite_tiles);
  802.   set_sprite_tile(0, 16|7); //player at idle
  803.  
  804.   //generate start area
  805.   bkg_clear(1);
  806.   generate_row(true);
  807.   stamp_row(30);
  808.   generate_row(false);
  809.   stamp_row(31);
  810.   stamp_row( 0);
  811.   stamp_row( 1);
  812.  
  813.   //0.5 pixels per frame to start
  814.   vscroll_speed = 1 * 128;
  815.  
  816.   //put player at start
  817.   player.x.v = 84 * 256;
  818.   player.y.v = 24 * 256;
  819.   move_sprite(0, player.x.h, player.y.h);
  820.  
  821.   SHOW_BKG;
  822.   SHOW_SPRITES;
  823.  
  824.   //seed rng
  825.   static u8 padstate = 0;
  826.   while(!joypad()) vsync(); //wait for press
  827.   while( joypad()){ vsync(); padstate|=joypad(); }//wait for unpress
  828.   padstate = count_bits_8(padstate);
  829.   if(padstate > 4) padstate = 4;
  830.   u16 seed = sys_time<<padstate;
  831.   if(!seed) seed = sys_time;
  832.   initrand(seed);
  833.  
  834.  
  835.  
  836.   APU_CTL_ON;
  837.   APU_PAN_ASN(1,1,1,1, 1,1,1,1);
  838.   APU_VOL_ASN(3,3, 0,0);
  839.  
  840.   __critical {
  841.     //hUGE_init(&song_test);
  842.     //add_VBL(hUGE_dosound);
  843.   }
  844.  
  845.  
  846.   while(1){
  847.     padstate = joypad();
  848.  
  849.  
  850.     if(!padstate) vscroll(vscroll_speed);
  851.    
  852.     blit_u16(score);
  853.    
  854.     if(!(sys_time&63))
  855.       ++vscroll_speed;
  856.  
  857.     move_sprite(0, player.x.h, player.y.h+1 );
  858.     vsync();
  859.  
  860.   }
  861. }
  862.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement