continuing with serial driver in dsa.

This commit is contained in:
2026-03-16 23:18:53 +00:00
parent 6061e1701e
commit ffdd392003
7 changed files with 186 additions and 94 deletions
+48 -19
View File
@@ -1,11 +1,20 @@
dw DISPLAY: 0x30000
dw stack: 0x10000
// colour table — AABBGGRR format
dw COL0: 0xFFFFFFFF // white
dw COL1: 0xFF0000FF // red
dw COL2: 0xFF00FF00 // green
dw COL3: 0xFFFF0000 // blue
dw COL4: 0xFF00FFFF // yellow
dw COL_IDX: 0
// registers:
// rg0 = x position
// rg1 = y position
// rg2 = x direction (1 = right, 0 = left)
// rg3 = y direction (1 = down, 0 = up)
// rg5 = current colour
_init:
ldw stack, bpr
@@ -16,17 +25,20 @@ start:
lli 0, rg1
lli 1, rg2
lli 1, rg3
lli 0, rg8
stw rg8, COL_IDX
ldw COL0, rg5
frame_loop:
// --- clear display ---
ldw DISPLAY, rg4
lwi 76800, rg5
lwi 76800, rga
clear_loop:
stw zero, rg4
addi rg4, 4, rg4
subi rg5, 1, rg5
jnz rg5, clear_loop
subi rga, 1, rga
jnz rga, clear_loop
// --- draw square ---
mov rg1, rg6
@@ -36,7 +48,6 @@ draw_y_loop:
add rg1, rg8, rg8
ilt rg6, rg8, rg9
jez rg9, draw_done
mov rg0, rg7
draw_x_loop:
@@ -44,7 +55,6 @@ draw_x_loop:
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
@@ -52,11 +62,7 @@ draw_x_loop:
shl rg8, 2, rg8
ldw DISPLAY, rg9
add rg9, rg8, rg8
lli 0xFFFF, rg9
lui 0xFFFF, rg9
stw rg9, rg8
stw rg5, rg8
addi rg7, 1, rg7
jmp draw_x_loop
@@ -65,24 +71,28 @@ draw_x_done:
jmp draw_y_loop
draw_done:
// --- check x walls before moving ---
// --- track bounces this frame ---
lli 0, rgb
lli 0, rgc
// --- check x walls ---
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
lli 1, rgb
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
lli 1, rgb
move_x:
lli 1, rg8
@@ -94,40 +104,59 @@ 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
lli 1, rgc
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
lli 1, rgc
move_y:
lli 1, rg8
ieq rg3, rg8, rg9
jez rg9, do_y_up
addi rg1, 1, rg1
jmp delay
jmp check_corner
do_y_up:
subi rg1, 1, rg1
check_corner:
and rgb, rgc, rg8
jez rg8, delay
// advance colour index
ldw COL_IDX, rg8
addi rg8, 1, rg8
lli 5, rg9
ige rg8, rg9, rg9
jez rg9, store_col_idx
lli 0, rg8
store_col_idx:
stw rg8, COL_IDX
// load colour from table: address = COL0 + idx * 4
shl rg8, 2, rg8
lwi COL0, rg9
add rg9, rg8, rg8
ldw rg8, rg5
delay:
lwi 2000000, rg8
delay_loop:
subi rg8, 1, rg8
jnz rg8, delay_loop
jmp frame_loop
hlt
hlt