;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RDOS operating system ; Copyright (C) 2000, Leif Ekblad ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. The only exception to this rule ; is for commercial usage in embedded systems. For information on ; usage in commercial embedded systems, contact embedded@rdos.net ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; ; The author of this program may be contacted at leif@rdos.net ; ; STATEAPP.ASM ; Thread state display app ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NAME stateapp GateSize = 16 INCLUDE ..\os\state.def INCLUDE ..\user.def INCLUDE ..\user.inc .model small .stack .data Work DB 1000h DUP(?) TempStr DB 100 DUP(?) RowId DW 25 DUP(?) .code .386p ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: IntToStr ; ; DESCRIPTION: Convert long to asciiz string ; ; PARAMETERS: EAX Value ; CX Number of position ; ES:DI String ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; dec_tab: DD 1 DD 10 DD 100 DD 1000 DD 10000 DD 100000 DD 1000000 DD 10000000 DD 100000000 DD 1000000000 IntToStr PROC near push ax push bx push ecx push edx push di mov edx,eax mov ah,cl mov bx,cx dec bx shl bx,2 loop_omv_dec: mov ecx,dword ptr cs:[bx].dec_tab xor al,al loop_dec_dig: inc al sub edx,ecx jnc loop_dec_dig add edx,ecx dec al sub bx,4 add al,'0' stosb dec ah jne loop_omv_dec xor al,al stosb pop di pop edx pop ecx pop bx pop ax ret IntToStr Endp PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: RemoveLeading ; ; DESCRIPTION: Remove leading zeros ; ; PARAMETERS: ES:DI STRING ; ; RETURNS: CY Significant digits found ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RemoveLeading Proc near push ax push di RemoveLeadingLoop: mov al,es:[di] or al,al clc jz RemoveLeadingDone cmp al,'0' stc jnz RemoveLeadingDone mov byte ptr es:[di],' ' inc di jmp RemoveLeadingLoop RemoveLeadingDone: pop di pop ax ret RemoveLeading Endp PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: single_hex ; ; DESCRIPTION: ; ; PARAMETERS: AL Value ; ; RETURNS: AX Hex value ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; singel_hex PROC near hex_conv_low: mov ah,al and al,0F0h rol al,1 rol al,1 rol al,1 rol al,1 cmp al,0Ah jb ok_low1 add al,7 ok_low1: add al,30h and ah,0Fh cmp ah,0Ah jb ok_high1 add ah,7 ok_high1: add ah,30h ret singel_hex ENDP PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: WriteHexByte ; ; DESCRIPTION: Write hex byte ; ; PARAMETERS: AL Value ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; write_hex_byte PROC near push ax mov ah,al and al,0F0h rol al,4 cmp al,0Ah jb write_byte_low1 add al,7 write_byte_low1: add al,'0' WriteChar mov al,ah and al,0Fh cmp al,0Ah jb write_byte_high1 add al,7 write_byte_high1: add al,'0' WriteChar pop ax ret write_hex_byte ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: write_hex_word ; ; DESCRIPTION: Write hex word ; ; PARAMETERS: AX Value ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; write_hex_word PROC near push ax rol ax,8 call write_hex_byte rol ax,8 call write_hex_byte pop ax ret write_hex_word Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: write_hex_dword ; ; DESCRIPTION: Write hex dword ; ; PARAMETERS: EAX Value ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; write_hex_dword PROC near push eax rol eax,8 call write_hex_byte rol eax,8 call write_hex_byte rol eax,8 call write_hex_byte rol eax,8 call write_hex_byte pop eax ret write_hex_dword Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: write_hex_address ; ; DESCRIPTION: Write hex address ; ; PARAMETERS: BX:EAX Address ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; write_hex_address PROC near push ax mov ax,bx rol ax,8 call write_hex_byte rol ax,8 call write_hex_byte mov al,':' WriteChar pop ax push eax rol eax,8 call write_hex_byte rol eax,8 call write_hex_byte rol eax,8 call write_hex_byte rol eax,8 call write_hex_byte pop eax ret write_hex_address Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: write_time ; ; DESCRIPTION: Write time ; ; PARAMETERS: EDX:EAX Binary time ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; write_time Proc near pushad mov di,OFFSET TempStr push eax mov eax,edx xor edx,edx mov ecx,24 div ecx mov cx,3 call IntToStr call RemoveLeading pushf WriteAsciiz mov al,' ' WriteChar mov eax,edx mov cx,2 call IntToStr mov al,'.' popf jc SignHour call RemoveLeading jc SignHour mov al,' ' SignHour: pushf WriteAsciiz WriteChar popf pop eax ; pushf mov edx,60 mul edx popf push eax pushf mov eax,edx mov cx,2 call IntToStr mov al,'.' popf jc MinSign call RemoveLeading jc MinSign mov al,' ' MinSign: pushf WriteAsciiz WriteChar popf pop eax ; pushf mov edx,60 mul edx popf push eax pushf mov eax,edx mov cx,2 call IntToStr mov al,',' popf jc SecSign call RemoveLeading jc SecSign mov al,' ' SecSign: pushf WriteAsciiz WriteChar popf pop eax ; pushf mov edx,1000 mul edx popf push eax pushf mov eax,edx mov cx,3 call IntToStr mov al,' ' popf jc MilliSign call RemoveLeading MilliSign: pushf WriteAsciiz WriteChar popf pop eax ; pushf mov edx,1000 mul edx mov eax,edx mov cx,3 call IntToStr popf jc MikroSign call RemoveLeading MikroSign: WriteAsciiz popad ret write_time Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: dump_thread ; ; DESCRIPTION: Dump a thread ; ; PARAMETERS: ES:DI Thread ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; dump_thread Proc near pusha ; mov ax,es:[di].st_id call write_hex_word mov al,' ' WriteChar ; push di add di,OFFSET st_name mov cx,20 WriteSizeString pop di ; mov edx,es:[di].st_time mov eax,es:[di].st_time+4 call write_time mov al,' ' WriteChar ; push di add di,OFFSET st_list mov cx,20 WriteSizeString pop di ; mov eax,es:[di].st_offs mov bx,es:[di].st_sel call write_hex_address ; mov al,13 WriteChar mov al,10 WriteChar ; popa ret dump_thread Endp state2_name DB 'State 2',0 state3_name DB 'State 3',0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: Dump ; ; DESCRIPTION: Dump all threads ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; blank_row DB ' ',0 Dump Proc near push es pusha GetCursorPosition push cx push dx xor si,si xor dx,dx xor cx,cx SetCursorPosition xor ax,ax state_thread_loop: GetThreadState jc state_thread_next mov [si].RowId,ax add si,2 call dump_thread state_thread_next: inc ax cmp ax,256 jne state_thread_loop shr si,1 state_pad_loop: cmp si,25 je state_pad_done ; inc si mov ax,cs mov es,ax mov edi,OFFSET blank_row mov ecx,80 WriteSizeString ; mov al,13 WriteChar mov al,10 WriteChar ; jmp state_pad_loop state_pad_done: pop dx pop cx SetCursorPosition popa pop es ret Dump Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DoFunc ; ; DESCRIPTION: Do a function ; ; PARAMETERS: AL key ; CX x position ; DX y position ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoFunc Proc near push cx push dx shr cx,3 shr dx,3 cmp al,0Dh jne do_func_end mov bx,dx shl bx,1 mov ax,[bx].RowId SuspendThread do_func_end: pop dx pop cx ret DoFunc Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: HandleKeyboard ; ; DESCRIPTION: Keyboard ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HandleKeyboard Proc near mov eax,25 WaitMilliSec ; PollKeyboard jc handle_key_end ; ReadKeyboard or al,al jz handle_key_special GetMousePosition call DoFunc jmp handle_key_end handle_key_special: cmp ah,72 jnz no_up_arrow up_arrow: GetMousePosition sub dx,8 SetMousePosition jmp handle_key_end no_up_arrow: cmp ah,80 jnz no_down_arrow down_arrow: GetMousePosition add dx,8 SetMousePosition jmp handle_key_end no_down_arrow: cmp ah,75 jnz no_left_arrow left_arrow: GetMousePosition sub cx,8 SetMousePosition jmp handle_key_end no_left_arrow: cmp ah,77 jnz handle_key_end right_arrow: GetMousePosition add cx,8 SetMousePosition handle_key_end: GetMousePosition shr cx,3 shr dx,3 SetCursorPosition ret HandleKeyboard Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: HandleMouse ; ; DESCRIPTION: Mouse handler ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HandleMouse Proc near GetLeftButton jc handle_not_left left_button: GetLeftButtonPressPosition mov al,'+' call DoFunc left_rel_loop: call HandleKeyboard GetLeftButton jnc left_rel_loop handle_not_left: GetRightButton jc handle_mouse_done right_button: GetRightButtonPressPosition mov al,'-' call DoFunc right_rel_loop: call HandleKeyboard GetRightButton jnc right_rel_loop handle_mouse_done: ret HandleMouse Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: init ; ; DESCRIPTION: Startup procedure ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; init: xor ax,ax xor bx,bx mov cx,639 mov dx,199 SetMouseWindow mov cx,8 mov dx,8 SetMouseMickey ; ; ShowMouse state_start: mov ax,_data mov ds,ax mov es,ax state_loop: mov ax,100 WaitMilliSec call HandleKeyboard call HandleMouse call Dump jmp state_loop END init