new ui, control panel kinda works, display works, framebuffer works, serial write works. widget for registers works. next is serial input and the editor
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
dw DISPLAY: 0x30000
|
||||
dw stack: 0x10000
|
||||
|
||||
// registers:
|
||||
// rg0 = x position
|
||||
// rg1 = y position
|
||||
// rg2 = x direction (1 = right, 0 = left)
|
||||
// rg3 = y direction (1 = down, 0 = up)
|
||||
|
||||
_init:
|
||||
ldw stack, bpr
|
||||
mov bpr, spr
|
||||
|
||||
start:
|
||||
lli 0, rg0
|
||||
lli 0, rg1
|
||||
lli 1, rg2
|
||||
lli 1, rg3
|
||||
|
||||
frame_loop:
|
||||
// --- clear display ---
|
||||
ldw DISPLAY, rg4
|
||||
lwi 76800, rg5
|
||||
|
||||
clear_loop:
|
||||
stw zero, rg4
|
||||
addi rg4, 4, rg4
|
||||
subi rg5, 1, rg5
|
||||
jnz rg5, clear_loop
|
||||
|
||||
// --- draw square ---
|
||||
mov rg1, rg6
|
||||
|
||||
draw_y_loop:
|
||||
lli 20, rg8
|
||||
add rg1, rg8, rg8
|
||||
ilt rg6, rg8, rg9
|
||||
jez rg9, draw_done
|
||||
|
||||
mov rg0, rg7
|
||||
|
||||
draw_x_loop:
|
||||
lli 20, rg8
|
||||
add rg0, rg8, rg8
|
||||
ilt rg7, rg8, rg9
|
||||
jez rg9, draw_x_done
|
||||
|
||||
shl rg6, 8, rg8
|
||||
shl rg6, 6, rg9
|
||||
add rg8, rg9, rg8
|
||||
add rg8, rg7, rg8
|
||||
shl rg8, 2, rg8
|
||||
ldw DISPLAY, rg9
|
||||
add rg9, rg8, rg8
|
||||
|
||||
lli 0xFFFF, rg9
|
||||
lui 0xFFFF, rg9
|
||||
stw rg9, rg8
|
||||
|
||||
addi rg7, 1, rg7
|
||||
jmp draw_x_loop
|
||||
|
||||
draw_x_done:
|
||||
addi rg6, 1, rg6
|
||||
jmp draw_y_loop
|
||||
|
||||
draw_done:
|
||||
// --- check x walls before moving ---
|
||||
lli 1, rg8
|
||||
ieq rg2, rg8, rg9
|
||||
jez rg9, check_x_left_wall
|
||||
|
||||
check_x_right_wall:
|
||||
// moving right: if x >= 300 flip direction
|
||||
lli 300, rg8
|
||||
ige rg0, rg8, rg9
|
||||
jez rg9, move_x
|
||||
lli 0, rg2
|
||||
jmp move_x
|
||||
|
||||
check_x_left_wall:
|
||||
// moving left: if x == 0 flip direction
|
||||
ieq rg0, zero, rg9
|
||||
jez rg9, move_x
|
||||
lli 1, rg2
|
||||
|
||||
move_x:
|
||||
lli 1, rg8
|
||||
ieq rg2, rg8, rg9
|
||||
jez rg9, do_x_left
|
||||
addi rg0, 1, rg0
|
||||
jmp check_y_walls
|
||||
do_x_left:
|
||||
subi rg0, 1, rg0
|
||||
|
||||
check_y_walls:
|
||||
// --- check y walls before moving ---
|
||||
lli 1, rg8
|
||||
ieq rg3, rg8, rg9
|
||||
jez rg9, check_y_up_wall
|
||||
|
||||
check_y_down_wall:
|
||||
// moving down: if y >= 220 flip direction
|
||||
lli 220, rg8
|
||||
ige rg1, rg8, rg9
|
||||
jez rg9, move_y
|
||||
lli 0, rg3
|
||||
jmp move_y
|
||||
|
||||
check_y_up_wall:
|
||||
// moving up: if y == 0 flip direction
|
||||
ieq rg1, zero, rg9
|
||||
jez rg9, move_y
|
||||
lli 1, rg3
|
||||
|
||||
move_y:
|
||||
lli 1, rg8
|
||||
ieq rg3, rg8, rg9
|
||||
jez rg9, do_y_up
|
||||
addi rg1, 1, rg1
|
||||
jmp delay
|
||||
do_y_up:
|
||||
subi rg1, 1, rg1
|
||||
|
||||
delay:
|
||||
lwi 2000000, rg8
|
||||
delay_loop:
|
||||
subi rg8, 1, rg8
|
||||
jnz rg8, delay_loop
|
||||
|
||||
jmp frame_loop
|
||||
|
||||
hlt
|
||||
+47
-2
@@ -3,7 +3,7 @@
|
||||
|
||||
include print "./print.dsa"
|
||||
|
||||
// "print hello world"
|
||||
// "prints first 16 fibonacci numbers"
|
||||
db program: "++++++++++++++++++++++++++++++++++++++++++++
|
||||
>++++++++++++++++++++++++++++++++
|
||||
>++++++++++++++++
|
||||
@@ -35,6 +35,7 @@ db program: "++++++++++++++++++++++++++++++++++++++++++++
|
||||
<<++..."
|
||||
|
||||
db error: "Invalid Instruction!"
|
||||
dh counter: 0xFF
|
||||
dw stack: 0x10000
|
||||
dw input: 0x30000
|
||||
resb data: 1024
|
||||
@@ -44,11 +45,15 @@ _init_stack:
|
||||
ldw stack, bpr
|
||||
mov bpr, spr
|
||||
|
||||
init:
|
||||
ldw counter, rg7
|
||||
|
||||
start:
|
||||
call bf_reset
|
||||
|
||||
// load the start of the program into rg0
|
||||
lwi program, rg0
|
||||
lwi data, rg1
|
||||
|
||||
// rg0 is our instruction pointer
|
||||
// rg1 is our data pointer
|
||||
// rg2 is the value at the data pointer
|
||||
@@ -98,7 +103,16 @@ loop_start:
|
||||
pop rg1
|
||||
pop rg0
|
||||
|
||||
db success: "Success!"
|
||||
end:
|
||||
call print::newline
|
||||
lwi success, rg0
|
||||
push rg0
|
||||
call print::print
|
||||
pop zero
|
||||
|
||||
subi rg7, 1
|
||||
jnz rg7, start
|
||||
hlt
|
||||
|
||||
loop_end:
|
||||
@@ -225,3 +239,34 @@ close_left:
|
||||
// push zero to the stack
|
||||
push zero
|
||||
jmp _traverse_left
|
||||
|
||||
|
||||
// ------------------------------------------
|
||||
// reset interpreter
|
||||
// clears screen, resets cursor and clears data buffer.
|
||||
bf_reset: func
|
||||
push rg0
|
||||
push rg1
|
||||
|
||||
// clear screen and reset cursor
|
||||
call print::clear
|
||||
call print::reset
|
||||
|
||||
// clear data buffer (resb data: 1024 = 256 words)
|
||||
lli 256, rg0
|
||||
lwi data, rg1
|
||||
_bf_reset_clear_data:
|
||||
subi rg0, 1, rg0
|
||||
stw zero, rg1
|
||||
addi rg1, 4, rg1
|
||||
igt rg0, zero, rg4
|
||||
jnz rg4, _bf_reset_clear_data
|
||||
|
||||
pop rg1
|
||||
pop rg0
|
||||
|
||||
// reload interpreter state
|
||||
lwi program, rg0
|
||||
lwi data, rg1
|
||||
lli 0, rg2
|
||||
return
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
|
||||
include print: "./print.dsa"
|
||||
|
||||
db success: "Success!"
|
||||
dw framebuffer: 0x30000
|
||||
dw stack: 0x10000
|
||||
|
||||
_init:
|
||||
ldw stack, bpr
|
||||
mov bpr, spr
|
||||
|
||||
start:
|
||||
ldw framebuffer, rg0 // rg0 = display base address
|
||||
lli 0, rg1 // rg1 = y (0..240)
|
||||
|
||||
y_loop:
|
||||
lli 0, rg2 // rg2 = x (0..320)
|
||||
|
||||
x_loop:
|
||||
// red = x >> 1 (0..159, left to right gradient)
|
||||
shr rg2, zero, 1, rg4
|
||||
|
||||
// green = y (0..239, top to bottom gradient)
|
||||
mov rg1, rg5
|
||||
|
||||
// blue = constant 128
|
||||
lli 0x80, rg6
|
||||
|
||||
// pack as 0xAABBGGRR (LE reads as RGBA)
|
||||
// start with red in bits 0-7
|
||||
mov rg4, rg7
|
||||
|
||||
// green into bits 8-15
|
||||
shl rg5, zero, 8, rg5
|
||||
or rg7, rg5, rg7
|
||||
|
||||
// blue into bits 16-23
|
||||
shl rg6, zero, 16, rg6
|
||||
or rg7, rg6, rg7
|
||||
|
||||
// alpha into bits 24-31
|
||||
lli 0xFF, rg6
|
||||
shl rg6, zero, 24, rg6
|
||||
or rg7, rg6, rg7
|
||||
|
||||
stw rg7, rg0 // write pixel
|
||||
addi rg0, 4, rg0 // next pixel
|
||||
|
||||
addi rg2, 1, rg2
|
||||
lli 320, rg6
|
||||
ilt rg2, rg6, rg6
|
||||
jnz rg6, x_loop
|
||||
|
||||
addi rg1, 1, rg1
|
||||
lli 240, rg6
|
||||
ilt rg1, rg6, rg6
|
||||
jnz rg6, y_loop
|
||||
|
||||
|
||||
_end:
|
||||
lwi success: rg0
|
||||
push rg0
|
||||
call print::print
|
||||
pop zero
|
||||
hlt
|
||||
Binary file not shown.
+25
-2
@@ -185,8 +185,8 @@ print_whitespace: func
|
||||
addi rg1, 1
|
||||
jmp _end
|
||||
|
||||
// // ------------------------------------------
|
||||
// // print newline
|
||||
// ------------------------------------------
|
||||
// print newline
|
||||
// print_newline:
|
||||
// push bpr
|
||||
// mov spr, bpr
|
||||
@@ -214,6 +214,29 @@ print_whitespace: func
|
||||
|
||||
// jmp _end
|
||||
|
||||
newline:
|
||||
push bpr
|
||||
mov spr, bpr
|
||||
|
||||
ldw display, rg0
|
||||
ldw current, rg1
|
||||
|
||||
sub rg1, rg0, rg2 // offset from base
|
||||
lli 80, rg3
|
||||
|
||||
_newline_mod:
|
||||
ilt rg2, rg3, rg4
|
||||
jnz rg4, _newline_done
|
||||
sub rg2, rg3, rg2
|
||||
jmp _newline_mod
|
||||
|
||||
_newline_done:
|
||||
// rg2 = offset % 80 (position within current line)
|
||||
sub rg1, rg2, rg1 // go back to line start
|
||||
addi rg1, 80, rg1 // advance to next line
|
||||
|
||||
jmp _end
|
||||
|
||||
// ------------------------------------------
|
||||
// prints arg[0] as a decimal number to the screen.
|
||||
// print_num:
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
// lib:
|
||||
// serial.dsa
|
||||
//
|
||||
// usage:
|
||||
// include serial "<relative path>"
|
||||
//
|
||||
// push (register containing address of string)
|
||||
// call serial::print
|
||||
//
|
||||
// push (register containing byte)
|
||||
// call serial::print_byte
|
||||
|
||||
dw uart: 0x40000
|
||||
|
||||
// ------------------------------------------
|
||||
// transmit a single byte via sentinel protocol
|
||||
// expects: byte in rg0, trashes rg2, rg3, rg4, rg5
|
||||
_serial_send:
|
||||
shl rg0, 16, rg2 // shift byte to bits [23:16]
|
||||
lli 0x01, rg0
|
||||
shl rg0, 24, rg0 // valid flag in bits [31:24]
|
||||
or rg0, rg2, rg2 // rg2 = 0x01_XX_0000
|
||||
|
||||
ldw uart, rg5 // rg5 = 0x40000 (uart address, held for store)
|
||||
|
||||
_serial_wait:
|
||||
ldw rg5, rg0 // poll mem[0x40000]
|
||||
shr rg0, 24, rg0
|
||||
lli 0x01, rg3
|
||||
ieq rg0, rg3, rg4
|
||||
jnz rg4, _serial_wait // loop while valid == 1
|
||||
|
||||
stw rg2, rg5 // mem[0x40000] = sentinel word
|
||||
ret
|
||||
|
||||
// ------------------------------------------
|
||||
// prints the null-terminated string at addr(arg[0])
|
||||
print: func
|
||||
ldw bpr, rg0, 8 // load string address from arg
|
||||
|
||||
_serial_print_loop:
|
||||
ldb rg0, rg2 // load byte
|
||||
ieq rg2, zero, rg4 // null terminator?
|
||||
jnz rg4, _serial_end
|
||||
|
||||
push rg0 // save string pointer
|
||||
mov rg2, rg0
|
||||
call _serial_send
|
||||
pop rg0
|
||||
|
||||
addi rg0, 1
|
||||
jmp _serial_print_loop
|
||||
|
||||
// ------------------------------------------
|
||||
// prints the last byte of arg[0]
|
||||
print_byte: func
|
||||
ldw bpr, rg0, 8
|
||||
call _serial_send
|
||||
jmp _serial_end
|
||||
|
||||
// ------------------------------------------
|
||||
_serial_end:
|
||||
return
|
||||
@@ -0,0 +1,14 @@
|
||||
include serial: "./serial.dsa"
|
||||
|
||||
dw stack: 0x1000
|
||||
_init:
|
||||
ldw stack, bpr
|
||||
mov bpr, spr
|
||||
|
||||
db hello: "Serial works lol. this took ages and some clanker forgetting to dereference a pointer."
|
||||
main:
|
||||
lwi hello, rg0
|
||||
push rg0
|
||||
call serial::print
|
||||
pop zero
|
||||
hlt
|
||||
Reference in New Issue
Block a user