Compare commits
	
		
			No commits in common. "71622c31339d68300ba98aba5aa0a47a1123019a" and "19aa72018e41d9e23ec904feff3b76d44fc4b365" have entirely different histories.
		
	
	
		
			71622c3133
			...
			19aa72018e
		
	
		| 
						 | 
				
			
			@ -106,5 +106,4 @@ zre.wasm
 | 
			
		|||
memory_dump.bin
 | 
			
		||||
build/
 | 
			
		||||
.gdb_history
 | 
			
		||||
.vscode
 | 
			
		||||
.clangd
 | 
			
		||||
.vscode
 | 
			
		||||
| 
						 | 
				
			
			@ -79,13 +79,14 @@ 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,
 | 
			
		||||
    SDL_UpdateTexture(screen->texture, nil, &buffer[screen->pos],
 | 
			
		||||
                      screen->width);
 | 
			
		||||
 | 
			
		||||
    SDL_RenderClear(screen->renderer);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -146,9 +146,7 @@ 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);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -243,6 +241,9 @@ 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);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -253,6 +254,9 @@ 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,6 +1,7 @@
 | 
			
		|||
#ifndef ZRE_COMMON_H
 | 
			
		||||
#define ZRE_COMMON_H
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -11,10 +12,6 @@ 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,6 +5,8 @@
 | 
			
		|||
    (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
 | 
			
		||||
| 
						 | 
				
			
			@ -13,11 +15,10 @@
 | 
			
		|||
    (load-immediate $1 12) ; offset for width
 | 
			
		||||
    (add-nat $19 $18 $1)
 | 
			
		||||
    (load-r $20 $19) ; load width
 | 
			
		||||
    (load-immediate $1 8) ; offset for size
 | 
			
		||||
    (load-immediate $1 4) ; offset for width
 | 
			
		||||
    (add-nat $19 $18 $1)
 | 
			
		||||
    (load-r $22 $19) ; load size    
 | 
			
		||||
    (malloc $21 $22) ; malloc frame buffer
 | 
			
		||||
    (syscall WRITE $0 $21 $22)
 | 
			
		||||
    (load-r $21 $19) ; load base pointer
 | 
			
		||||
    (add-nat $21 $21 $1) ; need to add offset for fat pointer size
 | 
			
		||||
 | 
			
		||||
    (load-immediate $16 &mouse-namespace)
 | 
			
		||||
	  (load-immediate $3 12) ; malloc sizeof mouse data
 | 
			
		||||
| 
						 | 
				
			
			@ -42,8 +43,6 @@
 | 
			
		|||
      (load-immediate $14 20) ; box size
 | 
			
		||||
 | 
			
		||||
      ; first row
 | 
			
		||||
      (push $21)
 | 
			
		||||
      (push $20)
 | 
			
		||||
      (load $1 &BLACK)
 | 
			
		||||
      (push $1)
 | 
			
		||||
      (load-immediate $12 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -61,8 +60,6 @@
 | 
			
		|||
      (push $9)             ; is btn1 clicked?
 | 
			
		||||
      (call &set-color-if-clicked)
 | 
			
		||||
 | 
			
		||||
      (push $21)
 | 
			
		||||
      (push $20)
 | 
			
		||||
      (load $1 &WHITE)
 | 
			
		||||
      (push $1)
 | 
			
		||||
      (load-immediate $12 21)
 | 
			
		||||
| 
						 | 
				
			
			@ -81,8 +78,6 @@
 | 
			
		|||
      (call &set-color-if-clicked)
 | 
			
		||||
 | 
			
		||||
      ; row 2
 | 
			
		||||
      (push $21)   
 | 
			
		||||
      (push $20)   
 | 
			
		||||
      (load $1 &CHARCOAL)
 | 
			
		||||
      (push $1)
 | 
			
		||||
      (load-immediate $12 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -100,8 +95,6 @@
 | 
			
		|||
      (push $9)             ; is btn1 clicked?
 | 
			
		||||
      (call &set-color-if-clicked)
 | 
			
		||||
 | 
			
		||||
      (push $21)
 | 
			
		||||
      (push $20)
 | 
			
		||||
      (load $1 &DARK-GRAY)
 | 
			
		||||
      (push $1)
 | 
			
		||||
      (load-immediate $12 21)
 | 
			
		||||
| 
						 | 
				
			
			@ -120,8 +113,6 @@
 | 
			
		|||
      (call &set-color-if-clicked)
 | 
			
		||||
 | 
			
		||||
      ; row 3
 | 
			
		||||
      (push $21)    
 | 
			
		||||
      (push $20)  
 | 
			
		||||
      (load $1 &RED)
 | 
			
		||||
      (push $1)
 | 
			
		||||
      (load-immediate $12 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -139,8 +130,6 @@
 | 
			
		|||
      (push $9)             ; is btn1 clicked?
 | 
			
		||||
      (call &set-color-if-clicked)
 | 
			
		||||
 | 
			
		||||
      (push $21)
 | 
			
		||||
      (push $20)
 | 
			
		||||
      (load $1 &ORANGE)
 | 
			
		||||
      (push $1)
 | 
			
		||||
      (load-immediate $12 21)
 | 
			
		||||
| 
						 | 
				
			
			@ -159,8 +148,6 @@
 | 
			
		|||
      (call &set-color-if-clicked)
 | 
			
		||||
 | 
			
		||||
      ; row 3
 | 
			
		||||
      (push $21)      
 | 
			
		||||
      (push $20)
 | 
			
		||||
      (load $1 &YELLOW)
 | 
			
		||||
      (push $1)
 | 
			
		||||
      (load-immediate $12 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -178,8 +165,6 @@
 | 
			
		|||
      (push $9)             ; is btn1 clicked?
 | 
			
		||||
      (call &set-color-if-clicked)
 | 
			
		||||
 | 
			
		||||
      (push $21)
 | 
			
		||||
      (push $20)
 | 
			
		||||
      (load $1 &GREEN)
 | 
			
		||||
      (push $1)
 | 
			
		||||
      (load-immediate $12 21)
 | 
			
		||||
| 
						 | 
				
			
			@ -198,8 +183,6 @@
 | 
			
		|||
      (call &set-color-if-clicked)
 | 
			
		||||
 | 
			
		||||
      ; row 4
 | 
			
		||||
      (push $21)     
 | 
			
		||||
      (push $20) 
 | 
			
		||||
      (load $1 &BLUE)
 | 
			
		||||
      (push $1)
 | 
			
		||||
      (load-immediate $12 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -217,8 +200,6 @@
 | 
			
		|||
      (push $9)             ; is btn1 clicked?
 | 
			
		||||
      (call &set-color-if-clicked)
 | 
			
		||||
 | 
			
		||||
      (push $21)
 | 
			
		||||
      (push $20)
 | 
			
		||||
      (load $1 &PURPLE)
 | 
			
		||||
      (push $1)
 | 
			
		||||
      (load-immediate $12 21)
 | 
			
		||||
| 
						 | 
				
			
			@ -236,7 +217,7 @@
 | 
			
		|||
      (push $9)             ; is btn1 clicked?
 | 
			
		||||
      (call &set-color-if-clicked)
 | 
			
		||||
 | 
			
		||||
      (syscall WRITE $0 $21 $22)
 | 
			
		||||
      (syscall WRITE $0 $0 $0)
 | 
			
		||||
 | 
			
		||||
      (jump-eq-nat &draw-loop $9 $11)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -301,24 +282,13 @@
 | 
			
		|||
    (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
 | 
			
		||||
| 
						 | 
				
			
			@ -329,8 +299,6 @@
 | 
			
		|||
    (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
 | 
			
		||||
| 
						 | 
				
			
			@ -349,8 +317,20 @@
 | 
			
		|||
    (pop $13)        ; y_start
 | 
			
		||||
    (pop $11)        ; x_start
 | 
			
		||||
    (pop $3)         ; color
 | 
			
		||||
    (pop $2)         ; width
 | 
			
		||||
    (pop $21)        ; base
 | 
			
		||||
 | 
			
		||||
    ;; 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
 | 
			
		||||
 | 
			
		||||
    ; Constants
 | 
			
		||||
    (load-immediate $1 1)        ; increment
 | 
			
		||||
| 
						 | 
				
			
			@ -359,8 +339,6 @@
 | 
			
		|||
    (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,6 +3,7 @@
 | 
			
		|||
    (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
 | 
			
		||||
| 
						 | 
				
			
			@ -11,11 +12,10 @@
 | 
			
		|||
    (load-immediate $1 12) ; offset for width
 | 
			
		||||
    (add-nat $19 $18 $1)
 | 
			
		||||
    (load-r $20 $19) ; load width
 | 
			
		||||
    (load-immediate $1 8) ; offset for size
 | 
			
		||||
    (load-immediate $1 4) ; offset for width
 | 
			
		||||
    (add-nat $19 $18 $1)
 | 
			
		||||
    (load-r $22 $19) ; load size
 | 
			
		||||
    (malloc $21 $22) ; malloc frame buffer
 | 
			
		||||
    (syscall WRITE $0 $21 $22)
 | 
			
		||||
    (load-r $21 $19) ; load base pointer
 | 
			
		||||
    (add-nat $21 $21 $1) ; need to add offset for fat pointer size
 | 
			
		||||
 | 
			
		||||
    (load-immediate $16 &mouse-namespace)
 | 
			
		||||
	  (load-immediate $3 12) ; malloc sizeof mouse data
 | 
			
		||||
| 
						 | 
				
			
			@ -24,33 +24,29 @@
 | 
			
		|||
    (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 $21 $22) ; redraw
 | 
			
		||||
 | 
			
		||||
      (load-immediate $5 13) ; offset for btn2
 | 
			
		||||
      (add-nat $6 $5 $2)
 | 
			
		||||
      (load-r8 $10 $6) ; load btn2 pressed
 | 
			
		||||
      (syscall WRITE $0 $0 $0) ; redraw
 | 
			
		||||
 | 
			
		||||
      (jump-eq-nat &draw-loop $10 $11))
 | 
			
		||||
    (halt))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue