Add new debug board - dbgboard based on console.obj (#119)
All checks were successful
Build system / Check kernel codestyle (push) Successful in 29s
Build system / Build (push) Successful in 8m14s

Main advantages:
- Bigger font
- Scrolling (like in other console apps)
- K : and L: messages highligting

Also, like the old board it writes log to /tmp0/1/boardlog.txt (or you can pass another path in args), can view it on F2

Co-authored-by: rgimad <33692565+rgimad@users.noreply.github.com>
Reviewed-on: #119
Reviewed-by: Max Logaev <maxlogaev@proton.me>
Co-authored-by: rgimad <rgimad@noreply.localhost>
Co-committed-by: rgimad <rgimad@noreply.localhost>
This commit is contained in:
2025-03-07 23:42:10 +01:00
committed by Max Logaev
parent 92ea2a97eb
commit 1d567fc520
11 changed files with 775 additions and 12 deletions

View File

@@ -468,6 +468,7 @@ tup.append_table(img_files, {
{"DEMOS/ZEROLINE", VAR_PROGS .. "/demos/zeroline/trunk/zeroline"}, {"DEMOS/ZEROLINE", VAR_PROGS .. "/demos/zeroline/trunk/zeroline"},
{"DEVELOP/ASCIIVJU", VAR_PROGS .. "/develop/asciivju/trunk/asciivju"}, {"DEVELOP/ASCIIVJU", VAR_PROGS .. "/develop/asciivju/trunk/asciivju"},
{"DEVELOP/BOARD", VAR_PROGS .. "/system/board/trunk/board"}, {"DEVELOP/BOARD", VAR_PROGS .. "/system/board/trunk/board"},
{"DEVELOP/DBGBOARD", VAR_PROGS .. "/system/dbgboard/dbgboard"},
{"DEVELOP/CEDIT", SRC_PROGS .. "/develop/cedit/CEDIT"}, {"DEVELOP/CEDIT", SRC_PROGS .. "/develop/cedit/CEDIT"},
{"DEVELOP/COBJ", VAR_PROGS .. "/develop/cObj/trunk/cObj"}, {"DEVELOP/COBJ", VAR_PROGS .. "/develop/cObj/trunk/cObj"},
{"DEVELOP/ENTROPYV", VAR_PROGS .. "/develop/entropyview/entropyview"}, {"DEVELOP/ENTROPYV", VAR_PROGS .. "/develop/entropyview/entropyview"},

View File

@@ -116,8 +116,8 @@ ico=8
x=-67 x=-67
y=68 y=68
[10] [10]
name=BOARD name=DBGBOARD
path=/SYS/DEVELOP/BOARD path=/SYS/DEVELOP/DBGBOARD
param= param=
ico=19 ico=19
x=-135 x=-135

View File

@@ -116,8 +116,8 @@ ico=8
x=-67 x=-67
y=68 y=68
[10] [10]
name=BOARD name=DBGBOARD
path=/SYS/DEVELOP/BOARD path=/SYS/DEVELOP/DBGBOARD
param= param=
ico=19 ico=19
x=-135 x=-135

View File

@@ -116,8 +116,8 @@ ico=8
x=-67 x=-67
y=68 y=68
[10] [10]
name=BOARD name=DBGBOARD
path=/SYS/DEVELOP/BOARD path=/SYS/DEVELOP/DBGBOARD
param= param=
ico=19 ico=19
x=-135 x=-135

View File

@@ -116,8 +116,8 @@ ico=8
x=-67 x=-67
y=68 y=68
[10] [10]
name=BOARD name=DBGBOARD
path=/SYS/DEVELOP/BOARD path=/SYS/DEVELOP/DBGBOARD
param= param=
ico=19 ico=19
x=-135 x=-135

View File

@@ -116,8 +116,8 @@ ico=8
x=-67 x=-67
y=68 y=68
[10] [10]
name=BOARD name=DBGBOARD
path=/SYS/DEVELOP/BOARD path=/SYS/DEVELOP/DBGBOARD
param= param=
ico=19 ico=19
x=-135 x=-135

509
programs/if.inc Normal file
View File

@@ -0,0 +1,509 @@
; SPDX-License-Identifier: GPL-2.0
; Macroinstructions for HLL-style conditional operations
; Copyright (C) 2025 KolibriOS team
macro .if [arg]
{
common
__IF equ
local ..endif
__ENDIF equ ..endif
local ..else
__ELSE equ ..else
JNCOND __ELSE,arg
}
macro .else
{
jmp __ENDIF
__ELSE:
restore __IF
__IF equ ,
}
macro .elseif [arg]
{
common
jmp __ENDIF
__ELSE:
restore __ELSE
local ..else
__ELSE equ ..else
JNCOND __ELSE,arg
}
macro .endif
{
if __IF eq
__ELSE:
end if
__ENDIF:
restore __ELSE
restore __ENDIF
restore __IF
}
macro .while [arg]
{
common
local ..while
__WHILE equ ..while
local ..endw
__ENDW equ ..endw
__WHILE:
JNCOND __ENDW,arg
}
macro .endw
{
jmp __WHILE
__ENDW:
restore __ENDW
restore __WHILE
}
macro .repeat
{
local ..repeat
__REPEAT equ ..repeat
__REPEAT:
}
macro .until [arg]
{
common
JNCOND __REPEAT,arg
restore __REPEAT
}
jnne equ je
jnna equ ja
jnnb equ jb
jnng equ jg
jnnl equ jl
jnnae equ jae
jnnbe equ jbe
jnnge equ jge
jnnle equ jle
macro JNCOND label,v1,c,v2
{
match any,c
\{
cmp v1,v2
jn\#c label
\}
match ,c
\{
PARSECOND parsed@cond,v1
match cond,parsed@cond \\{ JNCONDEXPR label,cond \\}
\}
}
gt equ >
lt equ <
macro PARSECOND parsed,cond
{
define parsed
define neg@cond
define status@cond
define nest@cond
irps symb,cond
\{
define symb@cond symb
match >,symb
\\{
define symb@cond gt
\\}
match <,symb
\\{
define symb@cond lt
\\}
current@cond equ status@cond
match ,current@cond
\\{
match ~,symb
\\\{
neg@cond equ neg@cond ~
match ~~,neg@cond
\\\\{
define neg@cond
\\\\}
define symb@cond
\\\}
match (,symb
\\\{
parsed equ parsed neg@cond,<
define nest@cond +
define symb@cond
define neg@cond
\\\}
match any,symb@cond
\\\{
parsed equ parsed neg@cond,symb@cond
define status@cond +
\\\}
\\}
match status,current@cond
\\{
match &,symb
\\\{
parsed equ parsed,&,
define status@cond
define symb@cond
define neg@cond
\\\}
match |,symb
\\\{
parsed equ parsed,|,
define status@cond
define symb@cond
define neg@cond
\\\}
match (,symb
\\\{
define nest@cond (
\\\}
match ),symb
\\\{
match +,nest@cond
\\\\{
parsed equ parsed>
define symb@cond
\\\\}
restore nest@cond
\\\}
match any,symb@cond
\\\{
parsed equ parsed symb@cond
\\\}
\\}
\}
}
macro define_JNCONDEXPR
{
macro JNCONDEXPR elabel,[mod,cond,op]
\{
\common
\local ..t,..f
define t@cond ..t
define f@cond ..f
\forward
match ,op
\\{
match ,mod \\\{ JNCONDEL elabel,<cond> \\\}
match ~,mod \\\{ JCONDEL elabel,<cond> \\\}
\\}
match &:flabel:tlabel, op:f@cond:t@cond
\\{
match ,mod \\\{ JNCONDEL flabel,<cond> \\\}
match ~,mod \\\{ JCONDEL flabel,<cond> \\\}
tlabel:
\\local ..tnew
restore t@cond
define t@cond ..tnew
\\}
match |:flabel:tlabel, op:f@cond:t@cond
\\{
match ,mod \\\{ JCONDEL tlabel,<cond> \\\}
match ~,mod \\\{ JNCONDEL tlabel,<cond> \\\}
flabel:
\\local ..fnew
restore f@cond
define f@cond ..fnew
\\}
\common
label f@cond at elabel
t@cond:
restore t@cond
restore f@cond
\}
}
macro define_JCONDEXPR
{
macro JCONDEXPR elabel,[mod,cond,op]
\{
\common
\local ..t,..f
define t@cond ..t
define f@cond ..f
\forward
match ,op
\\{
match ,mod \\\{ JCONDEL elabel,<cond> \\\}
match ~,mod \\\{ JNCONDEL elabel,<cond> \\\}
\\}
match |:flabel:tlabel, op:f@cond:t@cond
\\{
match ,mod \\\{ JCONDEL flabel,<cond> \\\}
match ~,mod \\\{ JNCONDEL flabel,<cond> \\\}
tlabel:
\\local ..tnew
restore t@cond
define t@cond ..tnew
\\}
match &:flabel:tlabel, op:f@cond:t@cond
\\{
match ,mod \\\{ JNCONDEL tlabel,<cond> \\\}
match ~,mod \\\{ JCONDEL tlabel,<cond> \\\}
flabel:
\\local ..fnew
restore f@cond
define f@cond ..fnew
\\}
\common
label f@cond at elabel
t@cond:
restore t@cond
restore f@cond
\}
}
macro define_JNCONDEL
{
macro JNCONDEL label,cond
\{
\local COND
match car=,cdr,:cond
\\{
define_JNCONDEXPR
define_JCONDEXPR
define_JCONDEL
define_JNCONDEL
JNCONDEXPR label,cond
purge JNCONDEXPR,JCONDEXPR,JCONDEL,JNCONDEL
define COND
\\}
match c,cond ; replace gt and lt
\\{
match =COND =signed v1>==v2, COND c
\\\{
cmp v1,v2
jl label
define COND
\\\}
match =COND =signed v1<==v2, COND c
\\\{
cmp v1,v2
jg label
define COND
\\\}
match =COND v1>==v2, COND c
\\\{
cmp v1,v2
jb label
define COND
\\\}
match =COND v1<==v2, COND c
\\\{
cmp v1,v2
ja label
define COND
\\\}
match =COND v1==v2, COND c
\\\{
cmp v1,v2
jne label
define COND
\\\}
match =COND v1<>v2, COND c
\\\{
cmp v1,v2
je label
define COND
\\\}
match =COND =signed v1>v2, COND c
\\\{
cmp v1,v2
jle label
define COND
\\\}
match =COND =signed v1<v2, COND c
\\\{
cmp v1,v2
jge label
define COND
\\\}
match =COND v1>v2, COND c
\\\{
cmp v1,v2
jbe label
define COND
\\\}
match =COND v1<v2, COND c
\\\{
cmp v1,v2
jae label
define COND
\\\}
match =COND =ZERO?, COND c
\\\{
jnz label
define COND
\\\}
match =COND =CARRY?, COND c
\\\{
jnc label
define COND
\\\}
match =COND =OVERFLOW?, COND c
\\\{
jno label
define COND
\\\}
match =COND =SIGN?, COND c
\\\{
jns label
define COND
\\\}
match =COND =PARITY?, COND c
\\\{
jnp label
define COND
\\\}
match =COND v, COND c
\\\{
if v eqtype 0
if ~ v
jmp label
end if
else if v eqtype eax
test v,v
jz label
else
cmp v,0
je label
end if
\\\}
\\}
\}
}
macro define_JCONDEL
{
macro JCONDEL label,cond
\{
\local COND
match car=,cdr,:cond
\\{
define_JNCONDEXPR
define_JCONDEXPR
define_JCONDEL
define_JNCONDEL
JCONDEXPR label,cond
purge JNCONDEXPR,JCONDEXPR,JCONDEL,JNCONDEL
define COND
\\}
match c,cond ; replace gt and lt
\\{
match =COND =signed v1>==v2, COND c
\\\{
cmp v1,v2
jge label
define COND
\\\}
match =COND =signed v1<==v2, COND c
\\\{
cmp v1,v2
jle label
define COND
\\\}
match =COND v1>==v2, COND c
\\\{
cmp v1,v2
jae label
define COND
\\\}
match =COND v1<==v2, COND c
\\\{
cmp v1,v2
jbe label
define COND
\\\}
match =COND v1==v2, COND c
\\\{
cmp v1,v2
je label
define COND
\\\}
match =COND v1<>v2, COND c
\\\{
cmp v1,v2
jne label
define COND
\\\}
match =COND =signed v1>v2, COND c
\\\{
cmp v1,v2
jg label
define COND
\\\}
match =COND =signed v1<v2, COND c
\\\{
cmp v1,v2
jl label
define COND
\\\}
match =COND v1>v2, COND c
\\\{
cmp v1,v2
ja label
define COND
\\\}
match =COND v1<v2, COND c
\\\{
cmp v1,v2
jb label
define COND
\\\}
match =COND =ZERO?, COND c
\\\{
jz label
define COND
\\\}
match =COND =CARRY?, COND c
\\\{
jc label
define COND
\\\}
match =COND =OVERFLOW?, COND c
\\\{
jo label
define COND
\\\}
match =COND =SIGN?, COND c
\\\{
js label
define COND
\\\}
match =COND =PARITY?, COND c
\\\{
jp label
define COND
\\\}
match =COND v, COND c
\\\{
if v eqtype 0
if v
jmp label
end if
else if v eqtype eax
test v,v
jnz label
else
cmp v,0
jne label
end if
\\\}
\\}
\}
}
define_JNCONDEXPR
define_JCONDEXPR
define_JNCONDEL
define_JCONDEL

View File

@@ -0,0 +1,7 @@
## DBGBOARD - a console-based debug board
Main advantages over the old board:
* Bigger font
* Scrolling (like in other console apps)
* K : and L: messages highligting
Also, like the old board it writes log to /tmp0/1/boardlog.txt (or you can pass another path in args like `/sys/develop/dbgboard /tmp0/1/hgfdhgfh.txt`), you can view log file in cedit by hitting `F2` key

View File

@@ -0,0 +1,2 @@
if tup.getconfig("NO_FASM") ~= "" then return end
tup.rule("dbgboard.asm", "fasm %f %o " .. tup.getconfig("KPACK_CMD"), "dbgboard")

View File

@@ -0,0 +1,244 @@
; SPDX-License-Identifier: GPL-2.0
; DBGBOARD - a console-based debug board
; Copyright (C) 2025 KolibriOS team
format binary as ""
use32
org 0
db 'MENUET01' ; signature
dd 1 ; header version
dd start ; entry point
dd _image_end ; end of image
dd _memory ; required memory size
dd _stacktop ; address of stack top
dd _cmdline ; buffer for command line arguments
dd 0 ; buffer for path
; __DEBUG__ = 1
; __DEBUG_LEVEL__ = DBG_ALL
; DBG_ALL = 0 ; all messages
; DBG_INFO = 1 ; info and errors
; DBG_ERR = 2 ; only errors
include '../../macros.inc'
purge mov,add,sub
include '../../KOSfuncs.inc'
; include '../../debug-fdo.inc'
include '../../proc32.inc'
include '../../dll.inc'
include '../../if.inc'
include '../../string.inc'
CON_WINDOW_CLOSED = 0x200
TEXT_COLOR_YELLOW = 14
TEXT_COLOR_WHITE = 15
TEXT_COLOR_LIGHTGRAY = 7
; TEXT_COLOR_LIGHTGREEN = 10
proc set_text_color stdcall uses eax, _color
and [_color], 0x0F
invoke con_get_flags
and eax, 0x3F0
or eax, [_color]
invoke con_set_flags, eax
ret
endp
; returns eax = 0 or fs error code
proc get_file_attrib stdcall uses ebx, _path, _buf
push [_path]
dec esp
mov byte[esp], 0
push [_buf] ; 40 bytes buf
push 0
push 0
push 0
push SSF_GET_INFO
mov ebx, esp
mcall SF_FILE
add esp, 25
ret
endp
; returns eax = 0 or fs error code
proc create_file stdcall uses ebx, _path
push [_path]
dec esp
mov byte[esp], 0
push 0
push 0
push 0
push 0
push SSF_CREATE_FILE
mov ebx, esp
mcall SF_FILE
add esp, 25
ret
endp
; returns eax = 0 or fs error code
proc write_file stdcall uses ebx, _path, _buf, _count, _pos_lo, _pos_hi, _out_bytes_written
push [_path]
dec esp
mov byte[esp], 0
push [_buf]
push [_count]
push [_pos_hi]
push [_pos_lo]
push SSF_WRITE_FILE
mov ebx, esp
mcall SF_FILE
add esp, 25
mov ecx, [_out_bytes_written]
mov [ecx], ebx
ret
endp
start:
;; if there is a second instance of conboard is running then exit
mcall SF_THREAD_INFO, thread_info, -1
stdcall string.copy, thread_info + process_information.process_name, thread_name
stdcall string.to_lower_case, thread_name
xor edx, edx ; conboard instance count
xor esi, esi
.while esi < 256 ; NOTE: add to macros.inc MAX_THREAD_COUNT = 256
mcall SF_THREAD_INFO, thread_info, esi
.if [thread_info + process_information.slot_state] <> TSTATE_FREE
stdcall string.to_lower_case, thread_info + process_information.process_name
stdcall string.cmp, thread_info + process_information.process_name, thread_name, -1
.if eax = 0
inc edx
.if edx >= 2
jmp .raw_exit
.endif
.endif
.endif
inc esi
.endw
stdcall dll.Load, @IMPORT
test eax, eax
jnz .exit
invoke con_start, 1
invoke con_init, 80, 32, -1, -1, title
.if byte [_cmdline] <> 0
mov [log_file_path], _cmdline
.endif
.main_loop:
invoke con_kbhit
.if eax = 1
invoke con_getch2
.if ah = 60 ; F2
mov eax, [log_file_path]
mov [struct_open_in_notepad.filename], eax
mcall SF_FILE, struct_open_in_notepad
.endif
.endif
mcall SF_BOARD, SSF_DEBUG_READ
.if ebx = 0
mcall SF_SLEEP, 50
jz .main_loop_cond
.endif
mov [chr], al
.if [is_start_line] = 1
mov eax, prefix
add eax, [prefix_index]
mov bl, byte [chr]
mov [eax], bl
.if [prefix_index] = 2
.if dword [prefix] = 'K :'
stdcall set_text_color, TEXT_COLOR_YELLOW
.elseif dword [prefix] = 'L: '
stdcall set_text_color, TEXT_COLOR_WHITE
.else
stdcall set_text_color, TEXT_COLOR_LIGHTGRAY
.endif
mov [is_start_line], 0
mov [prefix_index], 0
invoke con_write_asciiz, prefix
mov dword [prefix], 0
.else
inc [prefix_index]
.endif
.else
invoke con_write_asciiz, chr
.if byte [chr] = 10
mov [is_start_line], 1
stdcall set_text_color, TEXT_COLOR_LIGHTGRAY
.endif
.endif
stdcall get_file_attrib, [log_file_path], file_info_buf
.if eax = 5 ; file not found
stdcall create_file, [log_file_path]
.endif
stdcall write_file, [log_file_path], chr, 1, dword [file_info_buf + 32], dword [file_info_buf + 32 + 4], bytes_written
.main_loop_cond:
invoke con_get_flags
and eax, CON_WINDOW_CLOSED
test eax, eax
jz .main_loop
.exit:
invoke con_exit, 0
.raw_exit:
mcall SF_TERMINATE_PROCESS
; data:
title db 'Debug & message board',0
log_file_path dd default_log_file_path
default_log_file_path db '/tmp0/1/BOARDLOG.TXT',0
prefix db 0,0,0,0
prefix_index dd 0
is_start_line dd 1
bytes_written dd 0
chr db 0, 0
struct_open_in_notepad:
dd SSF_START_APP
dd 0
.filename dd ?
dd 0
dd 0
db '/sys/develop/cedit', 0
; include_debug_strings
align 4
@IMPORT:
library console, 'console.obj'
import console, \
con_start, 'START', \
con_init, 'con_init', \
con_write_asciiz, 'con_write_asciiz', \
con_exit, 'con_exit', \
con_kbhit, 'con_kbhit', \
con_getch2, 'con_getch2', \
con_set_flags, 'con_set_flags', \
con_get_flags, 'con_get_flags'
align 16
_image_end:
file_info_buf rb 40
align 4
_cmdline rb 256
thread_info process_information
thread_name rb 16
; reserve for stack:
rb 4096
align 16
_stacktop:
_memory:

View File

@@ -118,8 +118,8 @@ ico=8
x=-67 x=-67
y=68 y=68
[10] [10]
name=BOARD name=DBGBOARD
path=/SYS/DEVELOP/BOARD path=/SYS/DEVELOP/DBGBOARD
param= param=
ico=19 ico=19
x=-135 x=-135