diff --git a/src/arch/linux/main.c b/src/arch/linux/main.c index 3e6ab64..a12117d 100644 --- a/src/arch/linux/main.c +++ b/src/arch/linux/main.c @@ -419,16 +419,14 @@ i32 main(i32 argc, char *argv[]) { while (running) { #ifdef ASM_DEBUG - printf("| %d %s %d\n", vm.code[vm.pc], opcode_to_string(vm.code[vm.pc]), - vm.pc); + printf("| %s %d\n", opcode_to_string(vm.code[vm.pc]),vm.pc); #endif running = step_vm(&vm); } } else { while (running) { #ifdef ASM_DEBUG - printf("| %d %s %d\n", vm.code[vm.pc], opcode_to_string(vm.code[vm.pc]), - vm.pc); + printf("| %s %d\n", opcode_to_string(vm.code[vm.pc]),vm.pc); #endif running = step_vm(&vm); } diff --git a/test/box.asm.lisp b/test/box.asm.lisp index 94ac2cf..9dd311e 100644 --- a/test/box.asm.lisp +++ b/test/box.asm.lisp @@ -3,11 +3,23 @@ ; Open screen ; use load immediate because it is a pointer to a string, not a value (load-immediate $0 &screen-namespace) - (load-immediate $1 0) - (syscall OPEN $0 $1) + (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 + (malloc $18 $17) + (syscall IOCTL $0 $16 $18) + (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 + (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-immediate $16 &mouse-namespace) (load-immediate $3 12) ; malloc sizeof mouse data (malloc $4 $3) @@ -28,103 +40,244 @@ (add-nat $6 $5 $2) (load-r8 $10 $6) ; load btn2 pressed + (load-immediate $14 20) ; box size + ; first row (load $1 &BLACK) (push $1) - (load-immediate $1 1) - (push $1) - (load-immediate $1 1) - (push $1) + (load-immediate $12 1) + (push $12) + (load-immediate $13 1) + (push $13) (call &draw-outlined-swatch) + (push $14) ; box_size (20) + (push $13) ; box_y + (push $12) ; box_x + (push $8) ; click_y + (push $7) ; click_x + (push $1) ; color + (push $9) ; is btn1 clicked? + (call &set-color-if-clicked) + (load $1 &WHITE) (push $1) - (load-immediate $1 21) - (push $1) - (load-immediate $1 1) - (push $1) + (load-immediate $12 21) + (push $12) + (load-immediate $13 1) + (push $13) (call &draw-outlined-swatch) + (push $14) ; box_size (20) + (push $13) ; box_y + (push $12) ; box_x + (push $8) ; click_y + (push $7) ; click_x + (push $1) ; color + (push $9) ; is btn1 clicked? + (call &set-color-if-clicked) + ; row 2 (load $1 &CHARCOAL) (push $1) - (load-immediate $1 1) - (push $1) - (load-immediate $1 21) - (push $1) + (load-immediate $12 1) + (push $12) + (load-immediate $13 21) + (push $13) (call &draw-outlined-swatch) + (push $14) ; box_size (20) + (push $13) ; box_y + (push $12) ; box_x + (push $8) ; click_y + (push $7) ; click_x + (push $1) ; color + (push $9) ; is btn1 clicked? + (call &set-color-if-clicked) + (load $1 &DARK-GRAY) (push $1) - (load-immediate $1 21) - (push $1) - (load-immediate $1 21) - (push $1) + (load-immediate $12 21) + (push $12) + (load-immediate $13 21) + (push $13) (call &draw-outlined-swatch) + (push $14) ; box_size (20) + (push $13) ; box_y + (push $12) ; box_x + (push $8) ; click_y + (push $7) ; click_x + (push $1) ; color + (push $9) ; is btn1 clicked? + (call &set-color-if-clicked) + ; row 3 (load $1 &RED) (push $1) - (load-immediate $1 1) - (push $1) - (load-immediate $1 41) - (push $1) + (load-immediate $12 1) + (push $12) + (load-immediate $13 41) + (push $13) (call &draw-outlined-swatch) + (push $14) ; box_size (20) + (push $13) ; box_y + (push $12) ; box_x + (push $8) ; click_y + (push $7) ; click_x + (push $1) ; color + (push $9) ; is btn1 clicked? + (call &set-color-if-clicked) + (load $1 &ORANGE) (push $1) - (load-immediate $1 21) - (push $1) - (load-immediate $1 41) - (push $1) + (load-immediate $12 21) + (push $12) + (load-immediate $13 41) + (push $13) (call &draw-outlined-swatch) + (push $14) ; box_size (20) + (push $13) ; box_y + (push $12) ; box_x + (push $8) ; click_y + (push $7) ; click_x + (push $1) ; color + (push $9) ; is btn1 clicked? + (call &set-color-if-clicked) + ; row 3 (load $1 &YELLOW) (push $1) - (load-immediate $1 1) - (push $1) - (load-immediate $1 61) - (push $1) + (load-immediate $12 1) + (push $12) + (load-immediate $13 61) + (push $13) (call &draw-outlined-swatch) + (push $14) ; box_size (20) + (push $13) ; box_y + (push $12) ; box_x + (push $8) ; click_y + (push $7) ; click_x + (push $1) ; color + (push $9) ; is btn1 clicked? + (call &set-color-if-clicked) + (load $1 &GREEN) (push $1) - (load-immediate $1 21) - (push $1) - (load-immediate $1 61) - (push $1) + (load-immediate $12 21) + (push $12) + (load-immediate $13 61) + (push $13) (call &draw-outlined-swatch) + (push $14) ; box_size (20) + (push $13) ; box_y + (push $12) ; box_x + (push $8) ; click_y + (push $7) ; click_x + (push $1) ; color + (push $9) ; is btn1 clicked? + (call &set-color-if-clicked) + ; row 4 (load $1 &BLUE) (push $1) - (load-immediate $1 1) - (push $1) - (load-immediate $1 81) - (push $1) + (load-immediate $12 1) + (push $12) + (load-immediate $13 81) + (push $13) (call &draw-outlined-swatch) + (push $14) ; box_size (20) + (push $13) ; box_y + (push $12) ; box_x + (push $8) ; click_y + (push $7) ; click_x + (push $1) ; color + (push $9) ; is btn1 clicked? + (call &set-color-if-clicked) + (load $1 &PURPLE) (push $1) - (load-immediate $1 21) - (push $1) - (load-immediate $1 81) - (push $1) + (load-immediate $12 21) + (push $12) + (load-immediate $13 81) + (push $13) (call &draw-outlined-swatch) + (push $14) ; box_size (20) + (push $13) ; box_y + (push $12) ; box_x + (push $8) ; click_y + (push $7) ; click_x + (push $1) ; color + (push $9) ; is btn1 clicked? + (call &set-color-if-clicked) + (syscall WRITE $0 $0 $0) + (jump-eq-nat &draw-loop $9 $11) - ; if click on box then switch color + (mul-nat $15 $8 $20) ; $15 = y * width + (add-nat $15 $15 $7) ; $15 += x + (add-nat $15 $21 $15) ; $15 = base + pixel_offset - ; else draw the pixel + (load $22 &SELECTED-COLOR) ; color + (store-8 $15 $22) ; draw color at screen [x,y] (jump-eq-nat &draw-loop $10 $11)) ; Flush and halt (halt)) + (label set-color-if-clicked + ; Pop inputs from stack (in reverse order of pushing) + (pop $12) ; $12 = btn1 down? + (pop $11) ; $11 = color + (pop $0) ; $0 = click_x + (pop $1) ; $1 = click_y + (pop $2) ; $2 = box_x + (pop $3) ; $3 = box_y + (pop $5) ; $5 = box_size + + ; Compute right = box_x + box_size + (add-int $6 $2 $5) ; $6 = right edge + + ; Compute bottom = box_y + box_size + (add-int $7 $3 $5) ; $7 = bottom edge + + ; Check 1: click_x >= box_x ? + (jump-ge-int &check2 $0 $2) + (return) + + (label check2) + ; Check 2: click_x <= right ? + (jump-le-int &check3 $0 $6) + (return) + + (label check3) + ; Check 3: click_y >= box_y ? + (jump-ge-int &check4 $1 $3) + (return) + + (label check4) + ; Check 4: click_y <= bottom ? + (jump-le-int &check5 $1 $7) + (return) + + (label check5) ; if it was selected then set the color + (load-immediate $13 1) + (jump-eq-int &set-color $12 $13) + (return) + + (label set-color) + (load-immediate $10 &SELECTED-COLOR) + (store-8 $10 $11) + (return)) + (label draw-outlined-swatch (pop $3) ; y (pop $2) ; x @@ -207,6 +360,7 @@ (data (label screen-namespace "/dev/screen/0") (label mouse-namespace "/dev/mouse/0") + (label SELECTED-COLOR 255) (label BLACK 0) (label WHITE 255) (label CHARCOAL 36)