forked from KolibriOS/kolibrios
Kernel: Smoothing image code from Mario79, build scripts for skin and drivers/build.bat
Programs: fasm updated to 1.67.14, small fixes in desktop, stackcfg, calc, board, pipes, freecell, big cleanup of unused programs, added some applications from 0.6.3.0 distr... git-svn-id: svn://kolibrios.org@205 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -143,9 +143,6 @@ macro mcall a,b,c,d,e,f { ; mike.dld
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; optimize the code for size
|
||||
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp>
|
||||
|
||||
@@ -177,7 +174,7 @@ macro sub arg1,arg2
|
||||
|
||||
macro mov arg1,arg2
|
||||
{
|
||||
if (arg1 in __regs) & (arg2 eqtype 0)
|
||||
if (arg1 in __regs) & ((arg2 eqtype 0) | (arg2 eqtype '0'))
|
||||
if (arg2) = 0
|
||||
xor arg1,arg1
|
||||
else if (arg2) = 1
|
||||
@@ -221,7 +218,13 @@ struc process_information
|
||||
.x_size dd ? ; +42
|
||||
.y_size dd ? ; +46
|
||||
.slot_state dw ? ; +50
|
||||
rb (1024-52)
|
||||
dw ? ; +52 - reserved
|
||||
.client_left dd ? ; +54
|
||||
.client_top dd ? ; +58
|
||||
.client_width dd ? ; +62
|
||||
.client_height dd ? ; +66
|
||||
.wnd_state db ? ; +70
|
||||
rb (1024-71)
|
||||
}
|
||||
struct process_information
|
||||
|
||||
|
||||
4
programs/develop/examples/cpuspeed/trunk/build_en.bat
Normal file
4
programs/develop/examples/cpuspeed/trunk/build_en.bat
Normal file
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix en >lang.inc
|
||||
@fasm cpuspeed.asm cpuspeed
|
||||
@pause
|
||||
4
programs/develop/examples/cpuspeed/trunk/build_ru.bat
Normal file
4
programs/develop/examples/cpuspeed/trunk/build_ru.bat
Normal file
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix ru >lang.inc
|
||||
@fasm cpuspeed.asm cpuspeed
|
||||
@pause
|
||||
153
programs/develop/examples/cpuspeed/trunk/cpuspeed.asm
Normal file
153
programs/develop/examples/cpuspeed/trunk/cpuspeed.asm
Normal file
@@ -0,0 +1,153 @@
|
||||
;
|
||||
; CPU SPEED INDICATIOR
|
||||
;
|
||||
; Compile with FASM for Menuet
|
||||
;
|
||||
|
||||
use32
|
||||
org 0x0
|
||||
|
||||
db 'MENUET00' ; 8 byte id
|
||||
dd 38 ; required os
|
||||
dd START ; program start
|
||||
dd I_END ; program image size
|
||||
dd 0x1000 ; required amount of memory
|
||||
dd 0x1000 ; esp
|
||||
dd 0x00000000 ; reserved=no extended header
|
||||
|
||||
include 'lang.inc'
|
||||
include 'macros.inc'
|
||||
|
||||
START: ; start of execution
|
||||
|
||||
mov eax,18
|
||||
mov ebx,5
|
||||
int 0x40
|
||||
|
||||
xor edx,edx
|
||||
mov ebx,1000000
|
||||
div ebx
|
||||
mov ebx,10
|
||||
mov edi,text+19
|
||||
mov ecx,5
|
||||
newnum:
|
||||
xor edx,edx
|
||||
mov ebx,10
|
||||
div ebx
|
||||
add dl,48
|
||||
mov [edi],dl
|
||||
sub edi,1
|
||||
loop newnum
|
||||
|
||||
call draw_window ; at first, draw the window
|
||||
|
||||
still:
|
||||
|
||||
mov eax,10 ; wait here for event
|
||||
int 0x40
|
||||
|
||||
cmp eax,1 ; redraw request ?
|
||||
jz red
|
||||
cmp eax,2 ; key in buffer ?
|
||||
jz key
|
||||
cmp eax,3 ; button in buffer ?
|
||||
jz button
|
||||
|
||||
jmp still
|
||||
|
||||
red: ; redraw
|
||||
call draw_window
|
||||
jmp still
|
||||
|
||||
key: ; key
|
||||
mov eax,2 ; just read it and ignore
|
||||
int 0x40
|
||||
jmp still
|
||||
|
||||
button: ; button
|
||||
mov eax,17 ; get id
|
||||
int 0x40
|
||||
|
||||
cmp ah,1 ; button id=1 ?
|
||||
jnz still
|
||||
mov eax,-1 ; close this program
|
||||
int 0x40
|
||||
|
||||
|
||||
; *********************************************
|
||||
; ******* WINDOW DEFINITIONS AND DRAW ********
|
||||
; *********************************************
|
||||
|
||||
|
||||
draw_window:
|
||||
|
||||
mov eax,12 ; function 12:tell os about windowdraw
|
||||
mov ebx,1 ; 1, start of draw
|
||||
int 0x40
|
||||
|
||||
mov eax,48
|
||||
mov ebx,3
|
||||
mov ecx,sc
|
||||
mov edx,sizeof.system_colors
|
||||
int 0x40
|
||||
|
||||
; DRAW WINDOW
|
||||
mov eax,0 ; function 0 : define and draw window
|
||||
mov ebx,100*65536+200 ; [x start] *65536 + [x size]
|
||||
mov ecx,100*65536+65 ; [y start] *65536 + [y size]
|
||||
mov edx,[sc.work] ; color of work area RRGGBB,8->color glide
|
||||
mov esi,[sc.grab] ; color of grab bar RRGGBB,8->color
|
||||
or esi,0x80000000
|
||||
mov edi,[sc.frame] ; color of frames RRGGBB
|
||||
int 0x40
|
||||
|
||||
; WINDOW LABEL
|
||||
mov eax,4 ; function 4 : write text to window
|
||||
mov ebx,8*65536+8 ; [x start] *65536 + [y start]
|
||||
mov ecx,[sc.grab_text] ; color of text RRGGBB
|
||||
or ecx,0x10000000
|
||||
mov edx,labelt ; pointer to text beginning
|
||||
mov esi,labellen-labelt ; text length
|
||||
int 0x40
|
||||
; CLOSE BUTTON
|
||||
mov eax,8 ; function 8 : define and draw button
|
||||
mov ebx,(200-17)*65536+12 ; [x start] *65536 + [x size]
|
||||
mov ecx,5*65536+12 ; [y start] *65536 + [y size]
|
||||
mov edx,1 ; button id
|
||||
mov esi,[sc.grab_button] ; button color RRGGBB
|
||||
int 0x40
|
||||
|
||||
mov ebx,25*65536+35 ; draw info text with function 4
|
||||
mov ecx,[sc.work_text]
|
||||
mov edx,text
|
||||
mov esi,40
|
||||
newline:
|
||||
mov eax,4
|
||||
int 0x40
|
||||
add ebx,10
|
||||
add edx,40
|
||||
cmp [edx],byte 'x'
|
||||
jnz newline
|
||||
|
||||
mov eax,12 ; function 12:tell os about windowdraw
|
||||
mov ebx,2 ; 2, end of draw
|
||||
int 0x40
|
||||
|
||||
ret
|
||||
|
||||
|
||||
; DATA AREA
|
||||
|
||||
|
||||
text:
|
||||
db 'CPU RUNNING AT MHZ '
|
||||
db 'x' ; <- END MARKER, DONT DELETE
|
||||
|
||||
labelt:
|
||||
db 'CPU SPEED'
|
||||
labellen:
|
||||
|
||||
I_END:
|
||||
|
||||
sc system_colors
|
||||
|
||||
266
programs/develop/examples/cpuspeed/trunk/macros.inc
Normal file
266
programs/develop/examples/cpuspeed/trunk/macros.inc
Normal file
@@ -0,0 +1,266 @@
|
||||
; new application structure
|
||||
macro meos_app_start
|
||||
{
|
||||
use32
|
||||
org 0x0
|
||||
|
||||
db 'MENUET01'
|
||||
dd 0x01
|
||||
dd __start
|
||||
dd __end
|
||||
dd __memory
|
||||
dd __stack
|
||||
|
||||
if used __params & ~defined __params
|
||||
dd __params
|
||||
else
|
||||
dd 0x0
|
||||
end if
|
||||
|
||||
dd 0x0
|
||||
}
|
||||
MEOS_APP_START fix meos_app_start
|
||||
|
||||
macro code
|
||||
{
|
||||
__start:
|
||||
}
|
||||
CODE fix code
|
||||
|
||||
macro data
|
||||
{
|
||||
__data:
|
||||
}
|
||||
DATA fix data
|
||||
|
||||
macro udata
|
||||
{
|
||||
if used __params & ~defined __params
|
||||
__params:
|
||||
db 0
|
||||
__end:
|
||||
rb 255
|
||||
else
|
||||
__end:
|
||||
end if
|
||||
__udata:
|
||||
}
|
||||
UDATA fix udata
|
||||
|
||||
macro meos_app_end
|
||||
{
|
||||
align 32
|
||||
rb 2048
|
||||
__stack:
|
||||
__memory:
|
||||
}
|
||||
MEOS_APP_END fix meos_app_end
|
||||
|
||||
|
||||
; macro for defining multiline text data
|
||||
struc mstr [sstring]
|
||||
{
|
||||
forward
|
||||
local ssize
|
||||
virtual at 0
|
||||
db sstring
|
||||
ssize = $
|
||||
end virtual
|
||||
dd ssize
|
||||
db sstring
|
||||
common
|
||||
dd -1
|
||||
}
|
||||
|
||||
|
||||
; strings
|
||||
macro sz name,[data] { ; from MFAR [mike.dld]
|
||||
common
|
||||
if used name
|
||||
label name
|
||||
end if
|
||||
forward
|
||||
if used name
|
||||
db data
|
||||
end if
|
||||
common
|
||||
if used name
|
||||
.size = $-name
|
||||
end if
|
||||
}
|
||||
|
||||
macro lsz name,[lng,data] { ; from MFAR [mike.dld]
|
||||
common
|
||||
if used name
|
||||
label name
|
||||
end if
|
||||
forward
|
||||
if (used name)&(lang eq lng)
|
||||
db data
|
||||
end if
|
||||
common
|
||||
if used name
|
||||
.size = $-name
|
||||
end if
|
||||
}
|
||||
|
||||
|
||||
|
||||
; easy system call macro
|
||||
macro mpack dest, hsrc, lsrc
|
||||
{
|
||||
if (hsrc eqtype 0) & (lsrc eqtype 0)
|
||||
mov dest, (hsrc) shl 16 + lsrc
|
||||
else
|
||||
if (hsrc eqtype 0) & (~lsrc eqtype 0)
|
||||
mov dest, (hsrc) shl 16
|
||||
add dest, lsrc
|
||||
else
|
||||
mov dest, hsrc
|
||||
shl dest, 16
|
||||
add dest, lsrc
|
||||
end if
|
||||
end if
|
||||
}
|
||||
|
||||
macro __mov reg,a,b { ; mike.dld
|
||||
if (~a eq)&(~b eq)
|
||||
mpack reg,a,b
|
||||
else if (~a eq)&(b eq)
|
||||
mov reg,a
|
||||
end if
|
||||
}
|
||||
|
||||
macro mcall a,b,c,d,e,f { ; mike.dld
|
||||
__mov eax,a
|
||||
__mov ebx,b
|
||||
__mov ecx,c
|
||||
__mov edx,d
|
||||
__mov esi,e
|
||||
__mov edi,f
|
||||
int 0x40
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; optimize the code for size
|
||||
__regs equ <eax,ebx,ecx,edx,esi,edi,ebp,esp>
|
||||
|
||||
macro add arg1,arg2
|
||||
{
|
||||
if (arg2 eqtype 0)
|
||||
if (arg2) = 1
|
||||
inc arg1
|
||||
else
|
||||
add arg1,arg2
|
||||
end if
|
||||
else
|
||||
add arg1,arg2
|
||||
end if
|
||||
}
|
||||
|
||||
macro sub arg1,arg2
|
||||
{
|
||||
if (arg2 eqtype 0)
|
||||
if (arg2) = 1
|
||||
dec arg1
|
||||
else
|
||||
sub arg1,arg2
|
||||
end if
|
||||
else
|
||||
sub arg1,arg2
|
||||
end if
|
||||
}
|
||||
|
||||
macro mov arg1,arg2
|
||||
{
|
||||
if (arg1 in __regs) & (arg2 eqtype 0)
|
||||
if (arg2) = 0
|
||||
xor arg1,arg1
|
||||
else if (arg2) = 1
|
||||
xor arg1,arg1
|
||||
inc arg1
|
||||
else if (arg2) = -1
|
||||
or arg1,-1
|
||||
else if (arg2) > -128 & (arg2) < 128
|
||||
push arg2
|
||||
pop arg1
|
||||
else
|
||||
mov arg1,arg2
|
||||
end if
|
||||
else
|
||||
mov arg1,arg2
|
||||
end if
|
||||
}
|
||||
|
||||
|
||||
macro struct name
|
||||
{
|
||||
virtual at 0
|
||||
name name
|
||||
sizeof.#name = $ - name
|
||||
end virtual
|
||||
}
|
||||
|
||||
; structures used in MeOS
|
||||
struc process_information
|
||||
{
|
||||
.cpu_usage dd ? ; +0
|
||||
.window_stack_position dw ? ; +4
|
||||
.window_stack_value dw ? ; +6
|
||||
.not_used1 dw ? ; +8
|
||||
.process_name rb 12 ; +10
|
||||
.memory_start dd ? ; +22
|
||||
.used_memory dd ? ; +26
|
||||
.PID dd ? ; +30
|
||||
.x_start dd ? ; +34
|
||||
.y_start dd ? ; +38
|
||||
.x_size dd ? ; +42
|
||||
.y_size dd ? ; +46
|
||||
.slot_state dw ? ; +50
|
||||
rb (1024-52)
|
||||
}
|
||||
struct process_information
|
||||
|
||||
struc system_colors
|
||||
{
|
||||
.frame dd ?
|
||||
.grab dd ?
|
||||
.grab_button dd ?
|
||||
.grab_button_text dd ?
|
||||
.grab_text dd ?
|
||||
.work dd ?
|
||||
.work_button dd ?
|
||||
.work_button_text dd ?
|
||||
.work_text dd ?
|
||||
.work_graph dd ?
|
||||
}
|
||||
struct system_colors
|
||||
|
||||
|
||||
; constants
|
||||
|
||||
; events
|
||||
EV_IDLE = 0
|
||||
EV_TIMER = 0
|
||||
EV_REDRAW = 1
|
||||
EV_KEY = 2
|
||||
EV_BUTTON = 3
|
||||
EV_EXIT = 4
|
||||
EV_BACKGROUND = 5
|
||||
EV_MOUSE = 6
|
||||
EV_IPC = 7
|
||||
EV_STACK = 8
|
||||
|
||||
; event mask bits for function 40
|
||||
EVM_REDRAW = 1b
|
||||
EVM_KEY = 10b
|
||||
EVM_BUTTON = 100b
|
||||
EVM_EXIT = 1000b
|
||||
EVM_BACKGROUND = 10000b
|
||||
EVM_MOUSE = 100000b
|
||||
EVM_IPC = 1000000b
|
||||
EVM_STACK = 10000000b
|
||||
@@ -1,4 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix en >lang.inc
|
||||
@fasm mview.asm mview
|
||||
@fasm ir.asm ir
|
||||
@pause
|
||||
@@ -1,4 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix ru >lang.inc
|
||||
@fasm mview.asm mview
|
||||
@fasm ir.asm ir
|
||||
@pause
|
||||
268
programs/develop/examples/ir/trunk/ir.asm
Normal file
268
programs/develop/examples/ir/trunk/ir.asm
Normal file
@@ -0,0 +1,268 @@
|
||||
;
|
||||
; INFRARED
|
||||
;
|
||||
; Compile with FASM for Menuet
|
||||
;
|
||||
|
||||
use32
|
||||
|
||||
org 0x0
|
||||
|
||||
db 'MENUET01' ; 8 byte id
|
||||
dd 1 ; required os
|
||||
dd START ; program start
|
||||
dd I_END ; program image size
|
||||
dd 0x1000 ; required amount of memory
|
||||
dd 0x1000 ; esp = 0x7FFF0
|
||||
dd 0, 0
|
||||
|
||||
|
||||
include 'macros.inc'
|
||||
|
||||
START: ; start of execution
|
||||
|
||||
set_variables:
|
||||
|
||||
mov eax,46 ; reserve ports 0x3f0 - 0x3ff
|
||||
mov ebx,0
|
||||
mov ecx,0x3f0
|
||||
mov edx,0x3ff
|
||||
int 0x40
|
||||
|
||||
mov eax,45 ; reserve irq 4
|
||||
mov ebx,0
|
||||
mov ecx,4
|
||||
int 0x40
|
||||
|
||||
mov eax,44 ; set read ports for irq 4
|
||||
mov ebx,irqtable
|
||||
; mov ecx,4
|
||||
int 0x40
|
||||
|
||||
mov dh, 3 ; all ports have number 3xx hex
|
||||
|
||||
mov dl, 0xf3+8
|
||||
mov al, 0x80
|
||||
out dx, al
|
||||
|
||||
mov dl, 0xf1+8
|
||||
mov al, 0
|
||||
out dx, al
|
||||
|
||||
mov dl, 0xf0+8
|
||||
mov al, 0x30 / 4
|
||||
out dx, al
|
||||
|
||||
mov dl, 0xf3+8
|
||||
mov al, 3
|
||||
out dx, al
|
||||
|
||||
mov dl, 0xf4+8
|
||||
mov al, 0xB
|
||||
out dx, al
|
||||
|
||||
mov dl, 0xf1+8
|
||||
mov al, 1
|
||||
out dx, al
|
||||
|
||||
mov eax,5
|
||||
mov ebx,100
|
||||
int 0x40
|
||||
|
||||
mov dl, 0xf8
|
||||
mov al, 'I'
|
||||
out dx, al
|
||||
|
||||
mov eax,5
|
||||
mov ebx,10
|
||||
int 0x40
|
||||
|
||||
mov al, 'R'
|
||||
out dx, al
|
||||
|
||||
mov eax,40 ; get com 1 data with irq 4
|
||||
mov ebx,0000000000010000b shl 16 + 101b
|
||||
int 0x40
|
||||
|
||||
red:
|
||||
call draw_window
|
||||
|
||||
still:
|
||||
|
||||
mov eax,10 ; wait here for event
|
||||
int 0x40
|
||||
dec eax
|
||||
jz red
|
||||
dec eax
|
||||
dec eax
|
||||
jnz readir
|
||||
|
||||
button: ; button
|
||||
mov al,17 ; get id
|
||||
int 0x40
|
||||
|
||||
; we have only one button, close
|
||||
|
||||
mov eax,45 ; free irq
|
||||
mov ebx,1
|
||||
mov ecx,4
|
||||
int 0x40
|
||||
|
||||
mov eax,46 ; free ports 0x3f0-0x3ff
|
||||
mov ebx,1
|
||||
mov ecx,0x3f0
|
||||
mov edx,0x3ff
|
||||
int 0x40
|
||||
|
||||
or eax,-1 ; close this program
|
||||
int 0x40
|
||||
|
||||
pos dd 0x0
|
||||
|
||||
cdplayer:
|
||||
dd 7
|
||||
dd 0
|
||||
dd 0
|
||||
dd 0
|
||||
dd 0
|
||||
db '/RD/1/CDP',0
|
||||
|
||||
readir:
|
||||
mov eax,42
|
||||
mov ebx,4
|
||||
int 0x40
|
||||
|
||||
cmp ebx,80
|
||||
jne nocd
|
||||
|
||||
mov eax,70
|
||||
mov ebx,cdplayer
|
||||
int 0x40
|
||||
|
||||
|
||||
nocd:
|
||||
|
||||
push ebx
|
||||
mov eax,[pos]
|
||||
add eax,1
|
||||
cmp eax,10*20+1
|
||||
jb noeaxz
|
||||
mov esi,text+10*4
|
||||
mov edi,text
|
||||
mov ecx,10*21*4
|
||||
cld
|
||||
rep movsb
|
||||
mov eax,13
|
||||
mov ebx,20*65536+260
|
||||
mov ecx,22*65536+220
|
||||
mov edx,[wcolor]
|
||||
int 0x40
|
||||
mov eax,10*19+1
|
||||
noeaxz:
|
||||
mov [pos],eax
|
||||
pop ebx
|
||||
and ebx,0xff
|
||||
call draw_data
|
||||
jmp still
|
||||
|
||||
|
||||
|
||||
|
||||
draw_data:
|
||||
|
||||
pusha
|
||||
|
||||
xchg eax,ebx
|
||||
|
||||
mov ecx,10
|
||||
shl ebx,2
|
||||
mov esi,3
|
||||
newnum:
|
||||
xor edx,edx
|
||||
div ecx
|
||||
add edx,48
|
||||
mov [ebx+text-1],dl
|
||||
dec ebx
|
||||
dec esi
|
||||
jnz newnum
|
||||
|
||||
call draw_text
|
||||
|
||||
popa
|
||||
|
||||
ret
|
||||
|
||||
|
||||
irqtable:
|
||||
|
||||
dd 0x3f8+0x01000000 ; + 01 = read byte, 02 read word
|
||||
dd 0
|
||||
|
||||
|
||||
|
||||
; *********************************************
|
||||
; ******* WINDOW DEFINITIONS AND DRAW ********
|
||||
; *********************************************
|
||||
|
||||
|
||||
draw_window:
|
||||
|
||||
mov eax,12 ; function 12:tell os about windowdraw
|
||||
mov ebx,1 ; 1, start of draw
|
||||
int 0x40
|
||||
|
||||
; DRAW WINDOW
|
||||
mov eax,0 ; function 0 : define and draw window
|
||||
mov ebx,100*65536+300 ; [x start] *65536 + [x size]
|
||||
mov ecx,100*65536+250 ; [y start] *65536 + [y size]
|
||||
mov edx,[wcolor] ; color of work area RRGGBB,8->color
|
||||
mov edi,labelt ; caption string
|
||||
int 0x40
|
||||
|
||||
; ; WINDOW LABEL
|
||||
; mov eax,4 ; function 4 : write text to window
|
||||
; mov ebx,8*65536+8 ; [x start] *65536 + [y start]
|
||||
; mov ecx,0x00ffffff ; color of text RRGGBB
|
||||
; mov edx,labelt ; pointer to text beginning
|
||||
; mov esi,labellen-labelt ; text length
|
||||
; int 0x40
|
||||
|
||||
; CLOSE BUTTON
|
||||
; mov eax,8 ; function 8 : define and draw button
|
||||
; mov ebx,(300-19)*65536+12 ; [x start] *65536 + [x size]
|
||||
; mov ecx,5*65536+12 ; [y start] *65536 + [y size]
|
||||
; mov edx,1 ; button id
|
||||
; mov esi,0x5599cc ; button color RRGGBB
|
||||
; int 0x40
|
||||
|
||||
draw_text:
|
||||
|
||||
mov ebx,25*65536+35 ; draw info text with function 4
|
||||
mov ecx,0xffffff
|
||||
mov edx,text
|
||||
mov esi,40
|
||||
mov edi,20
|
||||
newline:
|
||||
mov eax,4
|
||||
int 0x40
|
||||
add ebx,10
|
||||
add edx,esi
|
||||
dec edi
|
||||
jne newline
|
||||
|
||||
mov eax,12
|
||||
mov ebx,2
|
||||
int 0x40
|
||||
|
||||
ret
|
||||
|
||||
|
||||
; DATA AREA
|
||||
|
||||
wcolor dd 0x13000000
|
||||
|
||||
labelt db 'INFRARED RECEIVER FOR IRMAN IN COM 1',0
|
||||
|
||||
text:
|
||||
|
||||
I_END:
|
||||
267
programs/develop/examples/ir/trunk/macros.inc
Normal file
267
programs/develop/examples/ir/trunk/macros.inc
Normal file
@@ -0,0 +1,267 @@
|
||||
; new application structure
|
||||
macro meos_app_start
|
||||
{
|
||||
use32
|
||||
org 0x0
|
||||
|
||||
db 'MENUET01'
|
||||
dd 0x01
|
||||
dd __start
|
||||
dd __end
|
||||
dd __memory
|
||||
dd __stack
|
||||
|
||||
if used __params & ~defined __params
|
||||
dd __params
|
||||
else
|
||||
dd 0x0
|
||||
end if
|
||||
|
||||
dd 0x0
|
||||
}
|
||||
MEOS_APP_START fix meos_app_start
|
||||
|
||||
macro code
|
||||
{
|
||||
__start:
|
||||
}
|
||||
CODE fix code
|
||||
|
||||
macro data
|
||||
{
|
||||
__data:
|
||||
}
|
||||
DATA fix data
|
||||
|
||||
macro udata
|
||||
{
|
||||
if used __params & ~defined __params
|
||||
__params:
|
||||
db 0
|
||||
__end:
|
||||
rb 255
|
||||
else
|
||||
__end:
|
||||
end if
|
||||
__udata:
|
||||
}
|
||||
UDATA fix udata
|
||||
|
||||
macro meos_app_end
|
||||
{
|
||||
align 32
|
||||
rb 2048
|
||||
__stack:
|
||||
__memory:
|
||||
}
|
||||
MEOS_APP_END fix meos_app_end
|
||||
|
||||
|
||||
; macro for defining multiline text data
|
||||
struc mstr [sstring]
|
||||
{
|
||||
forward
|
||||
local ssize
|
||||
virtual at 0
|
||||
db sstring
|
||||
ssize = $
|
||||
end virtual
|
||||
dd ssize
|
||||
db sstring
|
||||
common
|
||||
dd -1
|
||||
}
|
||||
|
||||
|
||||
; strings
|
||||
macro sz name,[data] { ; from MFAR [mike.dld]
|
||||
common
|
||||
if used name
|
||||
label name
|
||||
end if
|
||||
forward
|
||||
if used name
|
||||
db data
|
||||
end if
|
||||
common
|
||||
if used name
|
||||
.size = $-name
|
||||
end if
|
||||
}
|
||||
|
||||
macro lsz name,[lng,data] { ; from MFAR [mike.dld]
|
||||
common
|
||||
if used name
|
||||
label name
|
||||
end if
|
||||
forward
|
||||
if (used name)&(lang eq lng)
|
||||
db data
|
||||
end if
|
||||
common
|
||||
if used name
|
||||
.size = $-name
|
||||
end if
|
||||
}
|
||||
|
||||
|
||||
|
||||
; easy system call macro
|
||||
macro mpack dest, hsrc, lsrc
|
||||
{
|
||||
if (hsrc eqtype 0) & (lsrc eqtype 0)
|
||||
mov dest, (hsrc) shl 16 + lsrc
|
||||
else
|
||||
if (hsrc eqtype 0) & (~lsrc eqtype 0)
|
||||
mov dest, (hsrc) shl 16
|
||||
add dest, lsrc
|
||||
else
|
||||
mov dest, hsrc
|
||||
shl dest, 16
|
||||
add dest, lsrc
|
||||
end if
|
||||
end if
|
||||
}
|
||||
|
||||
macro __mov reg,a,b { ; mike.dld
|
||||
if (~a eq)&(~b eq)
|
||||
mpack reg,a,b
|
||||
else if (~a eq)&(b eq)
|
||||
mov reg,a
|
||||
end if
|
||||
}
|
||||
|
||||
macro mcall a,b,c,d,e,f { ; mike.dld
|
||||
__mov eax,a
|
||||
__mov ebx,b
|
||||
__mov ecx,c
|
||||
__mov edx,d
|
||||
__mov esi,e
|
||||
__mov edi,f
|
||||
int 0x40
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; optimize the code for size
|
||||
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp>
|
||||
|
||||
macro add arg1,arg2
|
||||
{
|
||||
if (arg2 eqtype 0)
|
||||
if (arg2) = 1
|
||||
inc arg1
|
||||
else
|
||||
add arg1,arg2
|
||||
end if
|
||||
else
|
||||
add arg1,arg2
|
||||
end if
|
||||
}
|
||||
|
||||
macro sub arg1,arg2
|
||||
{
|
||||
if (arg2 eqtype 0)
|
||||
if (arg2) = 1
|
||||
dec arg1
|
||||
else
|
||||
sub arg1,arg2
|
||||
end if
|
||||
else
|
||||
sub arg1,arg2
|
||||
end if
|
||||
}
|
||||
|
||||
macro mov arg1,arg2
|
||||
{
|
||||
if (arg1 in __regs) & (arg2 eqtype 0)
|
||||
if (arg2) = 0
|
||||
xor arg1,arg1
|
||||
else if (arg2) = 1
|
||||
xor arg1,arg1
|
||||
inc arg1
|
||||
else if (arg2) = -1
|
||||
or arg1,-1
|
||||
else if (arg2) > -128 & (arg2) < 128
|
||||
push arg2
|
||||
pop arg1
|
||||
else
|
||||
mov arg1,arg2
|
||||
end if
|
||||
else
|
||||
mov arg1,arg2
|
||||
end if
|
||||
}
|
||||
|
||||
|
||||
macro struct name
|
||||
{
|
||||
virtual at 0
|
||||
name name
|
||||
sizeof.#name = $ - name
|
||||
end virtual
|
||||
}
|
||||
|
||||
; structures used in MeOS
|
||||
struc process_information
|
||||
{
|
||||
.cpu_usage dd ? ; +0
|
||||
.window_stack_position dw ? ; +4
|
||||
.window_stack_value dw ? ; +6
|
||||
.not_used1 dw ? ; +8
|
||||
.process_name rb 12 ; +10
|
||||
.memory_start dd ? ; +22
|
||||
.used_memory dd ? ; +26
|
||||
.PID dd ? ; +30
|
||||
.x_start dd ? ; +34
|
||||
.y_start dd ? ; +38
|
||||
.x_size dd ? ; +42
|
||||
.y_size dd ? ; +46
|
||||
.slot_state dw ? ; +50
|
||||
rb (1024-52)
|
||||
}
|
||||
struct process_information
|
||||
|
||||
struc system_colors
|
||||
{
|
||||
.frame dd ?
|
||||
.grab dd ?
|
||||
.grab_button dd ?
|
||||
.grab_button_text dd ?
|
||||
.grab_text dd ?
|
||||
.work dd ?
|
||||
.work_button dd ?
|
||||
.work_button_text dd ?
|
||||
.work_text dd ?
|
||||
.work_graph dd ?
|
||||
}
|
||||
struct system_colors
|
||||
|
||||
|
||||
; constants
|
||||
|
||||
; events
|
||||
EV_IDLE = 0
|
||||
EV_TIMER = 0
|
||||
EV_REDRAW = 1
|
||||
EV_KEY = 2
|
||||
EV_BUTTON = 3
|
||||
EV_EXIT = 4
|
||||
EV_BACKGROUND = 5
|
||||
EV_MOUSE = 6
|
||||
EV_IPC = 7
|
||||
EV_STACK = 8
|
||||
|
||||
; event mask bits for function 40
|
||||
EVM_REDRAW = 1b
|
||||
EVM_KEY = 10b
|
||||
EVM_BUTTON = 100b
|
||||
EVM_EXIT = 1000b
|
||||
EVM_BACKGROUND = 10000b
|
||||
EVM_MOUSE = 100000b
|
||||
EVM_IPC = 1000000b
|
||||
EVM_STACK = 10000000b
|
||||
4
programs/develop/examples/md5/trunk/build_en.bat
Normal file
4
programs/develop/examples/md5/trunk/build_en.bat
Normal file
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix en >lang.inc
|
||||
@fasm md5.asm md5
|
||||
@pause
|
||||
4
programs/develop/examples/md5/trunk/build_ru.bat
Normal file
4
programs/develop/examples/md5/trunk/build_ru.bat
Normal file
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix ru >lang.inc
|
||||
@fasm md5.asm md5
|
||||
@pause
|
||||
445
programs/develop/examples/md5/trunk/md5.asm
Normal file
445
programs/develop/examples/md5/trunk/md5.asm
Normal file
@@ -0,0 +1,445 @@
|
||||
; <20>ਬ¥à ॠ«¨§ 樨 £¥¥à â®à MD5 - å¥è
|
||||
;
|
||||
; MD5 Generator
|
||||
;
|
||||
; €¢â®à: Hex
|
||||
; ‘ ©â: www.mestack.narod.ru
|
||||
; ˆ¤¥ï, ॠ«¨§ æ¨ï ¨ ®â« ¤ª .
|
||||
;
|
||||
; €¢â®à: Halyavin
|
||||
; ‘ ©â: www.shade.msu.ru/~msu-se/home.html
|
||||
; „®à ¡®âª , ®â« ¤ª ¨ ®¯â¨¬¨§ æ¨ï.
|
||||
;
|
||||
; Š®¬¯¨«¨àã¥âìáï Fasm'®¬ ¤«ï Œ¥ãí⎑
|
||||
include 'lang.inc'
|
||||
macro diff16 title,l2
|
||||
{
|
||||
local s,d,l1
|
||||
s = l2
|
||||
display title,': 0x'
|
||||
repeat 8
|
||||
d = 48 + s shr ((8-%) shl 2) and $0F
|
||||
if d > 57
|
||||
d = d + 65-57-1
|
||||
end if
|
||||
display d
|
||||
end repeat
|
||||
display 13,10
|
||||
}
|
||||
|
||||
use32
|
||||
|
||||
org 0x0
|
||||
|
||||
db 'MENUET01' ; 8-¡ ©âë© ¨¤¥â¨ä¨ª â®à MenuetOS
|
||||
dd 0x01 ; ¢¥àá¨ï § £®«®¢ª (¢á¥£¤ 1)
|
||||
dd START ; ¤à¥á ¯¥à¢®© ª®¬ ¤ë
|
||||
dd I_END ; à §¬¥à ¯à®£à ¬¬ë
|
||||
dd 0x100000 ; ª®«¨ç¥á⢮ ¯ ¬ïâ¨
|
||||
dd 0x100000 ; ¤à¥á ¢¥àè¨ë áâíª
|
||||
dd 0x0 ; ¤à¥á ¡ãä¥à ¤«ï ¯ à ¬¥â஢ (¥ ¨á¯®«ì§ã¥âáï)
|
||||
dd 0x0 ; § १¥à¢¨à®¢ ®
|
||||
|
||||
START: ; <20> ç «® ¢ë¯®«¥¨ï ¯à®£à ¬¬ë
|
||||
|
||||
call draw_window ; ‘¯¥à¢ ¯¥à¥à¨á㥬 ®ª®
|
||||
|
||||
still:
|
||||
|
||||
mov eax,23 ; ަ¨¤ ¥¬ ᮡë⨩
|
||||
mov ebx,1
|
||||
int 0x40
|
||||
|
||||
cmp eax,1 ; ‡ ¯à®á ¯¥à¥à¨á®¢ªã ?
|
||||
jz red
|
||||
cmp eax,2 ; ¦ â ª« ¢¨è¨ ?
|
||||
jz key
|
||||
cmp eax,3 ; ¦ â ª®¯ª ?
|
||||
jz button
|
||||
|
||||
jmp still
|
||||
|
||||
red:
|
||||
call draw_window
|
||||
jmp still
|
||||
|
||||
key:
|
||||
mov eax,2
|
||||
int 0x40
|
||||
jmp still
|
||||
|
||||
button:
|
||||
mov eax,17
|
||||
int 0x40
|
||||
|
||||
cmp ah,1 ; id ª®¯ª¨ = 1 ?
|
||||
jnz noclose
|
||||
mov eax,-1
|
||||
int 0x40
|
||||
|
||||
noclose:
|
||||
|
||||
cmp ah,2 ; ƒ¥¥à¨à®¢ âì?
|
||||
je procMD5hash
|
||||
|
||||
jmp still
|
||||
|
||||
|
||||
procMD5hash:
|
||||
|
||||
; phase I - padding
|
||||
mov edi,ptBuffer
|
||||
mov eax,[dtBufferLength]
|
||||
|
||||
inc eax
|
||||
add edi,eax
|
||||
mov byte [edi-1],0x80
|
||||
|
||||
xor edx,edx
|
||||
|
||||
mov ebx,64
|
||||
div ebx
|
||||
|
||||
neg edx
|
||||
add edx,64
|
||||
|
||||
cmp edx,8
|
||||
jae @f
|
||||
|
||||
add edx,64
|
||||
|
||||
@@: mov ecx,edx
|
||||
xor al,al
|
||||
rep stosb
|
||||
|
||||
mov eax,[dtBufferLength]
|
||||
|
||||
inc edx
|
||||
add [dtBufferLength],edx
|
||||
|
||||
xor edx,edx
|
||||
|
||||
mov ebx,8
|
||||
mul ebx
|
||||
|
||||
mov [edi-8],eax
|
||||
mov [edi-4],edx
|
||||
|
||||
mov edx,[dtBufferLength]
|
||||
|
||||
mov edi,ptBuffer
|
||||
|
||||
; phase II - chaining variables initialization
|
||||
mov dword [dtA],067452301h
|
||||
mov dword [dtB],0efcdab89h
|
||||
mov dword [dtC],098badcfeh
|
||||
mov dword [dtD],010325476h
|
||||
|
||||
mov esi,ptMD5Result
|
||||
|
||||
hashloop:
|
||||
;diff16 "hashloop",hashloop
|
||||
mov eax,[dtA]
|
||||
mov [dta],eax
|
||||
mov eax,[dtB]
|
||||
mov [dtb],eax
|
||||
mov eax,[dtC]
|
||||
mov [dtc],eax
|
||||
mov eax,[dtD]
|
||||
mov [dtd],eax
|
||||
|
||||
macro ff dta,dtb,dtc,dtd,data,shift,cc
|
||||
{
|
||||
mov eax,dtb
|
||||
mov ebx,dtc
|
||||
mov ecx,dtd
|
||||
|
||||
and ebx,eax
|
||||
not eax
|
||||
and eax,ecx
|
||||
or eax,ebx
|
||||
|
||||
add eax,dta
|
||||
add eax,data
|
||||
add eax,cc
|
||||
rol eax,shift
|
||||
add eax,dtb
|
||||
mov dta,eax
|
||||
}
|
||||
macro gg dta,dtb,dtc,dtd,data,shift,cc
|
||||
{
|
||||
mov eax,dtb
|
||||
mov ebx,dtc
|
||||
mov ecx,dtd
|
||||
|
||||
and eax,ecx
|
||||
not ecx
|
||||
and ecx,ebx
|
||||
or eax,ecx
|
||||
|
||||
add eax,dta
|
||||
add eax,data
|
||||
add eax,cc
|
||||
rol eax,shift
|
||||
add eax,dtb
|
||||
mov dta,eax
|
||||
}
|
||||
macro hh dta,dtb,dtc,dtd,data,shift,cc
|
||||
{
|
||||
mov eax,dtb
|
||||
mov ebx,dtc
|
||||
mov ecx,dtd
|
||||
|
||||
xor eax,ebx
|
||||
xor eax,ecx
|
||||
|
||||
add eax,dta
|
||||
add eax,data
|
||||
add eax,cc
|
||||
rol eax,shift
|
||||
add eax,dtb
|
||||
mov dta,eax
|
||||
}
|
||||
macro ii dta,dtb,dtc,dtd,data,shift,cc
|
||||
{
|
||||
mov eax,dtb
|
||||
mov ebx,dtc
|
||||
mov ecx,dtd
|
||||
|
||||
not ecx
|
||||
or eax,ecx
|
||||
xor eax,ebx
|
||||
|
||||
add eax,dta
|
||||
add eax,data
|
||||
add eax,cc
|
||||
rol eax,shift
|
||||
add eax,dtb
|
||||
mov dta,eax
|
||||
}
|
||||
; round 1
|
||||
ff [dta],[dtb],[dtc],[dtd],dword [edi+00*4],07,0xd76aa478
|
||||
ff [dtd],[dta],[dtb],[dtc],dword [edi+01*4],12,0xe8c7b756
|
||||
ff [dtc],[dtd],[dta],[dtb],dword [edi+02*4],17,0x242070db
|
||||
ff [dtb],[dtc],[dtd],[dta],dword [edi+03*4],22,0xc1bdceee
|
||||
ff [dta],[dtb],[dtc],[dtd],dword [edi+04*4],07,0xf57c0faf
|
||||
ff [dtd],[dta],[dtb],[dtc],dword [edi+05*4],12,0x4787c62a
|
||||
ff [dtc],[dtd],[dta],[dtb],dword [edi+06*4],17,0xa8304613
|
||||
ff [dtb],[dtc],[dtd],[dta],dword [edi+07*4],22,0xfd469501
|
||||
ff [dta],[dtb],[dtc],[dtd],dword [edi+08*4],07,0x698098d8
|
||||
ff [dtd],[dta],[dtb],[dtc],dword [edi+09*4],12,0x8b44f7af
|
||||
ff [dtc],[dtd],[dta],[dtb],dword [edi+10*4],17,0xffff5bb1
|
||||
ff [dtb],[dtc],[dtd],[dta],dword [edi+11*4],22,0x895cd7be
|
||||
ff [dta],[dtb],[dtc],[dtd],dword [edi+12*4],07,0x6b901122
|
||||
ff [dtd],[dta],[dtb],[dtc],dword [edi+13*4],12,0xfd987193
|
||||
ff [dtc],[dtd],[dta],[dtb],dword [edi+14*4],17,0xa679438e
|
||||
ff [dtb],[dtc],[dtd],[dta],dword [edi+15*4],22,0x49b40821
|
||||
; round 2
|
||||
gg [dta],[dtb],[dtc],[dtd],dword [edi+01*4],05,0xf61e2562
|
||||
gg [dtd],[dta],[dtb],[dtc],dword [edi+06*4],09,0xc040b340
|
||||
gg [dtc],[dtd],[dta],[dtb],dword [edi+11*4],14,0x265e5a51
|
||||
gg [dtb],[dtc],[dtd],[dta],dword [edi+00*4],20,0xe9b6c7aa
|
||||
gg [dta],[dtb],[dtc],[dtd],dword [edi+05*4],05,0xd62f105d
|
||||
gg [dtd],[dta],[dtb],[dtc],dword [edi+10*4],09,0x02441453
|
||||
gg [dtc],[dtd],[dta],[dtb],dword [edi+15*4],14,0xd8a1e681
|
||||
gg [dtb],[dtc],[dtd],[dta],dword [edi+04*4],20,0xe7d3fbc8
|
||||
gg [dta],[dtb],[dtc],[dtd],dword [edi+09*4],05,0x21e1cde6
|
||||
gg [dtd],[dta],[dtb],[dtc],dword [edi+14*4],09,0xc33707d6
|
||||
gg [dtc],[dtd],[dta],[dtb],dword [edi+03*4],14,0xf4d50d87
|
||||
gg [dtb],[dtc],[dtd],[dta],dword [edi+08*4],20,0x455a14ed
|
||||
gg [dta],[dtb],[dtc],[dtd],dword [edi+13*4],05,0xa9e3e905
|
||||
gg [dtd],[dta],[dtb],[dtc],dword [edi+02*4],09,0xfcefa3f8
|
||||
gg [dtc],[dtd],[dta],[dtb],dword [edi+07*4],14,0x676f02d9
|
||||
gg [dtb],[dtc],[dtd],[dta],dword [edi+12*4],20,0x8d2a4c8a
|
||||
; round 3
|
||||
hh [dta],[dtb],[dtc],[dtd],dword [edi+05*4],04,0xfffa3942
|
||||
hh [dtd],[dta],[dtb],[dtc],dword [edi+08*4],11,0x8771f681
|
||||
hh [dtc],[dtd],[dta],[dtb],dword [edi+11*4],16,0x6d9d6122
|
||||
hh [dtb],[dtc],[dtd],[dta],dword [edi+14*4],23,0xfde5380c
|
||||
hh [dta],[dtb],[dtc],[dtd],dword [edi+01*4],04,0xa4beea44
|
||||
hh [dtd],[dta],[dtb],[dtc],dword [edi+04*4],11,0x4bdecfa9
|
||||
hh [dtc],[dtd],[dta],[dtb],dword [edi+07*4],16,0xf6bb4b60
|
||||
hh [dtb],[dtc],[dtd],[dta],dword [edi+10*4],23,0xbebfbc70
|
||||
hh [dta],[dtb],[dtc],[dtd],dword [edi+13*4],04,0x289b7ec6
|
||||
hh [dtd],[dta],[dtb],[dtc],dword [edi+00*4],11,0xeaa127fa
|
||||
hh [dtc],[dtd],[dta],[dtb],dword [edi+03*4],16,0xd4ef3085
|
||||
hh [dtb],[dtc],[dtd],[dta],dword [edi+06*4],23,0x04881d05
|
||||
hh [dta],[dtb],[dtc],[dtd],dword [edi+09*4],04,0xd9d4d039
|
||||
hh [dtd],[dta],[dtb],[dtc],dword [edi+12*4],11,0xe6db99e5
|
||||
hh [dtc],[dtd],[dta],[dtb],dword [edi+15*4],16,0x1fa27cf8
|
||||
hh [dtb],[dtc],[dtd],[dta],dword [edi+02*4],23,0xc4ac5665
|
||||
; round 4
|
||||
ii [dta],[dtb],[dtc],[dtd],dword [edi+00*4],06,0xf4292244
|
||||
ii [dtd],[dta],[dtb],[dtc],dword [edi+07*4],10,0x432aff97
|
||||
ii [dtc],[dtd],[dta],[dtb],dword [edi+14*4],15,0xab9423a7
|
||||
ii [dtb],[dtc],[dtd],[dta],dword [edi+05*4],21,0xfc93a039
|
||||
ii [dta],[dtb],[dtc],[dtd],dword [edi+12*4],06,0x655b59c3
|
||||
ii [dtd],[dta],[dtb],[dtc],dword [edi+03*4],10,0x8f0ccc92
|
||||
ii [dtc],[dtd],[dta],[dtb],dword [edi+10*4],15,0xffeff47d
|
||||
ii [dtb],[dtc],[dtd],[dta],dword [edi+01*4],21,0x85845dd1
|
||||
ii [dta],[dtb],[dtc],[dtd],dword [edi+08*4],06,0x6fa87e4f
|
||||
ii [dtd],[dta],[dtb],[dtc],dword [edi+15*4],10,0xfe2ce6e0
|
||||
ii [dtc],[dtd],[dta],[dtb],dword [edi+06*4],15,0xa3014314
|
||||
ii [dtb],[dtc],[dtd],[dta],dword [edi+13*4],21,0x4e0811a1
|
||||
ii [dta],[dtb],[dtc],[dtd],dword [edi+04*4],06,0xf7537e82
|
||||
ii [dtd],[dta],[dtb],[dtc],dword [edi+11*4],10,0xbd3af235
|
||||
ii [dtc],[dtd],[dta],[dtb],dword [edi+02*4],15,0x2ad7d2bb
|
||||
ii [dtb],[dtc],[dtd],[dta],dword [edi+09*4],21,0xeb86d391
|
||||
|
||||
mov eax,[dta]
|
||||
add [dtA],eax
|
||||
mov eax,[dtb]
|
||||
add [dtB],eax
|
||||
mov eax,[dtc]
|
||||
add [dtC],eax
|
||||
mov eax,[dtd]
|
||||
add [dtD],eax
|
||||
|
||||
add edi,64
|
||||
|
||||
sub edx,64
|
||||
jnz hashloop
|
||||
|
||||
; phase IV - results
|
||||
|
||||
mov ecx,4
|
||||
mov esi,ptMD5Result
|
||||
|
||||
@@: mov eax,[esi]
|
||||
xchg al,ah
|
||||
rol eax,16
|
||||
xchg al,ah
|
||||
mov [esi],eax
|
||||
|
||||
add esi,4
|
||||
loop @b
|
||||
|
||||
translate:
|
||||
;diff16 "translate",translate
|
||||
mov esi,ptMD5Result-5
|
||||
mov edi,hexresult
|
||||
mov ecx,16
|
||||
@@:
|
||||
test ecx,3
|
||||
jnz .nojmp
|
||||
add esi,8
|
||||
.nojmp:
|
||||
xor eax,eax
|
||||
mov al,byte [esi]
|
||||
mov edx,eax
|
||||
shr eax,4
|
||||
mov bl,byte [table+eax]
|
||||
mov [edi],bl
|
||||
inc edi
|
||||
and edx,15
|
||||
mov bl,byte [table+edx]
|
||||
mov [edi],bl
|
||||
dec esi
|
||||
inc edi
|
||||
loop @b
|
||||
|
||||
mov esi,hexresult
|
||||
|
||||
mov [text], esi
|
||||
mov eax,32
|
||||
mov [textlen], eax
|
||||
call draw_window
|
||||
|
||||
jmp still
|
||||
|
||||
; *********************************************
|
||||
; ******* WINDOW DEFINITIONS AND DRAW ********
|
||||
; *********************************************
|
||||
|
||||
|
||||
draw_window:
|
||||
|
||||
mov eax,12 ; function 12:tell os about windowdraw
|
||||
mov ebx,1 ; 1, start of draw
|
||||
int 0x40
|
||||
; DRAW WINDOW
|
||||
mov eax,0 ; function 0 : define and draw window
|
||||
mov ebx,100*65536+230 ; [x start] *65536 + [x size]
|
||||
mov ecx,60*65536+100 ; [y start] *65536 + [y size]
|
||||
mov edx,0x03ffffff ; color of work area RRGGBB
|
||||
mov esi,0x80aabbcc ; color of grab bar RRGGBB,8->color gl
|
||||
mov edi,0x00aabbcc ; color of frames RRGGBB
|
||||
int 0x40
|
||||
|
||||
; WINDOW LABEL
|
||||
mov eax,4 ; function 4 : write text to window
|
||||
mov ebx,8*65536+8 ; [x start] *65536 + [y start]
|
||||
mov ecx,0x00ffffff ; color of text RRGGBB
|
||||
mov edx,labeltext ; pointer to text beginning
|
||||
mov esi,lte-labeltext ; text length
|
||||
int 0x40
|
||||
; <20>¨á㥬 ª®¯ªã ¤«ï £¥¥à 樨
|
||||
mov eax,8 ; function 8 : define and draw button
|
||||
mov ebx,20*65536+80 ; [x start] *65536 + [x size]
|
||||
mov ecx,34*65536+14 ; [y start] *65536 + [y size]
|
||||
mov edx,2 ; button id
|
||||
mov esi,0x5588dd ; button color RRGGBB
|
||||
int 0x40
|
||||
|
||||
; <20> §¢ ¨¥ ª®¯ªã
|
||||
mov eax,4 ; function 4 : write text to window
|
||||
mov ebx,23*65536+38 ; [x start] *65536 + [y start]
|
||||
mov ecx,0x000000 ; color of text RRGGBB
|
||||
mov edx,gen_txt ; pointer to text beginning
|
||||
mov esi,gen_len-gen_txt ; text length
|
||||
int 0x40
|
||||
|
||||
mov eax,4 ; draw info text with function 4
|
||||
mov ebx,20*65536+70
|
||||
mov ecx,0x000000
|
||||
mov edx,[text]
|
||||
xor eax,eax
|
||||
mov al, [textlen]
|
||||
mov esi,eax
|
||||
mov eax,4
|
||||
int 0x40
|
||||
|
||||
mov eax,12 ; function 12:tell os about windowdraw
|
||||
mov ebx,2 ; 2, end of draw
|
||||
int 0x40
|
||||
|
||||
ret
|
||||
|
||||
;Ž¡« áâì ¤ ëå
|
||||
|
||||
labeltext: db 'MD5 Generator'
|
||||
lte:
|
||||
|
||||
text: dd 0
|
||||
textlen: dd 0
|
||||
|
||||
gen_txt: db '‘£¥¥à¨à®¢ âì'
|
||||
gen_len:
|
||||
|
||||
InputMD5Rez: dd 0
|
||||
InputMD5Rezlen:
|
||||
|
||||
ptBuffer: db '123' ;‡ ¬¥¨âì £¥¥à¨à㥬®¥ á«®¢®
|
||||
rb 61
|
||||
dtBufferLength: dd 3 ;<3B> §¬¥à ptBuffer
|
||||
|
||||
ptMD5Result:
|
||||
|
||||
dtA: dd 0
|
||||
dtB: dd 0
|
||||
dtC: dd 0
|
||||
dtD: dd 0
|
||||
|
||||
dta: dd 0
|
||||
dtb: dd 0
|
||||
dtc: dd 0
|
||||
dtd: dd 0
|
||||
|
||||
x: dd 0
|
||||
s: dd 0
|
||||
t: dd 0
|
||||
|
||||
table: db '0123456789abcdef'
|
||||
hexresult db 32
|
||||
|
||||
I_END:
|
||||
4
programs/develop/examples/rtdata/trunk/build_en.bat
Normal file
4
programs/develop/examples/rtdata/trunk/build_en.bat
Normal file
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix en >lang.inc
|
||||
@fasm rtdata.asm rtdata
|
||||
@pause
|
||||
4
programs/develop/examples/rtdata/trunk/build_ru.bat
Normal file
4
programs/develop/examples/rtdata/trunk/build_ru.bat
Normal file
@@ -0,0 +1,4 @@
|
||||
@erase lang.inc
|
||||
@echo lang fix ru >lang.inc
|
||||
@fasm rtdata.asm rtdata
|
||||
@pause
|
||||
@@ -1,267 +1,266 @@
|
||||
; new application structure
|
||||
macro meos_app_start
|
||||
{
|
||||
use32
|
||||
org 0x0
|
||||
|
||||
db 'MENUET01'
|
||||
dd 0x01
|
||||
dd __start
|
||||
dd __end
|
||||
dd __memory
|
||||
dd __stack
|
||||
|
||||
if used __params & ~defined __params
|
||||
dd __params
|
||||
else
|
||||
dd 0x0
|
||||
end if
|
||||
|
||||
dd 0x0
|
||||
}
|
||||
MEOS_APP_START fix meos_app_start
|
||||
|
||||
macro code
|
||||
{
|
||||
__start:
|
||||
}
|
||||
CODE fix code
|
||||
|
||||
macro data
|
||||
{
|
||||
__data:
|
||||
}
|
||||
DATA fix data
|
||||
|
||||
macro udata
|
||||
{
|
||||
if used __params & ~defined __params
|
||||
__params:
|
||||
db 0
|
||||
__end:
|
||||
rb 255
|
||||
else
|
||||
__end:
|
||||
end if
|
||||
__udata:
|
||||
}
|
||||
UDATA fix udata
|
||||
|
||||
macro meos_app_end
|
||||
{
|
||||
align 32
|
||||
rb 2048
|
||||
__stack:
|
||||
__memory:
|
||||
}
|
||||
MEOS_APP_END fix meos_app_end
|
||||
|
||||
|
||||
; macro for defining multiline text data
|
||||
struc mstr [sstring]
|
||||
{
|
||||
forward
|
||||
local ssize
|
||||
virtual at 0
|
||||
db sstring
|
||||
ssize = $
|
||||
end virtual
|
||||
dd ssize
|
||||
db sstring
|
||||
common
|
||||
dd -1
|
||||
}
|
||||
|
||||
|
||||
; strings
|
||||
macro sz name,[data] { ; from MFAR [mike.dld]
|
||||
common
|
||||
if used name
|
||||
label name
|
||||
end if
|
||||
forward
|
||||
if used name
|
||||
db data
|
||||
end if
|
||||
common
|
||||
if used name
|
||||
.size = $-name
|
||||
end if
|
||||
}
|
||||
|
||||
macro lsz name,[lng,data] { ; from MFAR [mike.dld]
|
||||
common
|
||||
if used name
|
||||
label name
|
||||
end if
|
||||
forward
|
||||
if (used name)&(lang eq lng)
|
||||
db data
|
||||
end if
|
||||
common
|
||||
if used name
|
||||
.size = $-name
|
||||
end if
|
||||
}
|
||||
|
||||
|
||||
|
||||
; easy system call macro
|
||||
macro mpack dest, hsrc, lsrc
|
||||
{
|
||||
if (hsrc eqtype 0) & (lsrc eqtype 0)
|
||||
mov dest, (hsrc) shl 16 + lsrc
|
||||
else
|
||||
if (hsrc eqtype 0) & (~lsrc eqtype 0)
|
||||
mov dest, (hsrc) shl 16
|
||||
add dest, lsrc
|
||||
else
|
||||
mov dest, hsrc
|
||||
shl dest, 16
|
||||
add dest, lsrc
|
||||
end if
|
||||
end if
|
||||
}
|
||||
|
||||
macro __mov reg,a,b { ; mike.dld
|
||||
if (~a eq)&(~b eq)
|
||||
mpack reg,a,b
|
||||
else if (~a eq)&(b eq)
|
||||
mov reg,a
|
||||
end if
|
||||
}
|
||||
|
||||
macro mcall a,b,c,d,e,f { ; mike.dld
|
||||
__mov eax,a
|
||||
__mov ebx,b
|
||||
__mov ecx,c
|
||||
__mov edx,d
|
||||
__mov esi,e
|
||||
__mov edi,f
|
||||
int 0x40
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; optimize the code for size
|
||||
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp>
|
||||
|
||||
macro add arg1,arg2
|
||||
{
|
||||
if (arg2 eqtype 0)
|
||||
if (arg2) = 1
|
||||
inc arg1
|
||||
else
|
||||
add arg1,arg2
|
||||
end if
|
||||
else
|
||||
add arg1,arg2
|
||||
end if
|
||||
}
|
||||
|
||||
macro sub arg1,arg2
|
||||
{
|
||||
if (arg2 eqtype 0)
|
||||
if (arg2) = 1
|
||||
dec arg1
|
||||
else
|
||||
sub arg1,arg2
|
||||
end if
|
||||
else
|
||||
sub arg1,arg2
|
||||
end if
|
||||
}
|
||||
|
||||
macro mov arg1,arg2
|
||||
{
|
||||
if (arg1 in __regs) & (arg2 eqtype 0)
|
||||
if (arg2) = 0
|
||||
xor arg1,arg1
|
||||
else if (arg2) = 1
|
||||
xor arg1,arg1
|
||||
inc arg1
|
||||
else if (arg2) = -1
|
||||
or arg1,-1
|
||||
else if (arg2) > -128 & (arg2) < 128
|
||||
push arg2
|
||||
pop arg1
|
||||
else
|
||||
mov arg1,arg2
|
||||
end if
|
||||
else
|
||||
mov arg1,arg2
|
||||
end if
|
||||
}
|
||||
|
||||
|
||||
macro struct name
|
||||
{
|
||||
virtual at 0
|
||||
name name
|
||||
sizeof.#name = $ - name
|
||||
end virtual
|
||||
}
|
||||
|
||||
; structures used in MeOS
|
||||
struc process_information
|
||||
{
|
||||
.cpu_usage dd ? ; +0
|
||||
.window_stack_position dw ? ; +4
|
||||
.window_stack_value dw ? ; +6
|
||||
.not_used1 dw ? ; +8
|
||||
.process_name rb 12 ; +10
|
||||
.memory_start dd ? ; +22
|
||||
.used_memory dd ? ; +26
|
||||
.PID dd ? ; +30
|
||||
.x_start dd ? ; +34
|
||||
.y_start dd ? ; +38
|
||||
.x_size dd ? ; +42
|
||||
.y_size dd ? ; +46
|
||||
.slot_state dw ? ; +50
|
||||
rb (1024-52)
|
||||
}
|
||||
struct process_information
|
||||
|
||||
struc system_colors
|
||||
{
|
||||
.frame dd ?
|
||||
.grab dd ?
|
||||
.grab_button dd ?
|
||||
.grab_button_text dd ?
|
||||
.grab_text dd ?
|
||||
.work dd ?
|
||||
.work_button dd ?
|
||||
.work_button_text dd ?
|
||||
.work_text dd ?
|
||||
.work_graph dd ?
|
||||
}
|
||||
struct system_colors
|
||||
|
||||
|
||||
; constants
|
||||
|
||||
; events
|
||||
EV_IDLE = 0
|
||||
EV_TIMER = 0
|
||||
EV_REDRAW = 1
|
||||
EV_KEY = 2
|
||||
EV_BUTTON = 3
|
||||
EV_EXIT = 4
|
||||
EV_BACKGROUND = 5
|
||||
EV_MOUSE = 6
|
||||
EV_IPC = 7
|
||||
EV_STACK = 8
|
||||
|
||||
; event mask bits for function 40
|
||||
EVM_REDRAW = 1b
|
||||
EVM_KEY = 10b
|
||||
EVM_BUTTON = 100b
|
||||
EVM_EXIT = 1000b
|
||||
EVM_BACKGROUND = 10000b
|
||||
EVM_MOUSE = 100000b
|
||||
EVM_IPC = 1000000b
|
||||
; new application structure
|
||||
macro meos_app_start
|
||||
{
|
||||
use32
|
||||
org 0x0
|
||||
|
||||
db 'MENUET01'
|
||||
dd 0x01
|
||||
dd __start
|
||||
dd __end
|
||||
dd __memory
|
||||
dd __stack
|
||||
|
||||
if used __params & ~defined __params
|
||||
dd __params
|
||||
else
|
||||
dd 0x0
|
||||
end if
|
||||
|
||||
dd 0x0
|
||||
}
|
||||
MEOS_APP_START fix meos_app_start
|
||||
|
||||
macro code
|
||||
{
|
||||
__start:
|
||||
}
|
||||
CODE fix code
|
||||
|
||||
macro data
|
||||
{
|
||||
__data:
|
||||
}
|
||||
DATA fix data
|
||||
|
||||
macro udata
|
||||
{
|
||||
if used __params & ~defined __params
|
||||
__params:
|
||||
db 0
|
||||
__end:
|
||||
rb 255
|
||||
else
|
||||
__end:
|
||||
end if
|
||||
__udata:
|
||||
}
|
||||
UDATA fix udata
|
||||
|
||||
macro meos_app_end
|
||||
{
|
||||
align 32
|
||||
rb 2048
|
||||
__stack:
|
||||
__memory:
|
||||
}
|
||||
MEOS_APP_END fix meos_app_end
|
||||
|
||||
|
||||
; macro for defining multiline text data
|
||||
struc mstr [sstring]
|
||||
{
|
||||
forward
|
||||
local ssize
|
||||
virtual at 0
|
||||
db sstring
|
||||
ssize = $
|
||||
end virtual
|
||||
dd ssize
|
||||
db sstring
|
||||
common
|
||||
dd -1
|
||||
}
|
||||
|
||||
|
||||
; strings
|
||||
macro sz name,[data] { ; from MFAR [mike.dld]
|
||||
common
|
||||
if used name
|
||||
label name
|
||||
end if
|
||||
forward
|
||||
if used name
|
||||
db data
|
||||
end if
|
||||
common
|
||||
if used name
|
||||
.size = $-name
|
||||
end if
|
||||
}
|
||||
|
||||
macro lsz name,[lng,data] { ; from MFAR [mike.dld]
|
||||
common
|
||||
if used name
|
||||
label name
|
||||
end if
|
||||
forward
|
||||
if (used name)&(lang eq lng)
|
||||
db data
|
||||
end if
|
||||
common
|
||||
if used name
|
||||
.size = $-name
|
||||
end if
|
||||
}
|
||||
|
||||
|
||||
|
||||
; easy system call macro
|
||||
macro mpack dest, hsrc, lsrc
|
||||
{
|
||||
if (hsrc eqtype 0) & (lsrc eqtype 0)
|
||||
mov dest, (hsrc) shl 16 + lsrc
|
||||
else
|
||||
if (hsrc eqtype 0) & (~lsrc eqtype 0)
|
||||
mov dest, (hsrc) shl 16
|
||||
add dest, lsrc
|
||||
else
|
||||
mov dest, hsrc
|
||||
shl dest, 16
|
||||
add dest, lsrc
|
||||
end if
|
||||
end if
|
||||
}
|
||||
|
||||
macro __mov reg,a,b { ; mike.dld
|
||||
if (~a eq)&(~b eq)
|
||||
mpack reg,a,b
|
||||
else if (~a eq)&(b eq)
|
||||
mov reg,a
|
||||
end if
|
||||
}
|
||||
|
||||
macro mcall a,b,c,d,e,f { ; mike.dld
|
||||
__mov eax,a
|
||||
__mov ebx,b
|
||||
__mov ecx,c
|
||||
__mov edx,d
|
||||
__mov esi,e
|
||||
__mov edi,f
|
||||
int 0x40
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; optimize the code for size
|
||||
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp>
|
||||
|
||||
macro add arg1,arg2
|
||||
{
|
||||
if (arg2 eqtype 0)
|
||||
if (arg2) = 1
|
||||
inc arg1
|
||||
else
|
||||
add arg1,arg2
|
||||
end if
|
||||
else
|
||||
add arg1,arg2
|
||||
end if
|
||||
}
|
||||
|
||||
macro sub arg1,arg2
|
||||
{
|
||||
if (arg2 eqtype 0)
|
||||
if (arg2) = 1
|
||||
dec arg1
|
||||
else
|
||||
sub arg1,arg2
|
||||
end if
|
||||
else
|
||||
sub arg1,arg2
|
||||
end if
|
||||
}
|
||||
|
||||
macro mov arg1,arg2
|
||||
{
|
||||
if (arg1 in __regs) & (arg2 eqtype 0)
|
||||
if (arg2) = 0
|
||||
xor arg1,arg1
|
||||
else if (arg2) = 1
|
||||
xor arg1,arg1
|
||||
inc arg1
|
||||
else if (arg2) = -1
|
||||
or arg1,-1
|
||||
else if (arg2) > -128 & (arg2) < 128
|
||||
push arg2
|
||||
pop arg1
|
||||
else
|
||||
mov arg1,arg2
|
||||
end if
|
||||
else
|
||||
mov arg1,arg2
|
||||
end if
|
||||
}
|
||||
|
||||
|
||||
macro struct name
|
||||
{
|
||||
virtual at 0
|
||||
name name
|
||||
sizeof.#name = $ - name
|
||||
end virtual
|
||||
}
|
||||
|
||||
; structures used in MeOS
|
||||
struc process_information
|
||||
{
|
||||
.cpu_usage dd ? ; +0
|
||||
.window_stack_position dw ? ; +4
|
||||
.window_stack_value dw ? ; +6
|
||||
.not_used1 dw ? ; +8
|
||||
.process_name rb 12 ; +10
|
||||
.memory_start dd ? ; +22
|
||||
.used_memory dd ? ; +26
|
||||
.PID dd ? ; +30
|
||||
.x_start dd ? ; +34
|
||||
.y_start dd ? ; +38
|
||||
.x_size dd ? ; +42
|
||||
.y_size dd ? ; +46
|
||||
.slot_state dw ? ; +50
|
||||
rb (1024-52)
|
||||
}
|
||||
struct process_information
|
||||
|
||||
struc system_colors
|
||||
{
|
||||
.frame dd ?
|
||||
.grab dd ?
|
||||
.grab_button dd ?
|
||||
.grab_button_text dd ?
|
||||
.grab_text dd ?
|
||||
.work dd ?
|
||||
.work_button dd ?
|
||||
.work_button_text dd ?
|
||||
.work_text dd ?
|
||||
.work_graph dd ?
|
||||
}
|
||||
struct system_colors
|
||||
|
||||
|
||||
; constants
|
||||
|
||||
; events
|
||||
EV_IDLE = 0
|
||||
EV_TIMER = 0
|
||||
EV_REDRAW = 1
|
||||
EV_KEY = 2
|
||||
EV_BUTTON = 3
|
||||
EV_EXIT = 4
|
||||
EV_BACKGROUND = 5
|
||||
EV_MOUSE = 6
|
||||
EV_IPC = 7
|
||||
EV_STACK = 8
|
||||
|
||||
; event mask bits for function 40
|
||||
EVM_REDRAW = 1b
|
||||
EVM_KEY = 10b
|
||||
EVM_BUTTON = 100b
|
||||
EVM_EXIT = 1000b
|
||||
EVM_BACKGROUND = 10000b
|
||||
EVM_MOUSE = 100000b
|
||||
EVM_IPC = 1000000b
|
||||
EVM_STACK = 10000000b
|
||||
235
programs/develop/examples/rtdata/trunk/rtdata.asm
Normal file
235
programs/develop/examples/rtdata/trunk/rtdata.asm
Normal file
@@ -0,0 +1,235 @@
|
||||
;
|
||||
; COMMUNICATING WITH MODEM: PORTS & IRQ
|
||||
;
|
||||
; Compile with FASM for Menuet
|
||||
;
|
||||
|
||||
include "lang.inc"
|
||||
include "macros.inc"
|
||||
|
||||
use32
|
||||
org 0x0
|
||||
|
||||
db 'MENUET01' ; 8 byte id
|
||||
dd 0x01 ; header version
|
||||
dd START ; start of code
|
||||
dd I_END ; size of image
|
||||
dd 0x1000 ; memory for app
|
||||
dd 0x1000 ; esp
|
||||
dd 0x0 , 0x0 ; I_Param , I_Icon
|
||||
|
||||
|
||||
START: ; start of execution
|
||||
|
||||
|
||||
mov eax,45 ; reserve irq 4
|
||||
mov ebx,0
|
||||
mov ecx,4
|
||||
int 0x40
|
||||
|
||||
mov eax,46 ; reserve ports 0x3f8-0x3ff
|
||||
mov ebx,0
|
||||
mov ecx,0x3f8
|
||||
mov edx,0x3ff
|
||||
int 0x40
|
||||
|
||||
mov eax,44 ; read these ports at interrupt/irq 4
|
||||
mov ebx,irqtable
|
||||
mov ecx,4
|
||||
int 0x40
|
||||
|
||||
mov eax,40 ; enable event for interrupt/irq 4
|
||||
mov ebx,10000b shl 16 + 111b
|
||||
int 0x40
|
||||
|
||||
call program_com1
|
||||
|
||||
call draw_window
|
||||
|
||||
still:
|
||||
|
||||
mov eax,10 ; wait here for event
|
||||
int 0x40
|
||||
|
||||
cmp eax,1 ; redraw request ?
|
||||
je red
|
||||
cmp eax,2 ; key in buffer ?
|
||||
je key
|
||||
cmp eax,3 ; button in buffer ?
|
||||
je button
|
||||
cmp eax,16+4 ; data read by interrupt ?
|
||||
je irq4
|
||||
|
||||
jmp still
|
||||
|
||||
red: ; redraw
|
||||
call draw_window
|
||||
jmp still
|
||||
|
||||
key: ; key
|
||||
mov eax,2 ; just read it and ignore
|
||||
int 0x40
|
||||
|
||||
mov al,ah
|
||||
mov dx,0x3f8
|
||||
out dx,al
|
||||
|
||||
jmp still
|
||||
|
||||
button: ; button
|
||||
or eax,-1 ; close this program
|
||||
int 0x40
|
||||
|
||||
|
||||
irq4:
|
||||
|
||||
mov eax,42
|
||||
mov ebx,4
|
||||
int 0x40
|
||||
|
||||
; eax = number of bytes left
|
||||
; ecx = 0 success, =1 fail
|
||||
; bl = byte
|
||||
|
||||
inc [pos]
|
||||
and [pos],31
|
||||
mov eax,[pos]
|
||||
|
||||
mov [string+eax], bl
|
||||
call draw_string
|
||||
|
||||
jmp still
|
||||
|
||||
|
||||
baudrate_9600 equ 12
|
||||
baudrate_57600 equ 2
|
||||
|
||||
program_com1:
|
||||
|
||||
mov dx,0x3f8+3
|
||||
mov al,0x80
|
||||
out dx,al
|
||||
|
||||
mov dx,0x3f8+1
|
||||
mov al,0x00
|
||||
out dx,al
|
||||
|
||||
mov dx,0x3f8+0
|
||||
mov al,baudrate_9600
|
||||
out dx,al
|
||||
|
||||
mov dx,0x3f8+3
|
||||
mov al,0x3
|
||||
out dx,al
|
||||
|
||||
mov dx,0x3f8+4
|
||||
mov al,0xb
|
||||
out dx,al
|
||||
|
||||
mov dx,0x3f8+1
|
||||
mov al,0x1
|
||||
out dx,al
|
||||
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; *********************************************
|
||||
; ******* WINDOW DEFINITIONS AND DRAW ********
|
||||
; *********************************************
|
||||
|
||||
|
||||
draw_window:
|
||||
|
||||
mov eax, 48
|
||||
mov ebx, 3
|
||||
mov ecx, sc
|
||||
mov edx, sizeof.system_colors
|
||||
int 0x40
|
||||
|
||||
mov eax, 12 ; function 12:tell os about windowdraw
|
||||
mov ebx, 1 ; 1, start of draw
|
||||
int 0x40
|
||||
|
||||
; DRAW WINDOW
|
||||
mov eax, 0 ; function 0 : define and draw window
|
||||
mov ebx, 100*65536+250 ; [x start] *65536 + [x size]
|
||||
mov ecx, 100*65536+85 ; [y start] *65536 + [y size]
|
||||
mov edx, [sc.work]
|
||||
or edx, 0x03000000 ; color of work area RRGGBB,8->color gl
|
||||
int 0x40
|
||||
|
||||
; WINDOW LABEL
|
||||
mov eax, 4 ; function 4 : write text to window
|
||||
mov ebx, 8*65536+8 ; [x start] *65536 + [y start]
|
||||
mov ecx, [sc.grab_text]
|
||||
or ecx, 0x10000000 ; font 1 & color ( 0xF0RRGGBB )
|
||||
mov edx, header ; pointer to text beginning
|
||||
mov esi, header.len ; text length
|
||||
int 0x40
|
||||
|
||||
mov eax, 4 ; draw text
|
||||
mov ebx, 20*65536+33
|
||||
mov ecx, [sc.work_text]
|
||||
mov edx, text+4
|
||||
.nextstr:
|
||||
mov esi, [edx-4]
|
||||
test esi, 0xFF000000
|
||||
jnz .finstr
|
||||
int 0x40
|
||||
add edx, esi
|
||||
add edx, 4
|
||||
add ebx, 10
|
||||
jmp .nextstr
|
||||
.finstr:
|
||||
|
||||
call draw_string
|
||||
|
||||
mov eax,12 ; function 12:tell os about windowdraw
|
||||
mov ebx,2 ; 2, end of draw
|
||||
int 0x40
|
||||
|
||||
ret
|
||||
|
||||
|
||||
draw_string:
|
||||
mov eax, 4
|
||||
mov ebx, 20*65536+65
|
||||
mov ecx, [sc.work_text]
|
||||
mov edx, string
|
||||
mov esi, 32
|
||||
int 0x40
|
||||
ret
|
||||
|
||||
|
||||
; DATA AREA
|
||||
|
||||
|
||||
if lang eq ru
|
||||
text mstr "‚‚Ž„ˆŒ›… ‘ˆŒ‚Ž‹› <20>…<EFBFBD>…„€ž’‘Ÿ ŒŽ„…Œ“.",\
|
||||
"„€<EFBFBD><EFBFBD>›… Ž’ ŒŽ„…Œ€ ‘—ˆ’›‚€ž’‘Ÿ <EFBFBD>Ž",\
|
||||
"<EFBFBD><EFBFBD>…<EFBFBD>›‚€<EFBFBD>ˆž IRQ4 ˆ Ž’Ž<EFBFBD><EFBFBD>€†€ž’‘Ÿ <EFBFBD>ˆ†…."
|
||||
header:
|
||||
db 'ŒŽ„…Œ <20>€ COM1'
|
||||
.len = $ - header
|
||||
else
|
||||
text mstr "TYPED CHARACTERS ARE SENT TO MODEM.",\
|
||||
"DATA FROM MODEM IS READ BY IRQ4",\
|
||||
"INTERRUPT AND DISPLAYED BELOW."
|
||||
header:
|
||||
db 'MODEM AT COM1'
|
||||
.len = $ - header
|
||||
end if
|
||||
|
||||
pos dd 0x0
|
||||
|
||||
irqtable:
|
||||
; port ; 1=byte, 2=word
|
||||
dd 0x3f8 +0x01000000 ; read byte from port 0x3f8 at interrupt/irq 4
|
||||
dd 0x0 ; no more ports ( max 15 ) to read
|
||||
|
||||
|
||||
I_END:
|
||||
|
||||
string rb 32
|
||||
sc system_colors
|
||||
@@ -2,7 +2,7 @@
|
||||
; flat assembler core
|
||||
; Copyright (c) 1999-2006, Tomasz Grysztar.
|
||||
; All rights reserved.
|
||||
|
||||
|
||||
convert_expression:
|
||||
push ebp
|
||||
call get_fp_value
|
||||
|
||||
@@ -22,7 +22,7 @@ APP_MEMORY = 0x00800000
|
||||
|
||||
;; Menuet header
|
||||
|
||||
appname equ "FASM "
|
||||
appname equ "flat assembler "
|
||||
|
||||
use32
|
||||
|
||||
@@ -392,11 +392,11 @@ text:
|
||||
s_compile db 'COMPILE'
|
||||
s_run db ' RUN '
|
||||
|
||||
infile db 'EXAMPLE.ASM'
|
||||
infile db 'example.asm'
|
||||
times MAX_PATH+$-infile db 0
|
||||
outfile db 'EXAMPLE'
|
||||
outfile db 'example'
|
||||
times MAX_PATH+$-outfile db 0
|
||||
path db '/RD/1/'
|
||||
path db '/rd/1/'
|
||||
times MAX_PATH+$-path db 0
|
||||
|
||||
lf db 13,10,0
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
|
||||
|
||||
; flat assembler core
|
||||
; Copyright (c) 1999-2006, Tomasz Grysztar.
|
||||
; All rights reserved.
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
; cannot simply be copied and put under another distribution licence
|
||||
; (including the GNU Public Licence).
|
||||
|
||||
VERSION_STRING equ "1.67.13"
|
||||
VERSION_STRING equ "1.67.14"
|
||||
|
||||
VERSION_MAJOR = 1
|
||||
VERSION_MINOR = 67
|
||||
|
||||
@@ -223,6 +223,10 @@ basic_instruction:
|
||||
cdq
|
||||
cmp ecx,edx
|
||||
jne value_out_of_range
|
||||
cmp [value_type],4
|
||||
jne get_simm32_ok
|
||||
mov [value_type],2
|
||||
get_simm32_ok:
|
||||
ret
|
||||
basic_reg:
|
||||
lods byte [esi]
|
||||
@@ -6019,6 +6023,9 @@ get_address:
|
||||
mov edx,[symbol_identifier]
|
||||
mov [address_symbol],edx
|
||||
mov edx,eax
|
||||
ror ecx,16
|
||||
mov cl,[value_type]
|
||||
rol ecx,16
|
||||
mov bx,0FF00h
|
||||
address_ok:
|
||||
ret
|
||||
|
||||
2
programs/develop/mtdbg/build.bat
Normal file
2
programs/develop/mtdbg/build.bat
Normal file
@@ -0,0 +1,2 @@
|
||||
@fasm mtdbg.asm mtdbg
|
||||
@pause
|
||||
4825
programs/develop/mtdbg/mtdbg.asm
Normal file
4825
programs/develop/mtdbg/mtdbg.asm
Normal file
File diff suppressed because it is too large
Load Diff
203
programs/develop/mtdbg/mtdbg.txt
Normal file
203
programs/develop/mtdbg/mtdbg.txt
Normal file
@@ -0,0 +1,203 @@
|
||||
Введение.
|
||||
|
||||
mtdbg представляет собой отладчик для операционной системы Kolibri. Данная
|
||||
документация описывает возможности отладчика и работу с ним. Если нужны
|
||||
какие-то возможности отладчика, которых ещё нет, либо обращайтесь на форум
|
||||
meos.sysbin.com (раздел "Программы"), либо мыльте мне на адрес, указанный в
|
||||
конце данного файла.
|
||||
|
||||
Общее описание.
|
||||
|
||||
В каждый момент времени mtdbg может отлаживать только одну программу. Назовём
|
||||
такую программу загруженной для отладки. Если никакая программа не загружена,
|
||||
абсолютное большинство действий по отладке недоступно.
|
||||
|
||||
mtdbg управляется командной строкой, вводимой с клавиатуры. Командная строка
|
||||
изображается в нижней части окна отладчика. Обрабатываются стандартные клавиши
|
||||
ввода Backspace,Delete,Home,End,стрелки влево/вправо.
|
||||
Команды нечувствительны к регистру символов. В качестве разделителя
|
||||
используется произвольное ненулевое число пробелов.
|
||||
|
||||
В любой момент отладчик можно завершить командой "quit" (без аргументов).
|
||||
Впрочем, можно и просто нажать на кнопку закрытия в левом верхнем углу окна.
|
||||
|
||||
Запуск отладчика без параметров командной строки приводит к тому, что
|
||||
никакая программа не загружена. Также mtdbg можно запускать с командной
|
||||
строкой, в этом случае он попытается загрузить программу с именем, указанным
|
||||
как первый аргумент командной строки, и параметрами, указанными как
|
||||
последующие (если они есть).
|
||||
|
||||
Если никакая программа не загружена, то можно загрузить программу командой
|
||||
load <полное имя исполняемого файла> [<аргументы>]
|
||||
Например:
|
||||
load /rd/1/example
|
||||
LOAD /rd/1/aclock w200 h200
|
||||
LoaD /hd0/1/menuetos/dosbox/dosbox
|
||||
Всё, что стоит после первого пробела после имени исполняемого файла, дословно
|
||||
передаётся программе в качестве командной строки.
|
||||
Команда load сообщает о результате в окне сообщений (немного выше окна
|
||||
командной строки). Если программу удалось загрузить, то об этом появится
|
||||
соответствующее сообщение; если не удалось, то в сообщении будет указана
|
||||
причина ошибки. Наиболее вероятная - "file not found", если неправильно указано
|
||||
имя файла.
|
||||
Может случиться так, что загруженная программа упакована. Общий принцип
|
||||
упаковки программ следующий: сначала исходный файл пакуется (каким-нибудь
|
||||
алгоритмом сжатия), потом приписывается небольшой по размеру код, который
|
||||
получает управление при запуске программы, распаковывает в памяти исходный код,
|
||||
после чего передаёт ему управление. Если программа упакована, то её "настоящий"
|
||||
код не виден и для отладки нужно предварительно пройти код распаковщика.
|
||||
mtdbg определяет большинство существующих упаковщиков (mxp,mxp_lzo,mxp_nrv,
|
||||
mtappack) и в этом случае предлагает автоматически пройти до "настоящего" кода.
|
||||
Рекомендуется согласиться (нажать 'y' или <Enter>), но можно и отказаться.
|
||||
При отказе и в случае, когда программа упакована чем-то неизвестным, можно
|
||||
использовать команду "unpack" (без аргументов). Вызывайте её только в случае,
|
||||
когда вы уверены, что программа упакована и что управление ещё не дошло до
|
||||
основного кода!
|
||||
|
||||
Загруженную программу можно прибить командой "terminate" (без аргументов).
|
||||
Команда "detach" (без аргументов) отключается от программы, после чего
|
||||
программа продолжает выполняться нормально, как если бы отладчика не было.
|
||||
После обеих этих команд программа перестаёт быть отлаживаемой.
|
||||
|
||||
Можно заново загрузить программу для отладки командой "reload" (без
|
||||
аргументов). Если уже есть загруженная программа, то она прибивается и
|
||||
запускается (с самого начала) новый экземпляр (с той же командной строкой),
|
||||
в этом случае команда аналогична командам
|
||||
terminate
|
||||
load <last program name> <last program arguments>
|
||||
В противном случае заново загружается программа, которую отлаживали последней
|
||||
(в текущем сеансе работы с mtdbg) (с той же командной строкой), т.е. почти то
|
||||
же самое, что и
|
||||
load <last program name> <last program arguments>,
|
||||
но команда reload в обоих случаях короче и удобнее; кроме того, load считает,
|
||||
что загружается новая программа, и переводит окно данных (см. ниже) на
|
||||
нулевой адрес, а reload сохраняет текущий адрес.
|
||||
|
||||
Всегда доступна команда "help", которую можно сокращать до "h".
|
||||
Все команды разбиты на группы.
|
||||
help без аргументов показывает список групп команд.
|
||||
help с указанием группы выводит список команд этой группы с краткими
|
||||
комментариями.
|
||||
help с указанием команды выводит информацию о заданной команде.
|
||||
Например:
|
||||
help
|
||||
help control
|
||||
h LoaD
|
||||
|
||||
Окно отладчика состоит из следующих элементов, перечисляемых сверху вниз:
|
||||
- строка состояния. При наличии загруженной программы показывает ее имя и
|
||||
состояние ("Running"/"Paused"), при отсутствии сообщает "No program loaded".
|
||||
- окно регистров - показывает значения регистров общего назначения, регистра
|
||||
eip и регистра флагов. Последний записан двумя способами: полное hex-значение
|
||||
и состояния отдельных флагов: CF,PF,AF,ZF,SF,DF,OF: если флаг сброшен, то
|
||||
изображается маленькая буква, если установлен, то заглавная.
|
||||
Регистры, изменившиеся с предыдущего момента, подсвечиваются зеленым.
|
||||
- окно данных (окно дампа) - показывает содержимое памяти загруженной программы
|
||||
- окно кода (окно дизассемблера) - показывает код программы в виде
|
||||
дизассемблированных инструкций
|
||||
- окно сообщений
|
||||
- окно командной строки
|
||||
|
||||
В окне дампа можно просматривать данные, начиная с любого адреса, для этого
|
||||
есть команда
|
||||
d <выражение>
|
||||
Команда d без аргументов пролистывает окно дампа вниз.
|
||||
То же самое относится к окну кода и команде
|
||||
u <выражение>
|
||||
или просто u.
|
||||
Например:
|
||||
d esi - показывает данные, находящиеся по адресу esi (например, полезна перед
|
||||
выполнением инструкции rep movsb)
|
||||
d esp - показывает стек
|
||||
u eip - дизассемблирует инструкции, начиная с текущей
|
||||
|
||||
Выражения в mtdbg могут включать
|
||||
- шестнадцатеричные константы
|
||||
- имена всех регистров общего назначения (8 32-битных, 8 16-битных и
|
||||
8 8-битных) и регистра eip; значения 16- и 8-битных регистров расширяются
|
||||
нулями до 32 бит
|
||||
- четыре арифметические операции +,-,*,/ (со стандартными приоритетами) и
|
||||
скобки.
|
||||
Все вычисления производятся по модулю 2^32.
|
||||
Примеры выражений:
|
||||
eax
|
||||
eip+2
|
||||
ecx-esi-1F
|
||||
al+AH*bl
|
||||
ax + 2* bH*(eip+a73)
|
||||
3*esi*di/EAX
|
||||
Команда
|
||||
? <выражение>
|
||||
вычисляет значение указанного выражения.
|
||||
|
||||
Значения регистров загруженной программы можно изменять командой r, имеющей
|
||||
две абсолютно эквивалентные формы:
|
||||
r <регистр> <выражение>
|
||||
r <регистр>=<выражение>
|
||||
(в обоих случаях можно расставлять пробелы по вкусу). В качестве регистра можно
|
||||
указывать любой из вышеупомянутых - 24 регистра общего назначения и eip.
|
||||
|
||||
|
||||
Допустим, команда load успешно загрузила программу для отладки.
|
||||
Сразу после загрузки программа приостановлена и не выполняется.
|
||||
Нажатие Ctrl+F7 (аналог командной строки - команда "s") делает один шаг в
|
||||
загруженной программе, после чего управление возвращается отладчику, который
|
||||
показывает новое содержимое регистров и памяти. Системный вызов int 40h при
|
||||
этом считается одним шагом.
|
||||
Нажатие Ctrl+F8 (аналог командной строки - команда "p") также делает шаг в
|
||||
загруженной программе, но при этом вызовы процедур, строковые операции с
|
||||
префиксом rep/repz/repnz и циклы loop выполняются как один шаг.
|
||||
Команды пошагового выполнения используются, как правило, на отдельных участках
|
||||
программы, когда нужно, например, регулярно отслеживать значения регистров
|
||||
и/или каких-то переменных в памяти.
|
||||
Команда
|
||||
g <выражение>
|
||||
возобновляет выполнение программы и ждёт, пока управление дойдёт до
|
||||
eip=соответствующему адресу, а в этот момент приостанавливает программу.
|
||||
Команда "g" без аргументов просто возобновляет выполнение программы.
|
||||
|
||||
Приостановить выполнение программы можно командой "stop" (без аргументов).
|
||||
|
||||
Обычно требуется, чтобы программа нормально выполнялась, но при наступлении
|
||||
определённых условий программа приостанавалась и управление получал отладчик.
|
||||
Соответствующие условия называются точками останова, breakpoint(s), в
|
||||
просторечии - бряками. Простейший тип точек останова - на конкретный адрес,
|
||||
т.е. прерывать выполнение при eip=<заданное значение>. Такие точки останова
|
||||
устанавливаются командой
|
||||
bp <выражение>
|
||||
Замечание. Если есть только одна такая точка останова, удобнее вместо неё
|
||||
использовать команду "g" с аргументом.
|
||||
|
||||
Другой тип точек останова - по обращению к заданному участку памяти.
|
||||
Таких точек останова может быть не больше четырёх (поскольку используются
|
||||
аппаратные возможности процессоров x86, где допускаются только 4 таких точки).
|
||||
bpm <выражение> - брякается на любой доступ к байту по указанному адресу
|
||||
bpm w <выражение> - брякается на запись байта по указанному адресу
|
||||
bpmb,bpmw,bpmd <выражение> - брякаются на доступ к соответственно байту, слову
|
||||
и двойному слову по указанному адресу. bpm и bpmb - синонимы. При использовании
|
||||
bpmw,bpmd адрес должен быть выровнен соответственно на границу слова (т.е. быть
|
||||
чётным) или на границу двойного слова (т.е. делиться на 4).
|
||||
bpmb,bpmw,bpmd w <выражение> - аналогично для бряка на запись.
|
||||
|
||||
Список установленных точек останова можно просмотреть командой "bl", информацию
|
||||
о конкретной точке останова можно получить с помощью "bl <номер>". Ненужные
|
||||
точки останова удаляются командой "bc <номер>", временно ненужные можно
|
||||
запретить командой "bd <номер>", когда они станут снова нужны, используйте
|
||||
команду "be <номер>".
|
||||
|
||||
Замечания.
|
||||
|
||||
1. При отладке собственных программ можно вставлять в код инструкции
|
||||
int3 (обратите внимание на отсутствие пробела!). Такая инструкция вызывает
|
||||
исключение при нормальном запуске, что приведёт к завершению процесса,
|
||||
но при работе под отладчиком просто активизируется отладчик (с сообщением
|
||||
"int3 command at xxx"). Это позволяет не думать о том, какие адреса
|
||||
использовать в командах g и/или bp.
|
||||
2. Весь вывод и весь ввод ориентирован на 16-ричную систему счисления.
|
||||
3. Когда программа выполняется, окна регистров и данных показывают информацию,
|
||||
относящуюся к моменту до возобновления; установка значений регистров в
|
||||
этом режиме невозможна. Впрочем, команда "d" в этом режиме показывает
|
||||
информацию, верную в момент выдачи команды.
|
||||
|
||||
diamond
|
||||
mailto:diamondz@land.ru
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user