1,45 → 1,45 |
;----------------------------------------------------------------------------- |
; |
; LAUNCHER - |
; ®¤ ¯à®£à ¬¬ë ᮢᥬ ¥ ®¯â¨¬¨§¨à®¢ , ® ®ç¥ì ¯à®áâ ¤«ï ¯®¨¬ ¨ï. |
; â®â « ãç¥à £à㧨⠨ä®à¬ æ¨î ® ¯à®£à ¬¬ å ¤«ï § ¯ã᪠¨§ ä ©« |
; AUTORUN.DAT. ®à¬ â ®ç¥ì ¯à®áâ ¨ ¢ ª®¬¬¥â à¨ïå ¥ 㦤 ¥âáï. |
; LAUNCHER - startup of programs |
; |
; ®¬¯¨«¨àã©â¥ á ¯®¬®éìî FASM 1.52 ¨ ¢ëè¥ |
; Compile with FASM 1.52 or newer |
; |
include "../../../macros.inc" |
|
;----------------------------------------------------------------------------- |
; last update: 02/03/2014 |
; changed by: Marat Zakiyanov aka Mario79, aka Mario |
; changes: Reducing the consumption of RAM, 4 KB instead of 32 KB. |
; Output to BOARD information about running applications. |
; Cleaning of the source code. |
; notice: Only 2 KB of memory for AUTORUN.DAT - be careful! |
;----------------------------------------------------------------------------- |
use32 |
org 0x0 |
db 'MENUET01' ; 8 byte id |
dd 0x01 ; header version |
dd START ; start of code |
dd I_END ; size of image |
dd 0x8000 ; memory for app |
dd 0x8000 ; esp |
dd 0x0 , 0x0 ; I_Param , I_Icon |
dd IM_END ; size of image |
dd I_END ; memory for app |
dd stack_top ; esp |
dd 0x0 ; I_Param |
dd 0x0 ; I_Icon |
;----------------------------------------------------------------------------- |
include "../../../macros.inc" |
|
;include "DEBUG.INC" |
|
define __DEBUG__ 1 |
define __DEBUG_LEVEL__ 1 |
include "../../../debug-fdo.inc" |
;----------------------------------------------------------------------------- |
START: ; start of execution |
|
; mov eax, 5 |
; mov ebx, 10 |
; mcall |
|
; mcall 18,15 |
|
mov eax, 70 ; load AUTORUN.DAT |
mov ebx, autorun_dat_info |
mcall |
mcall 70,autorun_dat_info ; load AUTORUN.DAT |
add ebx, file_data |
mov [fileend], ebx |
|
;----------------------------------------------------------------------------- |
; this cycle does not contain an obvious exit condition, |
; but auxiliary procedures (like "get_string") will exit |
; at EOF |
start_program: |
call skip_spaces |
cmp al,'#' |
cmp al,byte '#' |
jz skip_this_string |
call clear_strings |
mov edi, program |
47,30 → 47,29 |
mov edi, parameters |
call get_string |
call get_number |
;dps <"STARTING A PROGRAM",13,10> |
call run_program |
;-------------------------------------- |
skip_this_string: |
call next_line |
jmp start_program |
|
;----------------------------------------------------------------------------- |
exit: |
or eax, -1 |
mcall |
|
|
;----------------------------------------------------------------------------- |
run_program: ; time to delay in eax |
DEBUGF 1, "Launch: %s Parameter: %s\n",program,parameters |
push eax |
mcall 70, start_info |
pop ebx |
|
; if delay is negative, wait for termination |
; of the spawned process |
test ebx, ebx |
js must_wait_for_termination |
; otherwise, simply wait |
mov eax, 5 |
mcall |
mcall 5 |
ret |
;----------------------------------------------------------------------------- |
must_wait_for_termination: |
mov esi, eax ; save slot for the future |
; get process slot |
79,70 → 78,74 |
; if an error has occured, exit |
test eax, eax |
jz child_exited |
|
mov ecx, eax |
; wait |
;-------------------------------------- |
wait_for_termination: |
mcall 5, 1 |
mov ebx, processinfo |
mcall 9 |
cmp word [ebx+50], 9 ; the slot was freed? |
cmp [ebx+50],word 9 ; the slot was freed? |
jz child_exited |
cmp dword [ebx+30], esi ; the slot is still occupied by our child? |
|
cmp [ebx+30],dword esi ; the slot is still occupied by our child? |
jz wait_for_termination |
;-------------------------------------- |
child_exited: |
ret |
|
;----------------------------------------------------------------------------- |
clear_strings: ; clears buffers |
pushad |
|
mov ecx, 60 |
mov ecx,60+1 |
mov edi, program |
xor al, al ;mov al, ' ' |
xor al,al |
rep stosb |
|
mov ecx, 60 |
mov ecx,60+1 |
mov edi, parameters |
rep stosb |
|
popad |
ret |
|
|
;----------------------------------------------------------------------------- |
get_string: ; pointer to destination buffer in edi |
pushad |
call skip_spaces |
mov esi, [position] |
;dpd esi |
;dps <13,10> |
add esi, file_data |
cmp byte [esi], '"' |
cmp [esi],byte '"' |
jz .quoted |
;-------------------------------------- |
.start: |
cmp esi, [fileend] |
jae exit |
|
lodsb |
cmp al, ' ' |
cmp al,byte ' ' |
jbe .finish |
|
stosb |
inc [position] |
inc dword [position] |
jmp .start |
;-------------------------------------- |
.finish: |
popad |
ret |
;-------------------------------------- |
.quoted: |
inc esi |
inc [position] |
inc dword [position] |
;-------------------------------------- |
.quoted.start: |
cmp esi, [fileend] |
jae exit |
|
lodsb |
inc [position] |
cmp al, '"' |
inc dword [position] |
cmp al,byte '"' |
je .finish |
|
stosb |
jmp .quoted.start |
|
|
;----------------------------------------------------------------------------- |
get_number: |
push ebx esi |
call skip_spaces |
149,97 → 152,109 |
mov esi, [position] |
add esi, file_data |
xor eax, eax |
cmp byte [esi], '-' |
cmp [esi],byte '-' |
jnz @f |
|
inc eax |
inc esi |
inc [position] |
inc dword [position] |
;-------------------------------------- |
@@: |
push eax |
xor eax, eax |
xor ebx, ebx |
;-------------------------------------- |
.start: |
cmp esi, [fileend] |
jae .finish |
|
lodsb |
sub al, '0' |
sub al,byte '0' |
cmp al, 9 |
ja .finish |
|
lea ebx,[ebx*4+ebx] |
lea ebx,[ebx*2+eax] |
inc [position] |
inc dword [position] |
jmp .start |
;-------------------------------------- |
.finish: |
pop eax |
dec eax |
jnz @f |
|
neg ebx |
;-------------------------------------- |
@@: |
mov eax, ebx |
pop esi ebx |
ret |
|
|
;----------------------------------------------------------------------------- |
skip_spaces: |
push esi |
xor eax, eax |
mov esi, [position] |
add esi, file_data |
;-------------------------------------- |
.start: |
cmp esi, [fileend] |
jae .finish |
|
lodsb |
cmp al, ' ' |
cmp al,byte ' ' |
ja .finish |
inc [position] |
|
inc dword [position] |
jmp .start |
;-------------------------------------- |
.finish: |
;dps "NOW AL = " |
;mov [tmp],al |
;mov edx, tmp |
;call debug_outstr |
;dps <13,10> |
pop esi |
ret |
|
|
;----------------------------------------------------------------------------- |
next_line: |
mov esi, [position] |
add esi, file_data |
;-------------------------------------- |
.start: |
cmp esi, [fileend] |
jae exit |
|
lodsb |
cmp al, 13 |
je .finish |
|
cmp al, 10 |
je .finish |
inc [position] |
|
inc dword [position] |
jmp .start |
;-------------------------------------- |
.finish: |
inc [position] |
inc dword [position] |
cmp esi, [fileend] |
jae exit |
|
lodsb |
cmp al, 13 |
je .finish |
|
cmp al, 10 |
je .finish |
|
ret |
|
|
|
;----------------------------------------------------------------------------- |
; DATA: |
position dd 0 ; position in file |
|
;----------------------------------------------------------------------------- |
include_debug_strings |
;----------------------------------------------------------------------------- |
autorun_dat_info: ; AUTORUN.DAT |
.mode dd 0 ; read file |
.start_block dd 0 ; block to read |
dd 0 |
.blocks dd 16*512 ; 16*512 bytes max |
.blocks dd 4*512 ; 2 Kb max for AUTORUN.DAT |
.address dd file_data |
db "/SYS/SETTINGS/AUTORUN.DAT",0 |
|
;----------------------------------------------------------------------------- |
start_info: |
.mode dd 7 |
dd 0 |
246,14 → 261,34 |
.params dd parameters |
dd 0 |
dd 0 |
.path: ; |
|
.path: |
;----------------------------------------------------------------------------- |
IM_END: |
;----------------------------------------------------------------------------- |
align 4 |
processinfo: |
;----------------------------------------------------------------------------- |
program: |
rb 61 ; 60 + [0] char |
;----------------------------------------------------------------------------- |
parameters: |
rb 61 |
;----------------------------------------------------------------------------- |
rb 1024-61*2 |
;----------------------------------------------------------------------------- |
position: |
rd 1 ; position in file |
;----------------------------------------------------------------------------- |
fileend: |
rd 1 |
;----------------------------------------------------------------------------- |
align 4 |
file_data: |
rb 4*512 ; 2 Kb for AUTORUN.DAT |
;----------------------------------------------------------------------------- |
align 4 |
rb 256 |
stack_top: |
;----------------------------------------------------------------------------- |
I_END: |
|
program rb 61 ; 60 + [0] char |
parameters rb 61 |
|
processinfo rb 1024 |
fileend dd ? |
|
file_data rb 16*512 |
;----------------------------------------------------------------------------- |