terminal: Support multiple colors
This commit is contained in:
parent
2a8eb5b267
commit
cae9ffdd28
|
@ -11,6 +11,11 @@
|
||||||
mov r7, 0
|
mov r7, 0
|
||||||
call new_window
|
call new_window
|
||||||
|
|
||||||
|
; fill the window with the "black" color
|
||||||
|
mov r0, [colors]
|
||||||
|
mov r1, window_struct
|
||||||
|
call fill_window
|
||||||
|
|
||||||
; start an instance of sh.fxf
|
; start an instance of sh.fxf
|
||||||
call get_unused_task_id
|
call get_unused_task_id
|
||||||
mov.8 [shell_task_id], r0
|
mov.8 [shell_task_id], r0
|
||||||
|
|
|
@ -3,13 +3,11 @@
|
||||||
const TERMINAL_X_SIZE: 40
|
const TERMINAL_X_SIZE: 40
|
||||||
const TERMINAL_Y_SIZE: 25
|
const TERMINAL_Y_SIZE: 25
|
||||||
|
|
||||||
const TEXT_COLOR: 0xFFFFFFFF
|
const FILL_TERM: 0xF0
|
||||||
const BACKGROUND_COLOR: 0xFF000000
|
|
||||||
|
|
||||||
const FILL_TERM: 0xF0
|
|
||||||
const MOVE_CURSOR: 0xF1
|
const MOVE_CURSOR: 0xF1
|
||||||
|
const SET_COLOR: 0xF2
|
||||||
const REDRAW_LINE: 0xFE
|
const REDRAW_LINE: 0xFE
|
||||||
const REDRAW: 0xFF
|
const REDRAW: 0xFF
|
||||||
|
|
||||||
; print a string to the terminal
|
; print a string to the terminal
|
||||||
; inputs:
|
; inputs:
|
||||||
|
@ -51,6 +49,7 @@ print_character_to_terminal_allow:
|
||||||
push r0
|
push r0
|
||||||
push r1
|
push r1
|
||||||
push r2
|
push r2
|
||||||
|
push r3
|
||||||
|
|
||||||
cmp.8 r0, 0 ; null
|
cmp.8 r0, 0 ; null
|
||||||
ifz jmp print_character_to_terminal_end
|
ifz jmp print_character_to_terminal_end
|
||||||
|
@ -71,15 +70,23 @@ print_character_to_terminal_allow:
|
||||||
cmp.8 [terminal_y], TERMINAL_Y_SIZE
|
cmp.8 [terminal_y], TERMINAL_Y_SIZE
|
||||||
ifgteq call scroll_terminal
|
ifgteq call scroll_terminal
|
||||||
|
|
||||||
; calculate coords for character...
|
; calculate coords for character
|
||||||
movz.8 r1, [terminal_x]
|
movz.8 r1, [terminal_x]
|
||||||
movz.8 r2, [terminal_y]
|
movz.8 r2, [terminal_y]
|
||||||
mul r2, TERMINAL_X_SIZE
|
mul r2, TERMINAL_X_SIZE
|
||||||
add r1, r2
|
add r1, r2
|
||||||
add r1, terminal_text_buf
|
add r1, terminal_text_buf
|
||||||
|
|
||||||
; ...and print!!
|
; calculate coords for color
|
||||||
|
movz.8 r2, [terminal_x]
|
||||||
|
movz.8 r3, [terminal_y]
|
||||||
|
mul r3, TERMINAL_X_SIZE
|
||||||
|
add r2, r3
|
||||||
|
add r2, terminal_color_buf
|
||||||
|
|
||||||
|
; and print!!
|
||||||
mov.8 [r1], r0
|
mov.8 [r1], r0
|
||||||
|
mov.8 [r2], [terminal_current_color_attribute]
|
||||||
inc.8 [terminal_x]
|
inc.8 [terminal_x]
|
||||||
jmp print_character_to_terminal_end
|
jmp print_character_to_terminal_end
|
||||||
print_character_to_terminal_cr:
|
print_character_to_terminal_cr:
|
||||||
|
@ -101,6 +108,7 @@ print_character_to_terminal_bs:
|
||||||
cmp.8 [terminal_x], 0
|
cmp.8 [terminal_x], 0
|
||||||
ifnz dec.8 [terminal_x]
|
ifnz dec.8 [terminal_x]
|
||||||
print_character_to_terminal_end:
|
print_character_to_terminal_end:
|
||||||
|
pop r3
|
||||||
pop r2
|
pop r2
|
||||||
pop r1
|
pop r1
|
||||||
pop r0
|
pop r0
|
||||||
|
@ -140,18 +148,27 @@ handle_control_character:
|
||||||
cmp.8 [terminal_control_char], REDRAW
|
cmp.8 [terminal_control_char], REDRAW
|
||||||
ifz jmp handle_control_character_redraw
|
ifz jmp handle_control_character_redraw
|
||||||
|
|
||||||
|
; set color
|
||||||
|
cmp.8 [terminal_control_char], SET_COLOR
|
||||||
|
ifz jmp handle_control_character_set_color
|
||||||
|
|
||||||
ret
|
ret
|
||||||
handle_control_character_fill_term:
|
handle_control_character_fill_term:
|
||||||
push r0
|
push r0
|
||||||
|
push r1
|
||||||
push r31
|
push r31
|
||||||
mov r0, terminal_text_buf
|
mov r0, terminal_text_buf
|
||||||
|
mov r1, terminal_color_buf
|
||||||
mov r31, 1000
|
mov r31, 1000
|
||||||
handle_control_character_fill_term_loop:
|
handle_control_character_fill_term_loop:
|
||||||
mov.8 [r0], [terminal_control_parameter_1]
|
mov.8 [r0], [terminal_control_parameter_1]
|
||||||
|
mov.8 [r1], [terminal_current_color_attribute]
|
||||||
inc r0
|
inc r0
|
||||||
|
inc r1
|
||||||
loop handle_control_character_fill_term_loop
|
loop handle_control_character_fill_term_loop
|
||||||
call redraw_terminal
|
call redraw_terminal
|
||||||
pop r31
|
pop r31
|
||||||
|
pop r1
|
||||||
pop r0
|
pop r0
|
||||||
ret
|
ret
|
||||||
handle_control_character_set_cursor_pos:
|
handle_control_character_set_cursor_pos:
|
||||||
|
@ -165,6 +182,9 @@ handle_control_character_redraw_line:
|
||||||
handle_control_character_redraw:
|
handle_control_character_redraw:
|
||||||
call redraw_terminal
|
call redraw_terminal
|
||||||
ret
|
ret
|
||||||
|
handle_control_character_set_color:
|
||||||
|
mov.8 [terminal_current_color_attribute], [terminal_control_parameter_1]
|
||||||
|
ret
|
||||||
|
|
||||||
; scroll the terminal
|
; scroll the terminal
|
||||||
; inputs:
|
; inputs:
|
||||||
|
@ -177,6 +197,8 @@ scroll_terminal:
|
||||||
push r2
|
push r2
|
||||||
push r31
|
push r31
|
||||||
|
|
||||||
|
; copy text buffer
|
||||||
|
|
||||||
; source
|
; source
|
||||||
mov r0, terminal_text_buf
|
mov r0, terminal_text_buf
|
||||||
add r0, TERMINAL_X_SIZE
|
add r0, TERMINAL_X_SIZE
|
||||||
|
@ -191,16 +213,36 @@ scroll_terminal:
|
||||||
|
|
||||||
call copy_memory_words
|
call copy_memory_words
|
||||||
|
|
||||||
|
; copy color buffer
|
||||||
|
|
||||||
|
; source
|
||||||
|
mov r0, terminal_color_buf
|
||||||
|
add r0, TERMINAL_X_SIZE
|
||||||
|
|
||||||
|
; destination
|
||||||
|
mov r1, terminal_color_buf
|
||||||
|
|
||||||
|
; size
|
||||||
|
mov r2, TERMINAL_X_SIZE
|
||||||
|
mul r2, 24
|
||||||
|
div r2, 4
|
||||||
|
|
||||||
|
call copy_memory_words
|
||||||
|
|
||||||
mov.8 [terminal_x], 0
|
mov.8 [terminal_x], 0
|
||||||
mov.8 [terminal_y], 24
|
mov.8 [terminal_y], 24
|
||||||
|
|
||||||
; clear the last line
|
; clear the last line
|
||||||
mov r0, terminal_text_buf
|
mov r0, terminal_text_buf
|
||||||
|
mov r1, terminal_color_buf
|
||||||
add r0, 960 ; 40 * 24
|
add r0, 960 ; 40 * 24
|
||||||
|
add r1, 960 ; 40 * 24
|
||||||
mov r31, TERMINAL_X_SIZE
|
mov r31, TERMINAL_X_SIZE
|
||||||
scroll_terminal_clear_loop:
|
scroll_terminal_clear_loop:
|
||||||
mov.8 [r0], 0
|
mov.8 [r0], 0
|
||||||
|
mov.8 [r1], [terminal_current_color_attribute]
|
||||||
inc r0
|
inc r0
|
||||||
|
inc r1
|
||||||
loop scroll_terminal_clear_loop
|
loop scroll_terminal_clear_loop
|
||||||
|
|
||||||
; redraw the screen
|
; redraw the screen
|
||||||
|
@ -232,21 +274,18 @@ redraw_terminal:
|
||||||
mov r5, r0
|
mov r5, r0
|
||||||
|
|
||||||
mov r0, terminal_text_buf
|
mov r0, terminal_text_buf
|
||||||
mov r1, 0
|
|
||||||
mov r2, 16
|
mov r2, 16
|
||||||
mov r3, TEXT_COLOR
|
|
||||||
mov r4, BACKGROUND_COLOR
|
|
||||||
mov r31, TERMINAL_Y_SIZE
|
mov r31, TERMINAL_Y_SIZE
|
||||||
redraw_terminal_loop_y:
|
redraw_terminal_loop_y:
|
||||||
push r31
|
push r31
|
||||||
mov r1, 0
|
mov r1, 0
|
||||||
mov r31, TERMINAL_X_SIZE
|
mov r31, TERMINAL_X_SIZE
|
||||||
redraw_terminal_loop_x:
|
redraw_terminal_loop_x:
|
||||||
|
call get_color
|
||||||
push r0
|
push r0
|
||||||
movz.8 r0, [r0]
|
movz.8 r0, [r0]
|
||||||
call draw_font_tile_to_overlay
|
call draw_font_tile_to_overlay
|
||||||
movz.8 r0, 8
|
add r1, 8
|
||||||
add r1, r0
|
|
||||||
pop r0
|
pop r0
|
||||||
inc r0
|
inc r0
|
||||||
loop redraw_terminal_loop_x
|
loop redraw_terminal_loop_x
|
||||||
|
@ -293,18 +332,14 @@ redraw_terminal_line:
|
||||||
mul r2, r1
|
mul r2, r1
|
||||||
add r2, 16
|
add r2, 16
|
||||||
|
|
||||||
mov r1, 0
|
|
||||||
mov r3, TEXT_COLOR
|
|
||||||
mov r4, BACKGROUND_COLOR
|
|
||||||
|
|
||||||
mov r1, 0
|
mov r1, 0
|
||||||
mov r31, TERMINAL_X_SIZE
|
mov r31, TERMINAL_X_SIZE
|
||||||
redraw_terminal_line_loop_x:
|
redraw_terminal_line_loop_x:
|
||||||
|
call get_color
|
||||||
push r0
|
push r0
|
||||||
movz.8 r0, [r0]
|
movz.8 r0, [r0]
|
||||||
call draw_font_tile_to_overlay
|
call draw_font_tile_to_overlay
|
||||||
movz.8 r0, 8
|
add r1, 8
|
||||||
add r1, r0
|
|
||||||
pop r0
|
pop r0
|
||||||
inc r0
|
inc r0
|
||||||
loop redraw_terminal_line_loop_x
|
loop redraw_terminal_line_loop_x
|
||||||
|
@ -319,9 +354,62 @@ redraw_terminal_line_loop_x:
|
||||||
pop r0
|
pop r0
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
; get the text color at the specified position
|
||||||
|
; inputs:
|
||||||
|
; r1: X coordinate
|
||||||
|
; r2: Y coordinate
|
||||||
|
; outputs:
|
||||||
|
; r3: foreground color
|
||||||
|
; r4: background color
|
||||||
|
get_color:
|
||||||
|
push r1
|
||||||
|
push r2
|
||||||
|
|
||||||
|
; get the character buffer coords from the actual coords
|
||||||
|
sub r2, 16
|
||||||
|
div r1, 8
|
||||||
|
div r2, 16
|
||||||
|
|
||||||
|
; get the color attribute at the specified position
|
||||||
|
mul r2, TERMINAL_X_SIZE
|
||||||
|
add r2, r1
|
||||||
|
add r2, terminal_color_buf
|
||||||
|
movz.8 r2, [r2]
|
||||||
|
|
||||||
|
; get the foreground color
|
||||||
|
mov r3, r2
|
||||||
|
srl r3, 4
|
||||||
|
mul r3, 4
|
||||||
|
add r3, colors
|
||||||
|
mov r3, [r3]
|
||||||
|
|
||||||
|
; get the background color
|
||||||
|
mov r4, r2
|
||||||
|
and r4, 0x0F
|
||||||
|
mul r4, 4
|
||||||
|
add r4, colors
|
||||||
|
mov r4, [r4]
|
||||||
|
|
||||||
|
pop r2
|
||||||
|
pop r1
|
||||||
|
ret
|
||||||
|
|
||||||
|
colors:
|
||||||
|
data.32 0xff2e1e1e ; black
|
||||||
|
data.32 0xffa88bf3 ; red
|
||||||
|
data.32 0xffa1e3a6 ; green
|
||||||
|
data.32 0xffafe2f9 ; yellow
|
||||||
|
data.32 0xfffab489 ; blue
|
||||||
|
data.32 0xffaca0eb ; magenta
|
||||||
|
data.32 0xffd5e294 ; cyan
|
||||||
|
data.32 0xfff4d6cd ; white
|
||||||
|
data.32 0x00000000 ; transparent
|
||||||
|
|
||||||
terminal_x: data.8 0
|
terminal_x: data.8 0
|
||||||
terminal_y: data.8 0
|
terminal_y: data.8 0
|
||||||
terminal_text_buf: data.fill 0, 1000 ; 40x25 = 1000 bytes
|
terminal_text_buf: data.fill 0, 1000 ; 40x25 = 1000 bytes
|
||||||
|
terminal_color_buf: data.fill 0x70, 1000 ; 40x25 = 1000 bytes
|
||||||
|
terminal_current_color_attribute: data.8 0x70
|
||||||
terminal_state: data.8 0 ; 0: normal, 1: awaiting first control parameter, 2: awaiting second control parameter
|
terminal_state: data.8 0 ; 0: normal, 1: awaiting first control parameter, 2: awaiting second control parameter
|
||||||
terminal_control_char: data.8 0
|
terminal_control_char: data.8 0
|
||||||
terminal_control_parameter_1: data.8 0
|
terminal_control_parameter_1: data.8 0
|
||||||
|
|
Loading…
Reference in New Issue
Block a user