Compare commits
2 Commits
19aa72018e
...
71622c3133
Author | SHA1 | Date |
---|---|---|
|
71622c3133 | |
|
a5901e7399 |
|
@ -106,4 +106,5 @@ zre.wasm
|
|||
memory_dump.bin
|
||||
build/
|
||||
.gdb_history
|
||||
.vscode
|
||||
.vscode
|
||||
.clangd
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -952,4 +952,4 @@ void assemble(VM *vm, ExprNode *program) {
|
|||
free(table.symbols[i].name);
|
||||
}
|
||||
free(table.symbols);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -251,4 +251,4 @@ void expr_print(ExprNode *node, int indent) {
|
|||
expr_print(node->children[i], indent + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,4 +22,4 @@ void expr_free(ExprNode *node);
|
|||
void expr_print(ExprNode *node, int indent);
|
||||
void *safe_malloc(size_t size);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
#ifndef ZRE_COMMON_H
|
||||
#define ZRE_COMMON_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
#endif
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue