aboutsummaryrefslogtreecommitdiff
path: root/src/snake.S
blob: 00d66e24957255e54192f3f2da7627f8579f9e0b (plain)
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
//! @file snake.S
//!
//! Type definitions, sizes, and the interface for the snake.

#include "helpers/function.S"

#define OFFSET_snake_t_x 0
#define SIZE_snake_t_x 4

#define OFFSET_snake_t_y OFFSET_snake_t_x + SIZE_snake_t_x
#define SIZE_snake_t_y 4

#define OFFSET_snake_t_length OFFSET_snake_t_y + SIZE_snake_t_y
#define SIZE_snake_t_length 4

#define OFFSET_snake_t_direction OFFSET_snake_t_length + SIZE_snake_t_length
#define SIZE_snake_t_direction 1

#define OFFSET_snake_t_padding OFFSET_snake_t_direction + SIZE_snake_t_direction
#define SIZE_snake_t_padding 3

#define SIZE_snake_t OFFSET_snake_t_padding + SIZE_snake_t_padding

#ifndef __STDC_VERSION__

.section .text

  //! @fn void snake_init(snake_t * self, int x, int y, int length)
  //! @param (%rdi) self    the object to initialize
  //! @param (%esi) x       the x position of the head of the snake
  //! @param (%edx) y       the y position of the head of the snake
  //! @param (%ecx) length  the length of the snake
  function_begin snake_init

    test %rdi, %rdi
    jz .Lexit_snake_init

    mov %esi, OFFSET_snake_t_x(%rdi)
    mov %edx, OFFSET_snake_t_y(%rdi)
    mov %ecx, OFFSET_snake_t_length(%rdi)
    xor %al, %al
    mov %al, OFFSET_snake_t_direction(%rdi)

  function_end

#else

#include <stddef.h>

typedef struct {
  int x;
  int y;
  int length;
  char direction;
  char padding[3];
} snake_t;

static_assert(sizeof(snake_t) == SIZE_snake_t);

static_assert(offsetof(snake_t, x) == OFFSET_snake_t_x);
static_assert(sizeof(((snake_t*)0)->x) == SIZE_snake_t_x);

static_assert(offsetof(snake_t, y) == OFFSET_snake_t_y);
static_assert(sizeof(((snake_t*)0)->y) == SIZE_snake_t_y);

static_assert(offsetof(snake_t, length) == OFFSET_snake_t_length);
static_assert(sizeof(((snake_t*)0)->length) == SIZE_snake_t_length);

static_assert(offsetof(snake_t, direction) == OFFSET_snake_t_direction);
static_assert(sizeof(((snake_t*)0)->direction) == SIZE_snake_t_direction);

static_assert(offsetof(snake_t, padding) == OFFSET_snake_t_padding);
static_assert(sizeof(((snake_t*)0)->padding) == SIZE_snake_t_padding);

void snake_init(snake_t * self, int x, int y, int length);

#endif