diff --git a/src/arch/linux/devices.c b/src/arch/linux/devices.c index 9ff81b9..8e9e7d0 100644 --- a/src/arch/linux/devices.c +++ b/src/arch/linux/devices.c @@ -79,14 +79,13 @@ i32 screen_read(void *data, u8 *buffer, u32 size) { i32 screen_write(void *data, const u8 *buffer, u32 size) { ScreenDeviceData *screen = (ScreenDeviceData *)data; - USED(buffer); if (size > screen->size * sizeof(u8)) { return -1; } if (screen->texture && screen->renderer) { - SDL_UpdateTexture(screen->texture, nil, &buffer[screen->pos], + SDL_UpdateTexture(screen->texture, nil, buffer, screen->width); SDL_RenderClear(screen->renderer); diff --git a/src/arch/linux/main.c b/src/arch/linux/main.c index a12117d..b61dc56 100644 --- a/src/arch/linux/main.c +++ b/src/arch/linux/main.c @@ -146,7 +146,9 @@ bool compileAndSave(const char *source_file, const char *output_file, VM *vm) { printf("Parse failed.\n"); return false; } else { +#ifdef ASM_DEBUG expr_print(ast, 0); +#endif assemble(vm, ast); expr_free(ast); @@ -241,9 +243,6 @@ void register_sdl_devices(VM *vm) { screen_data.width = 640; screen_data.height = 480; screen_data.size = 640 * 480; - screen_data.pos = vm->mp; - vm->mp += screen_data.size; /* advance memory pointer */ - vm->frames[vm->fp].end = vm->mp; vm_register_device(vm, "/dev/screen/0", "screen", &screen_data, &screen_ops); @@ -254,9 +253,6 @@ void register_sdl_devices(VM *vm) { mouse_data.btn3 = 0; mouse_data.btn4 = 0; mouse_data.size = 12; - mouse_data.pos = vm->mp; - vm->mp += mouse_data.size; /* advance memory pointer */ - vm->frames[vm->fp].end = vm->mp; vm_register_device(vm, "/dev/mouse/0", "mouse", &mouse_data, &mouse_ops); diff --git a/src/tools/assembler.c b/src/tools/assembler.c index cc45592..1950d93 100644 --- a/src/tools/assembler.c +++ b/src/tools/assembler.c @@ -952,4 +952,4 @@ void assemble(VM *vm, ExprNode *program) { free(table.symbols[i].name); } free(table.symbols); -} \ No newline at end of file +} diff --git a/src/tools/parser.c b/src/tools/parser.c index 72eac4c..a17c03d 100644 --- a/src/tools/parser.c +++ b/src/tools/parser.c @@ -251,4 +251,4 @@ void expr_print(ExprNode *node, int indent) { expr_print(node->children[i], indent + 1); } } -} \ No newline at end of file +} diff --git a/src/tools/parser.h b/src/tools/parser.h index 594eca7..53ac41b 100644 --- a/src/tools/parser.h +++ b/src/tools/parser.h @@ -22,4 +22,4 @@ void expr_free(ExprNode *node); void expr_print(ExprNode *node, int indent); void *safe_malloc(size_t size); -#endif \ No newline at end of file +#endif diff --git a/src/vm/common.h b/src/vm/common.h index 83f28eb..3a3d579 100644 --- a/src/vm/common.h +++ b/src/vm/common.h @@ -1,7 +1,6 @@ #ifndef ZRE_COMMON_H #define ZRE_COMMON_H -#include #include #include @@ -12,6 +11,10 @@ typedef int16_t i16; typedef uint32_t u32; typedef int32_t i32; +#define true 1 +#define false 0 +#define bool u8 + #define nil NULL #define USED(x) ((void)(x)) diff --git a/src/vm/device.h b/src/vm/device.h index c6634be..4b29d93 100644 --- a/src/vm/device.h +++ b/src/vm/device.h @@ -8,4 +8,4 @@ Device* find_device_by_path(VM *vm, const char *path); Device* find_device_by_type(VM *vm, const char *type); i32 find_devices_by_type(VM *vm, const char *type, Device **results, uint32_t max_results); -#endif \ No newline at end of file +#endif diff --git a/test/box.asm.lisp b/test/box.asm.lisp index 9dd311e..96ed57c 100644 --- a/test/box.asm.lisp +++ b/test/box.asm.lisp @@ -5,8 +5,6 @@ (load-immediate $0 &screen-namespace) (load-immediate $11 0) (syscall OPEN $0 $11) - ; draw to the device because otherwise the screen wont open - (syscall WRITE $0 $0 $0) (load-immediate $16 1) ; device info call (load-immediate $17 16) ; sizeof screen device info @@ -15,10 +13,11 @@ (load-immediate $1 12) ; offset for width (add-nat $19 $18 $1) (load-r $20 $19) ; load width - (load-immediate $1 4) ; offset for width + (load-immediate $1 8) ; offset for size (add-nat $19 $18 $1) - (load-r $21 $19) ; load base pointer - (add-nat $21 $21 $1) ; need to add offset for fat pointer size + (load-r $22 $19) ; load size + (malloc $21 $22) ; malloc frame buffer + (syscall WRITE $0 $21 $22) (load-immediate $16 &mouse-namespace) (load-immediate $3 12) ; malloc sizeof mouse data @@ -43,6 +42,8 @@ (load-immediate $14 20) ; box size ; first row + (push $21) + (push $20) (load $1 &BLACK) (push $1) (load-immediate $12 1) @@ -60,6 +61,8 @@ (push $9) ; is btn1 clicked? (call &set-color-if-clicked) + (push $21) + (push $20) (load $1 &WHITE) (push $1) (load-immediate $12 21) @@ -78,6 +81,8 @@ (call &set-color-if-clicked) ; row 2 + (push $21) + (push $20) (load $1 &CHARCOAL) (push $1) (load-immediate $12 1) @@ -95,6 +100,8 @@ (push $9) ; is btn1 clicked? (call &set-color-if-clicked) + (push $21) + (push $20) (load $1 &DARK-GRAY) (push $1) (load-immediate $12 21) @@ -113,6 +120,8 @@ (call &set-color-if-clicked) ; row 3 + (push $21) + (push $20) (load $1 &RED) (push $1) (load-immediate $12 1) @@ -130,6 +139,8 @@ (push $9) ; is btn1 clicked? (call &set-color-if-clicked) + (push $21) + (push $20) (load $1 &ORANGE) (push $1) (load-immediate $12 21) @@ -148,6 +159,8 @@ (call &set-color-if-clicked) ; row 3 + (push $21) + (push $20) (load $1 &YELLOW) (push $1) (load-immediate $12 1) @@ -165,6 +178,8 @@ (push $9) ; is btn1 clicked? (call &set-color-if-clicked) + (push $21) + (push $20) (load $1 &GREEN) (push $1) (load-immediate $12 21) @@ -183,6 +198,8 @@ (call &set-color-if-clicked) ; row 4 + (push $21) + (push $20) (load $1 &BLUE) (push $1) (load-immediate $12 1) @@ -200,6 +217,8 @@ (push $9) ; is btn1 clicked? (call &set-color-if-clicked) + (push $21) + (push $20) (load $1 &PURPLE) (push $1) (load-immediate $12 21) @@ -217,7 +236,7 @@ (push $9) ; is btn1 clicked? (call &set-color-if-clicked) - (syscall WRITE $0 $0 $0) + (syscall WRITE $0 $21 $22) (jump-eq-nat &draw-loop $9 $11) @@ -282,13 +301,24 @@ (pop $3) ; y (pop $2) ; x (pop $1) ; color + (pop $20) + (pop $21) ; Constants (load $4 &GRAY) + (load $10 &SELECTED-COLOR) + (jump-eq-int &set-selected $10 $1) + (jump-eq-int &end-set-selected $4 $4) + (label set-selected) + (load $4 &DARK-GRAY) + (label end-set-selected) + (load-immediate $5 20) ; outline size (load-immediate $6 17) ; fill size (load-immediate $7 2) ; offset + (push $21) ; base + (push $20) ; width (push $4) ; color (gray) (push $2) ; x (push $3) ; y @@ -299,6 +329,8 @@ (add-int $8 $2 $7) ; x + 2 (add-int $9 $3 $7) ; y + 2 + (push $21) ; base + (push $20) ; width (push $1) ; color (original) (push $8) ; x + 2 (push $9) ; y + 2 @@ -317,20 +349,8 @@ (pop $13) ; y_start (pop $11) ; x_start (pop $3) ; color - - ;; get the screen width dynamically from the device - (load-immediate $0 &screen-namespace) - (load-immediate $16 1) ; device info call - (load-immediate $17 16) ; sizeof screen device info - (malloc $18 $17) - (syscall IOCTL $0 $16 $18) - (load-immediate $1 12) ; offset for width - (add-nat $19 $18 $1) - (load-r $2 $19) ; load width - (load-immediate $1 4) ; offset for width - (add-nat $19 $18 $1) - (load-r $21 $19) ; load base pointer - (add-nat $21 $21 $1) ; need to add offset for fat pointer size + (pop $2) ; width + (pop $21) ; base ; Constants (load-immediate $1 1) ; increment @@ -339,6 +359,8 @@ (mul-int $15 $13 $2) ; $15 = y * 640 (add-int $15 $15 $11) ; $15 += x (add-nat $15 $21 $15) ; $15 = base + pixel_offset + (load-immediate $25 4) + (add-nat $15 $15 $25) ; need to add offset for fat pointer size (register-move $4 $15) ; Outer loop: height times diff --git a/test/window.asm.lisp b/test/window.asm.lisp index c7b4658..6b8915e 100644 --- a/test/window.asm.lisp +++ b/test/window.asm.lisp @@ -3,7 +3,6 @@ (load-immediate $0 &screen-namespace) (load-immediate $11 0) (syscall OPEN $0 $11) - (syscall WRITE $0 $0 $0) (load-immediate $16 1) ; device info call (load-immediate $17 16) ; sizeof screen device info @@ -12,10 +11,11 @@ (load-immediate $1 12) ; offset for width (add-nat $19 $18 $1) (load-r $20 $19) ; load width - (load-immediate $1 4) ; offset for width + (load-immediate $1 8) ; offset for size (add-nat $19 $18 $1) - (load-r $21 $19) ; load base pointer - (add-nat $21 $21 $1) ; need to add offset for fat pointer size + (load-r $22 $19) ; load size + (malloc $21 $22) ; malloc frame buffer + (syscall WRITE $0 $21 $22) (load-immediate $16 &mouse-namespace) (load-immediate $3 12) ; malloc sizeof mouse data @@ -24,29 +24,33 @@ (label draw-loop ; load mouse click data (syscall READ $16 $2 $3 $4) + (load-immediate $5 12) ; offset for btn1 + (add-nat $6 $5 $2) + (load-r8 $9 $6) ; load btn1 pressed + + (jump-eq-nat &draw-loop $9 $11) + (load-immediate $5 4) ; offset for x (add-nat $6 $5 $2) (load-r $7 $6) ; load x (load-immediate $5 8) ; offset for y (add-nat $6 $5 $2) (load-r $8 $6) ; load y - (load-immediate $5 12) ; offset for btn1 - (add-nat $6 $5 $2) - (load-r8 $9 $6) ; load btn1 pressed - (load-immediate $5 13) ; offset for btn2 - (add-nat $6 $5 $2) - (load-r8 $10 $6) ; load btn2 pressed - - (jump-eq-nat &draw-loop $9 $11) ; Compute start address: y*width + x (mul-nat $15 $8 $20) ; $15 = y * width (add-nat $15 $15 $7) ; $15 += x (add-nat $15 $21 $15) ; $15 = base + pixel_offset + (load-immediate $1 4) ; need to add offset for fat pointer size + (add-nat $15 $15 $1) (load $3 &WHITE) ; color (store-8 $15 $3) ; draw color at screen [x,y] - (syscall WRITE $0 $0 $0) ; redraw + (syscall WRITE $0 $21 $22) ; redraw + + (load-immediate $5 13) ; offset for btn2 + (add-nat $6 $5 $2) + (load-r8 $10 $6) ; load btn2 pressed (jump-eq-nat &draw-loop $10 $11)) (halt))