diff options
| -rw-r--r-- | libs/SDL.S | 1 | ||||
| -rw-r--r-- | libs/SDL/events.S | 15 | ||||
| -rw-r--r-- | libs/SDL/render.S | 30 | ||||
| -rw-r--r-- | src/main.S | 74 |
4 files changed, 109 insertions, 11 deletions
@@ -1,4 +1,5 @@ #include "SDL/error.S" +#include "SDL/event.S" #include "SDL/init.S" #include "SDL/rect.S" #include "SDL/render.S" diff --git a/libs/SDL/events.S b/libs/SDL/events.S new file mode 100644 index 0000000..b94b65c --- /dev/null +++ b/libs/SDL/events.S @@ -0,0 +1,15 @@ +//! @file events.S +//! +//! Assembler bindings for SDL2 (SDL_events.h) + +#define SIZE_SDL_Event 56 + +#define OFFSET_SDL_Event_type 0 + +#define SDL_EVENT_QUIT 0x100 + +//! @fn int SDL_PollEvent(SDL_Event * event); +//! @param event the SDL_Event structure to be filled with the next event from the queue, or NULL. +//! @return 1 if there is a pending event, or 0 if there isn't. +.type SDL_PollEvent, @function +.extern SDL_PollEvent
\ No newline at end of file diff --git a/libs/SDL/render.S b/libs/SDL/render.S index d422971..70d1ca8 100644 --- a/libs/SDL/render.S +++ b/libs/SDL/render.S @@ -15,4 +15,32 @@ //! @fn void SDL_DestroyRenderer(SDL_Renderer * renderer); //! @param renderer the renderer to destroy .type SDL_DestroyRenderer, @function -.extern SDL_DestroyRenderer
\ No newline at end of file +.extern SDL_DestroyRenderer + +//! @fn int SDL_RenderClear(SDL_Renderer * renderer); +//! @param renderer the rendering context. +//! @return 0 on success, or a negative value on error. +.type SDL_RenderClear, @function +.extern SDL_RenderClear + +//! @fn int SDL_RenderFillRect(SDL_Renderer * renderer, const SDL_Rect * rect); +//! @param renderer the rendering context. +//! @param rect the rectangle to fill +//! @return 0 on success, or a negative value on error. +.type SDL_RenderFillRect, @function +.extern SDL_RenderFillRect + +//! @fn void SDL_RenderPresent(SDL_Renderer * renderer); +//! @param renderer the rendering context +.type SDL_RenderPresent, @function +.extern SDL_RenderPresent + +//! @fn int SDL_SetRenderDrawColor(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a); +//! @param renderer the rendering context. +//! @param r the red value used to draw on the rendering target. +//! @param g the green value used to draw on the rendering target. +//! @param b the blue value used to draw on the rendering target. +//! @param a the alpha value used to draw on the rendering target. +//! @return 0 on success, or a negative value on error. +.type SDL_SetRenderDrawColor, @function +.extern SDL_SetRenderDrawColor
\ No newline at end of file @@ -1,4 +1,5 @@ #include "helpers/function.S" +#include "SDL/events.S" #include "SDL/init.S" #include "SDL/rect.S" #include "SDL/render.S" @@ -8,7 +9,7 @@ #define SCREEN_HEIGHT 600 // integer-params: RDI, RSI, RDX, RCX, R8, R9 -// caller-saved: RAX, RCX, RDX, RSI, RDI, R8-R11 +// caller-saved: RAX, RCX, RDI, RSI, RDX, R8-R11 // callee-saved: RBX, RSP, RBP, R12-R15 .section .rodata @@ -26,9 +27,13 @@ function_begin main + push %r12 + push %r13 + define_local window_handle, 8 define_local renderer_handle, 8 define_local rect, SIZE_SDL_Rect + define_local event, SIZE_SDL_Event allocate_locals // initialize SDL @@ -88,19 +93,67 @@ call printf@PLT // initialize a simple square, located at the screen's center - mov $(SCREEN_HEIGHT / 2), %r8 - mov $(SCREEN_WIDTH / 2), %r9 + mov $(SCREEN_HEIGHT / 2), %r8d + mov $(SCREEN_WIDTH / 2), %r9d address_of_local rect, %rdi mov %r8d, OFFSET_SDL_Rect_w(%rdi) mov %r8d, OFFSET_SDL_Rect_h(%rdi) - mov %r9, %r10 - shr $1, %r9 - sub %r9, %r10 + mov %r9d, %r10d + shr $1, %r8d + sub %r8d, %r10d mov %r10d, OFFSET_SDL_Rect_x(%rdi) - mov %r8, %r10 - sub %r9, %r10 - mov %r10d, OFFSET_SDL_Rect_y(%rdi) + mov %r8d, OFFSET_SDL_Rect_y(%rdi) + + //! @var bool quit_requested + xor %r12, %r12 + + // main loop + .Lloop: + + address_of_local event, %rdi + mov %rdi, %r13 + call SDL_PollEvent@PLT + mov (%r13), %r8d + + // user requested to quit + mov $SDL_EVENT_QUIT, %r9d + cmp %r8d, %r9d + sete %r12b + + // use white color + load_local renderer_handle, %rdi + mov %rdi, %r13 + mov $0xff, %rsi + mov %rsi, %rcx + mov %rsi, %rdx + mov %rsi, %r8 + call SDL_SetRenderDrawColor@PLT + test %rax, %rax + + // clear the screen + mov %r13, %rdi + call SDL_RenderClear@PLT + + // use red color + mov %r13, %rdi + mov $0xff, %rsi + mov $0x00, %rcx + mov $0x00, %rdx + mov %rsi, %r8 + call SDL_SetRenderDrawColor@PLT + + // draw the square + mov %r13, %rdi + address_of_local rect, %rsi + call SDL_RenderFillRect@PLT + + // update the screen + mov %r13, %rdi + call SDL_RenderPresent@PLT + + test %r12b, %r12b + jz .Lloop .Ldestroy_renderer: // destroy the renderer @@ -116,6 +169,7 @@ call SDL_Quit@PLT xor %rax, %rax - + pop %r13 + pop %r12 function_end |
