Compare commits

...

2 Commits

Author SHA1 Message Date
zongor 71622c3133 add clangd to gitignore 2025-10-05 12:24:59 -07:00
zongor a5901e7399 get rid of hardcoded device buffers 2025-10-05 12:24:01 -07:00
10 changed files with 72 additions and 47 deletions

1
.gitignore vendored
View File

@ -107,3 +107,4 @@ memory_dump.bin
build/
.gdb_history
.vscode
.clangd

View File

@ -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);

View File

@ -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);

View File

@ -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))

View File

@ -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

View File

@ -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))