Subversion Repositories Kolibri OS

Compare Revisions

Ignore whitespace Rev 1150 → Rev 1151

/kernel/trunk/sec_loader/trunk/boot/build.bat
13,4 → 13,8
echo ** building firs loader for fat32 **
@fasm -m 65535 fat32/bootsect.asm fat32/bootsect.bin
@fasm -m 65535 fat32/kordldr.f1x.asm fat32/kordldr.f1x
echo ==============================
echo ** make a image of fdd **
@fasm -m 65535 floppy.asc kord.img
 
@pause
/kernel/trunk/sec_loader/trunk/boot/floppy.asc
0,0 → 1,49
include "mkfloppy.inc"
;// insert boot sect
file "fat1x/bootsect.bin", 512
 
; fat1
db 0F0h, 0FFh, 0FFh, 9*512-3 dup 0
; fat2
db 0F0h, 0FFh, 0FFh, 9*512-3 dup 0
 
; root
dent kordldr, "KORDLDR F1X", FA_ARC
dent kord, "KORD ",FA_DIR
dent kolibri, "KOLIBRI ",FA_DIR
; ...
 
rb 33*512-$
;///////////////////////////
defdir kord
{
dent loader, "LOADER ", FA_ARC
dent ini,"STARTOS INI", FA_ARC
}
 
defdir kolibri
{
dent kolibri_ldm, "KOLIBRI LDM", FA_ARC
}
 
 
; data
stof kordldr, "fat1x/kordldr.f1x"
stod kord,root
 
stof loader, "../loader"
stof ini,"../startos.ini"
 
store dword ini_base/512+1 at ini_base+1F8h
store word (ini_size+511)/512-1 at ini_base+1FCh
store word 220h at ini_base+1FEh
 
stod kolibri,root
stof kolibri_ldm, "../kolibri_ldm/bin/kolibri.ldm"
store dword kolibri_ldm_base/512+1 at kolibri_ldm_base+1F8h
store word (kolibri_ldm_size+511)/512-1 at kolibri_ldm_base+1FCh
store word 220h at kolibri_ldm_base+1FEh
 
 
; ...
rb 2*80*18*512-$
/kernel/trunk/sec_loader/trunk/boot/mkfloppy.inc
0,0 → 1,90
; ---------------------------------------------------------------------------
; mkfloppy.inc
; ---------------------------------------------------------------------------
; Created by Phantom-84
; ---------------------------------------------------------------------------
 
FA_RO equ 01h
FA_HID equ 02h
FA_SYS equ 04h
FA_VOL equ 08h
FA_DIR equ 10h
FA_ARC equ 20h
 
DSTAMP equ 28C1h
TSTAMP equ 6000h
 
root_size=0
 
macro reset id
{
local count, cur, disp, val, var
times 511-($+511) mod 512 db 0
if id#_size>0
count=(id#_size+511)/512
cur=id#_base/512-(33-2)
repeat count
if %=count
val=0FFFh
else
val=cur+1
end if
if cur and 1
val=val shl 4
end if
disp=(cur*3)/2
load var word from 512+disp
var=var or val
store word var at 512+disp
store word var at 10*512+disp
cur=cur+1
end repeat
end if
}
 
macro dent id, name, attr
{
@@ db name
times @b+11-$ db 32
db attr
dw 0, TSTAMP, DSTAMP, DSTAMP, 0, TSTAMP, DSTAMP
if id#_size=0
dw 0
else
dw id#_base/512-(33-2)
end if
if (attr) and FA_DIR
dd 0
else
dd id#_size
end if
}
 
macro orgdir id, parentid
{
id#_base:
dent id, ".", FA_DIR
dent parentid, "..", FA_DIR
}
 
macro findir id
{
id#_size=$-id#_base
reset id
}
 
macro stod id, parentid
{
orgdir id, parentid
id
findir id
}
 
macro stof id, name
{
id#_base: file name
id#_size=$-id#_base
reset id
}
 
defdir fix macro
/kernel/trunk/sec_loader/trunk/boot_st.inc
31,7 → 31,7
;======================================================================
 
 
version db 'Secondary Loader v 0.009',0
version db 'Secondary Loader v 0.010',0
version_end:
 
select_section db 'Select section:'
38,7 → 38,7
select_section_end:
section_description db 'Section description:'
section_description_end:
soft_mes db 'Soft (c) 2008'
soft_mes db 'Soft (c) 2008-2009'
soft_mes_end:
 
badprocessor db '>Fatal - CPU 586+ required.',0
58,7 → 58,7
parse_ini_end db '>End parsing ini file',0
point_to_default_sec_not_found db '>Point to default section is not found in ini file',0
incorect_section_define db ">Incorect section define not found ']'",0
default_section_name db '"Section unname"'
default_section_name db '"Section unname"'
 
start_msg db "Press any key to change default section, press [Enter] to continue booting"
start_msg_e:
/kernel/trunk/sec_loader/trunk/debug_msg.inc
26,11 → 26,12
 
;Òóò îïðåäåëåíû âñå ñîîáùåíèÿ, êîòîðûå íóæíû â ïðîöåññå îòëàäêè, è ñîâñåì íå íóæíû â ðàáî÷åé êîïèè ïðîãðàììû.
If DEBUG
stack_msg db 'Set stack & segments is have completed',0
show_string db 'Have loaded size:'
show_decode db ' ',0
show_db1 db ' -Message debug1',0
show_db2 db ' -Message debug2',0
cseg_msg db ' - Adress of code segment',0
stack_msg db 'Set stack & segments is have completed',0
show_string db 'Have loaded size:'
show_decode db ' ',0
show_db1 db ' -Message debug1',0
show_db2 db ' -Message debug2',0
 
 
lm_l_found db '[loader] is found',0
45,23 → 46,24
_found_1 db '[] found',0
_found_2 db '[ found',0
say_hello db 'Hello $)',0
ramdiskFS_st db 'Start use_RamdiskFS macros',0
ramdiskFS_st db 'Start use_RamdiskFS macros',0
free_memory_msg db ' -Kb availability system free memory',0
RamdiskSize_msg db ' -Kb equal RamdiskSize',0
RamdiskSector_msg db ' -byts RamdiskSector',0
RamdiskCluster_msg db ' -RamdiskCluster',0
RamdiskFile_msg db ' -size RamdiskFile',0
fat_create_msg db ' -first create fat table, point to next block',0
BPB_msg db ' -in byte, why we get data from move BPB struct',0
RamdiskFile_msg db ' -size RamdiskFile',0
fat_create_msg db ' -first create fat table, point to next block',0
BPB_msg db ' -in byte, why we get data from move BPB struct',0
firstDataSect_msg db ' -first data sector, offset to data in sectors',0
size_root_dir_msg db ' -size root dir in sectrors',0
DataClasters_msg db ' -size data in Clasters',0
check_name_fat_msg db ' -if -1 name is present, else 0 then not present name',0
convertion_file_name_msg db ' -if -1, then destination name is bad',0
convertion_file_name_msg db ' -if -1, then destination name of file is bad',0
start_making_FAT12_msg db '>>>>>> Begin making fat12 FS on RAMDISK <<<<<<<',0
make_fat12_RFS_msg db '-Make FAT12 Ram FS',0
get_type_FS_msg db '-End make RamDisk',0
return_code_af_move db ' -return code after 0x87 int 0x15, move block',0
return_code_af_fat_m db ' -return code after 0x87 int 0x15, move fat struc',0
return_code_af_move db ' -return code after 0x87 int 0x15, move block',0
return_code_af_fat_m db ' -return code after 0x87 int 0x15, move fat struc',0
 
 
 
/kernel/trunk/sec_loader/trunk/listing.inc
0,0 → 1,635
; Listing generator
; LocoDelAssembly 2007.06.01
 
INSTRUCTIONS equ bt in ja jb jc je jg jl jo jp js jz or \
aaa aad aam aas adc add and bsf bsr btc btr bts cbw cdq clc \
cld cli cmc cmp cqo cwd daa das dec div fld fst hlt inc ins \
int jae jbe jge jle jmp jna jnb jnc jne jng jnl jno jnp jns \
jnz jpe jpo lar lds lea les lfs lgs lsl lss ltr mov mul neg \
nop not out pop por rcl rcr ret rol ror rsm sal sar sbb shl \
shr stc std sti str sub ud2 xor \
arpl call cdqe clgi clts cmps cwde emms fabs fadd fbld fchs \
fcom fcos fdiv feni fild fist fld1 fldz fmul fnop fsin fstp \
fsub ftst fxam fxch idiv imul insb insd insw int1 int3 into \
invd iret jcxz jnae jnbe jnge jnle lahf lgdt lidt lldt lmsw \
lods loop movd movq movs orpd orps outs pand popa popd popf \
popq popw push pxor retd retf retn retq retw sahf salc scas \
seta setb setc sete setg setl seto setp sets setz sgdt shld \
shrd sidt sldt smsw stgi stos test verr verw wait xadd xchg \
xlat \
addpd addps addsd addss andpd andps bound bswap cmova cmovb \
cmovc cmove cmovg cmovl cmovo cmovp cmovs cmovz cmppd cmpps \
cmpsb cmpsd cmpsq cmpss cmpsw cpuid divpd divps divsd divss \
enter f2xm1 faddp fbstp fclex fcomi fcomp fdisi fdivp fdivr \
femms ffree fiadd ficom fidiv fimul finit fistp fisub fldcw \
fldpi fmulp fneni fprem fptan fsave fsqrt fstcw fstsw fsubp \
fsubr fucom fwait fyl2x icebp iretd iretq iretw jecxz jrcxz \
lddqu leave lodsb lodsd lodsq lodsw loopd loope loopq loopw \
loopz maxpd maxps maxsd maxss minpd minps minsd minss movsb \
movsd movsq movss movsw movsx movzx mulpd mulps mulsd mulss \
mwait outsb outsd outsw pabsb pabsd pabsw paddb paddd paddq \
paddw pandn pause pavgb pavgw pf2id pf2iw pfacc pfadd pfmax \
pfmin pfmul pfrcp pfsub pi2fd pi2fw popad popaw popfd popfq \
popfw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb \
psubd psubq psubw pusha pushd pushf pushq pushw rcpps rcpss \
rdmsr rdpmc rdtsc retfd retfq retfw retnd retnq retnw scasb \
scasd scasq scasw setae setbe setge setle setna setnb setnc \
setne setng setnl setno setnp setns setnz setpe setpo stosb \
stosd stosq stosw subpd subps subsd subss vmrun vmxon wrmsr \
xlatb xorpd xorps \
andnpd andnps cmovae cmovbe cmovge cmovle cmovna cmovnb cmovnc\
cmovne cmovng cmovnl cmovno cmovnp cmovns cmovnz cmovpe cmovpo\
comisd comiss fcmovb fcmove fcmovu fcomip fcompp fdivrp ffreep\
ficomp fidivr fisttp fisubr fldenv fldl2e fldl2t fldlg2 fldln2\
fnclex fndisi fninit fnsave fnstcw fnstsw fpatan fprem1 frstor\
frstpm fscale fsetpm fstenv fsubrp fucomi fucomp fxsave haddpd\
haddps hsubpd hsubps invlpg lfence looped loopeq loopew loopne\
loopnz loopzd loopzq loopzw mfence movapd movaps movdqa movdqu\
movhpd movhps movlpd movlps movnti movntq movsxd movupd movups\
paddsb paddsw pextrw pfnacc pfsubr phaddd phaddw phsubd phsubw\
pinsrw pmaxsw pmaxub pminsw pminub pmulhw pmullw psadbw pshufb\
pshufd pshufw psignb psignd psignw pslldq psrldq psubsb psubsw\
pswapd pushad pushaw pushfd pushfq pushfw rdmsrq rdtscp setalc\
setnae setnbe setnge setnle sfence shufpd shufps skinit sqrtpd\
sqrtps sqrtsd sqrtss swapgs sysret vmcall vmload vmread vmsave\
vmxoff wbinvd wrmsrq \
clflush cmovnae cmovnbe cmovnge cmovnle cmpeqpd cmpeqps \
cmpeqsd cmpeqss cmplepd cmpleps cmplesd cmpless cmpltpd \
cmpltps cmpltsd cmpltss cmpxchg fcmovbe fcmovnb fcmovne \
fcmovnu fdecstp fincstp fnstenv frndint fsincos fucomip \
fucompp fxrstor fxtract fyl2xp1 invlpga ldmxcsr loopned \
loopneq loopnew loopnzd loopnzq loopnzw monitor movddup \
movdq2q movhlps movlhps movntdq movntpd movntps movq2dq \
paddusb paddusw palignr pavgusb pcmpeqb pcmpeqd pcmpeqw \
pcmpgtb pcmpgtd pcmpgtw pfcmpeq pfcmpge pfcmpgt pfpnacc \
pfrsqrt phaddsw phsubsw pmaddwd pmulhrw pmulhuw pmuludq \
pshufhw pshuflw psubusb psubusw rsqrtps rsqrtss stmxcsr \
syscall sysexit sysretq ucomisd ucomiss vmclear vmmcall \
vmptrld vmptrst vmwrite \
addsubpd addsubps cmpneqpd cmpneqps cmpneqsd cmpneqss cmpnlepd\
cmpnleps cmpnlesd cmpnless cmpnltpd cmpnltps cmpnltsd cmpnltss\
cmpordpd cmpordps cmpordsd cmpordss cvtdq2pd cvtdq2ps cvtpd2dq\
cvtpd2pi cvtpd2ps cvtpi2pd cvtpi2ps cvtps2dq cvtps2pd cvtps2pi\
cvtsd2si cvtsd2ss cvtsi2sd cvtsi2ss cvtss2sd cvtss2si fcmovnbe\
maskmovq movmskpd movmskps movshdup movsldup packssdw packsswb\
packuswb pfrcpit1 pfrcpit2 pfrsqit1 pmovmskb pmulhrsw prefetch\
sysenter sysexitq unpckhpd unpckhps unpcklpd unpcklps vmlaunch\
vmresume \
cmpxchg8b cvttpd2dq cvttpd2pi cvttps2dq cvttps2pi cvttsd2si \
cvttss2si pmaddubsw prefetchw punpckhbw punpckhdq punpckhwd \
punpcklbw punpckldq punpcklwd \
cmpunordpd cmpunordps cmpunordsd cmpunordss cmpxchg16b \
loadall286 loadall386 maskmovdqu prefetcht0 prefetcht1 \
prefetcht2 punpckhqdq punpcklqdq prefetchnta
 
PREFIXES equ rep lock repe repz repne repnz
 
DATA_DEFINITORS equ db dw du dd dp df dq dt file
DATA_RESERVERS equ rb rw rd rp rf rq rt
 
CRLF equ 13, 10 ; Remove 13 for Linux
MAX_BYTES equ 13
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MODE MACROSES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
macro use16
{
use16
_USE = 16
}
 
macro use32
{
use32
_USE = 32
}
 
macro use64
{
use64
_USE = 64
}
 
macro detect_mode
{
local aux
 
_USE = 32
 
virtual at 0
xchg eax, eax
load aux byte from 0
 
if aux = $66
_USE = 16
else if aux = $87
_USE = 64
end if
end virtual
}
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;; DISPLAYING MACROSES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
macro display_address address*
{
local aux, digit
 
aux = address
 
repeat _USE / 4
digit = aux shr (_USE - 4 * %) and $F
 
display digit + '0' + ('9' - 'B') and (9 - digit) shr 4 and $F
end repeat
 
display ': '
}
 
macro display_bytes pointer
{
local aux, size, digit
 
size = $ - pointer
 
if size > MAX_BYTES
size = MAX_BYTES
end if
 
repeat size
load aux byte from pointer+%-1
 
digit = aux shr 4
display digit + '0' + ('9' - 'B') and (9 - digit) shr 4 and $F
 
digit = aux and $F
display digit + '0' + ('9' - 'B') and (9 - digit) shr 4 and $F
 
 
display ' '
end repeat
 
repeat MAX_BYTES - size
display ' '
end repeat
}
 
; The macro below in some situations doesn't adds a space to separate things unfortunatelly, so for readability ensurance
; another one will be used instead...
;macro display_args [args]
;{
;common
; aux = 1
;
;forward
; if ~args eq
; if aux
; display ' '
; else
; display ', '
; end if
;
; aux = 0
;
; match =ON, _RESOLVE_EQUATES
; \{
; match args, args
; \\{
; irps arg, args
; \\\{
; display \\\`arg
; \\\}
; \\}
; \}
; match =OFF, _RESOLVE_EQUATES
; \{
; irps arg, args
; \\{
; display \\`arg
; \\}
;
; \}
; end if
;}
 
; This one separates everything with one space. A very ugly listing but at least you will not see things
; like "push ebxesiedi" nor "ret word0"
 
macro display_args [args]
{
common
aux = 1
 
forward
if ~args eq
if ~aux
display ','
end if
 
aux = 0
 
match =ON, _RESOLVE_EQUATES
\{
match args, args
\\{
if ~args eqtype ""
irps arg, args
\\\{
display ' ', \\\`arg
\\\}
else
display " '", args, "'"
end if
\\}
\}
match =OFF, _RESOLVE_EQUATES
\{
if ~args eqtype ""
irps arg, args
\\{
display ' ', \\`arg
\\}
else
display " '", args, "'"
end if
\}
end if
}
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;; INSTRUCTIONS & PREFIXES MACROSES ;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
macro prefix mnemonic
{
local aux
 
macro mnemonic [args]
\{
\common
match =1, _ON_VIRTUAL\\{_LISTING equ 0\\}
match =equ, args\\{_LISTING equ 0\\}
match =equ any, args\\{_LISTING equ 0\\}
 
match =1, _LISTING
\\{
display_address $
aux = $
\\}
 
mnemonic
 
match =1, _LISTING
\\{
display_bytes aux
 
display \`mnemonic
display CRLF
\\}
 
match =1, _ON_VIRTUAL\\{restore _LISTING\\}
match =equ, args\\{restore _LISTING\\}
match =equ any, args\\{restore _LISTING\\}
 
def_prefix mnemonic
args
purge mnemonic
\}
}
 
macro def_prefix mnemonic
{
macro def_prefix mnemonic
\{
prefix mnemonic
\}
def_prefix mnemonic
}
 
macro instruction mnemonic
{
local aux
 
macro mnemonic [args]
\{
\common
match =1, _ON_VIRTUAL\\{_LISTING equ 0\\}
match =equ, args\\{_LISTING equ 0\\}
match =equ any, args\\{_LISTING equ 0\\}
 
match =1, _LISTING
\\{
display_address $
aux = $
\\}
 
mnemonic args
 
match =1, _LISTING
\\{
display_bytes aux
 
display \`mnemonic
 
virtual at 0
db \`mnemonic
repeat 11 - $
display ' '
end repeat
end virtual
 
display_args args
display CRLF
\\}
 
match =1, _ON_VIRTUAL\\{restore _LISTING\\}
match =equ, args\\{restore _LISTING\\}
match =equ any, args\\{restore _LISTING\\}
\}
}
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DATA MACROSES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
macro data_define mnemonic
{
local aux
macro mnemonic [args]
\{
\common
match =1, _ON_VIRTUAL\\{_LISTING equ 0\\}
match =equ, args\\{_LISTING equ 0\\}
match =equ any, args\\{_LISTING equ 0\\}
 
match =1, _LISTING
\\{
display_address $
aux = $
\\}
 
mnemonic args
 
match =1, _LISTING
\\{
display_bytes aux
 
display \`mnemonic
 
display_args args
display CRLF
 
aux = aux + MAX_BYTES
 
repeat ($ - aux + MAX_BYTES - 1) / MAX_BYTES
display_address aux
display_bytes aux
display CRLF
 
aux = aux + MAX_BYTES
end repeat
\\}
 
match =1, _ON_VIRTUAL\\{restore _LISTING\\}
match =equ, args\\{restore _LISTING\\}
match =equ any, args\\{restore _LISTING\\}
\}
 
struc mnemonic [args]
\{
\common
match =1, _ON_VIRTUAL\\{_LISTING equ 0\\}
match =equ, args\\{_LISTING equ 0\\}
match =equ any, args\\{_LISTING equ 0\\}
 
match =1, _LISTING
\\{
display_address $
aux = $
\\}
 
. mnemonic args
 
match =1, _LISTING
\\{
display_bytes aux
 
display \`., ' ', \`mnemonic
 
display_args args
display CRLF
 
aux = aux + MAX_BYTES
 
repeat ($ - aux + MAX_BYTES - 1) / MAX_BYTES
display_address aux
display_bytes aux
display CRLF
 
aux = aux + MAX_BYTES
end repeat
\\}
 
match =1, _ON_VIRTUAL\\{restore _LISTING\\}
match =equ, args\\{restore _LISTING\\}
match =equ any, args\\{restore _LISTING\\}
\}
}
 
macro data_reserve mnemonic
{
local aux
macro mnemonic [args]
\{
\common
match =1, _ON_VIRTUAL\\{_LISTING equ 0\\}
match =equ, args\\{_LISTING equ 0\\}
match =equ any, args\\{_LISTING equ 0\\}
 
match =1, _LISTING
\\{
display_address $
aux = $
\\}
 
mnemonic args
 
match =1, _LISTING
\\{
times MAX_BYTES display ' '
 
display \`mnemonic
 
display_args args
display CRLF
\\}
 
match =1, _ON_VIRTUAL\\{restore _LISTING\\}
match =equ, args\\{restore _LISTING\\}
match =equ any, args\\{restore _LISTING\\}
\}
 
struc mnemonic [args]
\{
\common
match =1, _ON_VIRTUAL\\{_LISTING equ 0\\}
match =equ, args\\{_LISTING equ 0\\}
match =equ any, args\\{_LISTING equ 0\\}
 
match =1, _LISTING
\\{
display_address $
aux = $
\\}
 
. mnemonic args
 
match =1, _LISTING
\\{
times MAX_BYTES display ' '
 
display \`., ' ', \`mnemonic
 
display_args args
display CRLF
\\}
 
match =1, _ON_VIRTUAL\\{restore _LISTING\\}
match =equ, args\\{restore _LISTING\\}
match =equ any, args\\{restore _LISTING\\}
\}
}
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;; LISTING CONTROL MACROSES ;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
macro virtual [args]
{
common
_ON_VIRTUAL equ 1
 
virtual args
}
 
macro end [args]
{
common
match =virtual, args\{restore _ON_VIRTUAL\}
 
end args
}
 
macro enable_listing
{
detect_mode
 
match =0, _MACROSES_INSTALLED
\{
match instructions, INSTRUCTIONS
\\{
irps ins, instructions
\\\{
instruction ins
\\\}
\\}
 
match prefixes, PREFIXES
\\{
irps prefix, prefixes
\\\{
def_prefix prefix
\\\}
\\}
 
match data_definitors, DATA_DEFINITORS
\\{
irps def, data_definitors
\\\{
data_define def
\\\}
\\}
 
match data_reservers, DATA_RESERVERS
\\{
irps def, data_reservers
\\\{
data_reserve def
\\\}
\\}
\}
 
_MACROSES_INSTALLED equ 1
_LISTING equ 1
}
 
macro disable_listing
{
_LISTING equ 0
}
 
macro enable [feature*]
{
forward
UNKNOWN equ 1
 
match =resolve_equates, feature
\{
restore _RESOLVE_EQUATES
_RESOLVE_EQUATES equ ON
UNKNOWN equ 0
\}
 
match =listing, feature
\{
enable_listing
UNKNOWN equ 0
\}
 
match =1, UNKNOWN
\{
display 'ERROR: Unknown "',`feature, '" feature', 13, 10
err
\}
 
restore UNKNOWN
restore UNKNOWN
}
 
macro disable [feature*]
{
UNKNOWN equ 1
 
match =resolve_equates, feature
\{
restore _RESOLVE_EQUATES
_RESOLVE_EQUATES equ OFF
UNKNOWN equ 0
\}
 
match =listing, feature
\{
disable_listing
UNKNOWN equ 0
\}
 
match =1, UNKNOWN
\{
display 'ERROR: Unknown "',`feature, '" feature', 13, 10
err
\}
 
restore UNKNOWN
restore UNKNOWN
}
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INITIALIZATION ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
_MACROSES_INSTALLED equ 0
_ON_VIRTUAL equ 0
 
disable resolve_equates
/kernel/trunk/sec_loader/trunk/loader.asm
1,4 → 1,4
; Copyright (c) 2009, <Lrz>
; Copyright (c) 2008-2009, <Lrz>
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
12,7 → 12,7
; names of its contributors may be used to endorse or promote products
; derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka <Lrz> ''AS IS'' AND ANY
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname <Lrz> ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
25,96 → 25,22
;*****************************************************************************
 
;start of the project 13.02.2008 year.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Secondary Loader copyright Alexey Teplov aka <Lrz> & K Soft team
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Secondary Loader copyright Alexey Teplov nickname <Lrz>
;if you need log preproc
;/////////////
;include 'listing.inc'
;enable listing
;////////////
;;;;;;;;;;;;;;;;;;;;;;;;;;
;start of code:
;;;;;;;;;;;;;;;
DEBUG equ 1
root_dir_entry_count equ 224 ;êîë-âî ýëåìåíòîâ â êîðíåâîé äèððåêòîðèè
;point_to_fat_struc equ 0xA000 ;âðåìåííûé áóôåð, êóäà áóäåò ðàçìåùåíà Fat òàáëèöà, è çàòåì ïåðåíåñåíà çà 1 ìá
ini_data_ equ 0x2000 ;ôàéë ãäå ðàçìåùåí ôàéë ñöåíàðèÿ çàãðóçêè, òàì ïðîèñõîäèò ñèíòàêñè÷åñêèé ðàçáîð
size_show_section equ 18
default_timeout_value equ 5 ;default value to timeout is will was some errors
flag_found_default equ 0x1 ;default value is found
flag_found_timeout equ 0x2 ;timeout value is found
flag_found_LM equ 0x1 ;found LM value
flag_found_RS equ 0x2 ;found RS value
flag_found_GTRFMS equ 0x4 ;found type RamFS
flag_found_RamdiskSector equ 0x8 ;found RamdiskSector
flag_found_RamdiskCluster equ 0x16 ;found RamdiskCluster
;statick data ýòè äàííûå íå ïðåäîïðåäåëÿþòñÿ â òå÷åíèè âûïîëíåíèÿ âñåé ïðîãðàììû.
save_cx equ word [bp-2] ;save cx size ini file
ret_on_ch equ word [bp-4] ;point to return ðàçðóøàåìîå çíà÷åíèå
save_cx_d equ word [bp-6] ;save cx - size default section and working section
status_flag equ word [bp-8] ;status flag
point_loader equ word [bp-10]
point_default equ word [bp-12] ;point to default
 
;äàííûå êîòîðûå çàâèñèìû îò âåòêè âûïîëíåíèÿ è êîòîðûå ìîãóò áûòü ïåðåîïðåäåëåíû â ïðîöåññå âûïîëíåíèÿ ïðîãðàììû.
point_to_hframe equ word [bp-14] ;point on start frame (for change section)
point_to_1 equ word [bp-16]
point_to_2 equ word [bp-18]
point_to_3 equ word [bp-20]
point_to_4 equ word [bp-22]
point_to_5 equ word [bp-24]
point_to_6 equ word [bp-26]
point_to_7 equ word [bp-28]
point_to_8 equ word [bp-30]
point_to_9 equ word [bp-32]
point_to_10 equ word [bp-34]
point_to_11 equ word [bp-36]
point_to_12 equ word [bp-38]
point_to_13 equ word [bp-40]
point_to_14 equ word [bp-42]
point_to_15 equ word [bp-44]
point_to_16 equ word [bp-46]
point_to_16 equ word [bp-48]
point_to_17 equ word [bp-50]
point_to_18 equ word [bp-52]
;here array for fast scroling 16 word - poin to start section
point_to_point_def equ word [bp-54]
point_to_eframe equ word [bp-56] ;point on point frame
 
 
 
; òóò ðàñïîëîæåíî âðåìåííîå õðàíèëèùå äëÿ cx è di ïðè ïåðåõîäå íà ñëåäóþùèé áóôåð ïðè ïîèñêå ñåêöèé
find_sec_di equ word [bp-58] ;òóò áóäåò õðàíèòüñÿ di
info_real_mode_size equ word [bp-60];òóò õðàíèòüñÿ èíôîðìàöèÿ î çàíÿòîé îáëàñòè ò.å. ðàçìåð, ìîæíî óçíàòü ñêîëüêî îñòàëîñü ìåñòà âû÷èñëèâ
free_ad_memory equ word [bp-62] ;ñêîëüêî ó íàñ ðàñøèðåííîé ïàìÿòè äëÿ ôîðìèðîâàíèÿ ðàì äèñêà è çàãðóçêè ìîäóëåé
show_errors_sect equ word [bp-64] ;ïåðåìåíàÿ êîòîðàÿ õðàíèò áèòû îøèáîê äëÿ êàæäîé ëîãè÷åñêîé ñåêöèè.
save_descript_size equ word [bp-66] ;save descript size previos section ñîõðàíèì ðàçìåð ïðåäûäóùåé ñåêöèè êîòîðóþ âûâîäèëè
save_ramdisksize equ dword [bp-70] ;save size of ramdisk in byte
save_file_size equ dword [bp-74] ;save size of reading file
set_ramfs equ word [bp-76] ;îïðåäåëåííûé òèï ôàéëîâîé ñèñòåìû,íóæíî äëÿ ôîðìèðîâàíèÿ ðàì äèñêà
point_next_fat_str equ word [bp-78] ;óêàçàòåëü íà ñëåäóþùèé ýëåìåíò fat òàáëèöû
size_root_dir equ word [bp-80] ;êîë-âî ýëåìåíòîâ â ñåêòîðàõ ïî 512 áàéò êîðíåâîé äèðåêòîðèè
firstDataSect equ word [bp-82] ;ïåðâûé ñåêòîð äàííûõ â ñåòîðàõ îò 0
DataClasters equ word [bp-84] ;ðàçìåð ìàññèâà äîñòóïíîé äëÿ çàïèñè äàííûõ â êëàñòåðàõ.
point_to_free_root equ word [bp-86] ;óêàçàòåëü íà ñëåäóþùèé ïóñòóþ çàïèñü â ðóò äèð
point_to_dest_file_name equ word [bp-88] ;óêàçûâàåò íà íà÷àëî èìåíè ôàéëà íàçíà÷åíèÿ.
data_offset equ word [bp-90] ;ñìåùåíèå â êëàñòåðàõ äëÿ çàïèñàííûõ äàííûõ ò.å ïåðåêèíóòûõ çà 1-é ìá
first_input equ word [bp-92] ;ïîëå äëÿ ôëàãîâ â ïðåîáðàçîâàíèè èìåíè.
save_di_RAMDISK equ word [bp-94] ;ñîõðàíèì di -óêàçàòåëÿ ïðè îáðàáîòêå ñåêöèè
save_cx_RAMDISK equ word [bp-96] ;ñîõðàíèì ðàçìåð îñòàòêà ñåêöèè
status_flag_loader_f equ word [bp-98] ;ñîõðàíèì ðåçóëüòàò âûïîëåíåíèÿ çàãðóçêè ôàéëà
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;äàííûå êîòîðûå èñïîëüçóþòñÿ ïðè îáðàáîòêå ñåêöèè, ò.å. ïîñëå íàæàòèÿ Enter, óæå íå âîçìîæíî âåðíóòüñÿ â ïåðâîíà÷àëüíûé ýêðàí
;äëÿ âîçâðàòà, íåîáõîäèìî ïåðåçàïóñòèòü ïîëíîñòüþ êîä ò.å. ñòàðòîâàòü ñ 0õ1000:0000
 
 
 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;start of code: ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
use16
org 0x0
jmp start
include 'sl_equ.inc' ; â ôàéëå ðàçìåùåíû âñå equ ïðåäîïðåäåëåíèÿ
include 'boot_st.inc'
include 'debug_msg.inc' ;here is message from debug
include 'debug_msg.inc' ;here is message from debug
include 'parse_dat.inc'
include 'sl_proc.inc'
include 'parse.inc'
121,7 → 47,7
include 'parse_loader.inc'
include 'parse_any.inc'
include 'parse_def_sect.inc'
include 'parse_err.inc'
include 'parse_err.inc'
 
file_data dw 0x0,ini_data_ ;ôîðìàò: ñìåùåíèå: ñåãìåíò ò.ê. èñïîëüçóåòñÿ les
size_data dw 16 ;16 áëîêîâ ïî 4 êá ò.å ïðåäåë äî 64 êá
158,13 → 84,25
 
mov si,version
call printplain
mov al,'#'
mov cx,80
mov al,'#'
mov cx,80
;input cx=size al=char áóäåò âûâäåí ñèìâîë ñêîëüêî ðàç óêàçàíî â cx
@@:
call putchar
loop @b
call putchar
loop @b
 
if DEBUG
pushad
mov ax,cs
shl eax,4 ; â äåñÿòè÷íîé ñèñòåìå àäðåñ ñåãìåíòà
mov cx,0xa
mov di,cseg_msg
call decode
;***************
mov si,cseg_msg
call printplain
popad
end if
 
 
if DEBUG
216,40 → 154,37
; set up esp
movzx esp, sp
 
;Load startos.ini
xor ax,ax ; function 1 - read file
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; init memory
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
 
 
; Load startos.ini
mov cx,loop_read_startos_file ;êîë-âî ïîïûòîê ÷òåíèÿ ôàéëà êîíôèãóðàöèè startos.ini
align 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Load startos.ini ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
load_startos_file:
 
xor ax,ax
mov di,file_data
inc ax
inc ax ;function 1 - read file
push cx
call far dword [loader_callback]
pop cx
push cs
push cs
push cs
pop ds
pop es
 
test bx,bx
jnz error_ini
jz check_conf_file
dec cx
jnz load_startos_file
 
;Check config file in current dir
push ax ;save size file
if DEBUG
mov cx,0x0a
mov di,show_decode
call decode
;Show size
mov si,show_string
call printplain
end if
 
 
;Show message
mov si,load_ini
call printplain
 
pop cx ;restore size file
use_parse ;parsing startos.ini
;
jmp ini_loaded
 
;SET DEFAULT Not use ini file
error_ini:
mov si, error_ini_f1 ;Error: cannot load ini file, buffer is full
268,7 → 203,7
mov si, error_ini_common
call printplain
; wait for keypress
mov ah, 0
xor ax,ax
int 16h
 
ini_loaded:
275,21 → 210,41
 
jmp $
 
align 4
check_conf_file:
;Check config file in current dir
push ax ;save size file
if DEBUG
mov cx,0x0a
mov di,show_decode
call decode
;Show size
mov si,show_string
call printplain
end if
 
 
;Show message
mov si,load_ini
call printplain
 
pop cx ;restore size file
use_parse ;parsing startos.ini
;
jmp ini_loaded
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;DATA
;;;;;;;;;;;;;;;;;;;;;;;;;;;
; table for move to extended memory (int 15h, ah=87h)
align 8
align 4
table_15_87:
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
 
db 0xff,0xff
db 0x0,0x10
db 0x00,0x93,0x0,0x0
db 0x0,0x10
db 0x00,0x93,0x0,0x0
 
db 0xff,0xff,0x0,0x00,0x10,0x93,0x0,0x0
 
299,26 → 254,26
db 0x00,0x00,0x0,0x00,0x00,0x00,0x0,0x0
 
fat12_buffer:
.BS_jmpBoot db 0x90,0x90,0x90 ;3 áàéòà NOP èíñòðóêöèÿ - íè÷åãî íå äåëàòü
.BS_OEMName db 'K SyS 64' ;8 áàéò
.BPB_BytsPerSec dw 512 ;êîë-âî áàéòîâ â ñåêòîðå ìîæåò áûòü ëþáîå 512 1024 2048 4096 2 áàéòà
.BPB_SecPerClus db 0x1 ;êîë-âî ñåêòîðîâ â êëàñòåðå
.BPB_RsvdSecCnt dw 0x1 ;äëÿ FAt12/16 òîëüêî 1, äëÿ FAT32 îáû÷íî 32
.BPB_NumFATs db 0x1 ;êîë-âî ôàò òàáëèö, íà òîò ñëó÷àé åñëè áóäåò ñáðîñ íà äèñêåòó îáðàçà ðàì äèñêà
.BPB_RootEntCnt dw 512 ;äëÿ ìàê ñîâìåñòèìîñòè ñ fat16
.BPB_TotSec16 dw 0x0 ;êë-âî ñåêòîðîâ
.BPB_Media db 0xF0
.BPB_FATSz16 dw 0x0
.BPB_SecPerTrk dw 0x0 ;ñîäåðæèò ãåîìåòðèþ äèñêà äëÿ RAMFS íà êàê áû áåç ðàçíèöû, ïîêà ïóñòîå ïîëå, ïîçæå âíåñòè ðåàëüíûå çíà÷åíèÿ.
.BPB_NumHeads dw 0x0
.BPB_HiddSec dd 0x0 ;êîë-âî ñêðûòûõ ñåêòîðîâ
.BPB_TotSec32 dd 0x0
.BS_DrvNum db 'R' ;îò ñëîâà RAM
.BS_Reserved1 db 0x0
.BS_BootSig db 0x29
.BS_VolID db 'RFKS'
.BS_VolLab db 'RAM DISK FS' ;11 ñèìâîëîâ
.BS_FilSysType db 'FAT12 ' ;8 ñèìâîëîâ
.BS_jmpBoot db 0x90,0x90,0x90 ;3 áàéòà NOP èíñòðóêöèÿ - íè÷åãî íå äåëàòü
.BS_OEMName db 'K SyS 64' ;8 áàéò
.BPB_BytsPerSec dw 512 ;êîë-âî áàéòîâ â ñåêòîðå ìîæåò áûòü ëþáîå 512 1024 2048 4096 2 áàéòà
.BPB_SecPerClus db 0x1 ;êîë-âî ñåêòîðîâ â êëàñòåðå
.BPB_RsvdSecCnt dw 0x1 ;äëÿ FAt12/16 òîëüêî 1, äëÿ FAT32 îáû÷íî 32
.BPB_NumFATs db 0x1 ;êîë-âî ôàò òàáëèö, íà òîò ñëó÷àé åñëè áóäåò ñáðîñ íà äèñêåòó îáðàçà ðàì äèñêà
.BPB_RootEntCnt dw 512 ;äëÿ ìàê ñîâìåñòèìîñòè ñ fat16
.BPB_TotSec16 dw 0x0 ;êë-âî ñåêòîðîâ
.BPB_Media db 0xF0
.BPB_FATSz16 dw 0x0
.BPB_SecPerTrk dw 0x0 ;ñîäåðæèò ãåîìåòðèþ äèñêà äëÿ RAMFS íà êàê áû áåç ðàçíèöû, ïîêà ïóñòîå ïîëå, ïîçæå âíåñòè ðåàëüíûå çíà÷åíèÿ.
.BPB_NumHeads dw 0x0
.BPB_HiddSec dd 0x0 ;êîë-âî ñêðûòûõ ñåêòîðîâ
.BPB_TotSec32 dd 0x0
.BS_DrvNum db 'R' ;îò ñëîâà RAM
.BS_Reserved1 db 0x0
.BS_BootSig db 0x29
.BS_VolID db 'RFKS'
.BS_VolLab db 'RAM DISK FS' ;11 ñèìâîëîâ
.BS_FilSysType db 'FAT12 ' ;8 ñèìâîëîâ
;62 áàéòà ñòðóêòóðà fat12.
 
 
327,18 → 282,18
;ñòðóêòóðà äëÿ äèððåêòîðèè fat
struc FAT_32_entry ;Byte Directory Entry Structure
{
.DIR_Name rb 11
.DIR_Attr db ?
.DIR_NTRes db ?
.DIR_CrtTimeTenth db ?
.DIR_CrtTime dw ?
.DIR_CrtDate dw ?
.DIR_LstAccDate dw ?
.DIR_FstClusHI dw ?
.DIR_WrtTime dw ?
.DIR_WrtDate dw ?
.DIR_FstClusLO dw ?
.DIR_FileSize dd ?
.DIR_Name rb 11
.DIR_Attr db ?
.DIR_NTRes db ?
.DIR_CrtTimeTenth db ?
.DIR_CrtTime dw ?
.DIR_CrtDate dw ?
.DIR_LstAccDate dw ?
.DIR_FstClusHI dw ?
.DIR_WrtTime dw ?
.DIR_WrtDate dw ?
.DIR_FstClusLO dw ?
.DIR_FileSize dd ?
 
 
}
345,15 → 300,15
;Òóò áóäóò ðàñïîëîãàòñüÿ äàííûå, êîòîðûå çàòðóäíèòåëüíî ðàñïîëîãàòü â ñòåêîâîé îáëàñòè....
;;;
;timer
shot_name_fat rb 11
shot_name_fat rb 11 ;âðåìåííûé áóôåð äëÿ fat12, â íåì õðàíÿòüñÿ èìåíà ôàéëîâ ïðèâåäåííûå ê ïðàâèëàì FAT /* âäàëüíåéøåì ïåðåíåñòè â ñòýê
if DEBUG
rb 1 ;íóæåí äëÿ îòëàäêè è âûâîäà èìåíè ôàéëà ïîñëå ïðåîáðàçîâàíèÿ
dest_name_fat rb 12
rb 1 ;íóæåí äëÿ îòëàäêè è âûâîäà èìåíè ôàéëà ïîñëå ïðåîáðàçîâàíèÿ
dest_name_fat rb 12
end if
value_timeout rw 1 ;value to timeout
old_timer rd 1 ;ñòàðîå çíà÷åíèå âåêòîðà òàéìåðà
start_timer rd 1 ;çíà÷åíèå òàéìåðà
timer_ rd 1 ;íîâîå çíà÷åíèå âåêòîðà òàéìåðà ò.å. SL
start_stack rw 1 ;save stack
save_bp_from_timer rw 1 ;save bp from timer
value_timeout rw 1 ;value to timeout
old_timer rd 1 ;ñòàðîå çíà÷åíèå âåêòîðà òàéìåðà
start_timer rd 1 ;çíà÷åíèå òàéìåðà
timer_ rd 1 ;íîâîå çíà÷åíèå âåêòîðà òàéìåðà ò.å. SL
start_stack rw 1 ;save stack
save_bp_from_timer rw 1 ;save bp from timer
 
/kernel/trunk/sec_loader/trunk/parse.inc
12,7 → 12,7
; names of its contributors may be used to endorse or promote products
; derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka <Lrz> ''AS IS'' AND ANY
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname <Lrz> ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
36,47 → 36,47
parse_start:
;es:di as 2000:0000 new segment
;óñòàíîâèì óêàçàòåëü íà çàãðóæåííûé áëîê
enter 256,0 ;set 16 byte for current task in stack
enter 256,0 ;set 16 byte for current task in stack
;we are is not use bp because bp is pointer on array 16 byte
mov word [save_bp_from_timer],bp ;save point to own data array
mov save_cx,cx ;it's placed size of ini file
mov word [save_bp_from_timer],bp ;save point to own data array
mov save_cx,cx ;it's placed size of ini file
les di,dword [file_data]
;îáíóëèì âñå ïåðåìåííûå âûäåëåííûå èç ñòåêà
;init flag
xor ax,ax
mov status_flag,ax
xor ax,ax
mov status_flag,ax
;set data size
mov info_real_mode_size,ini_data_ +0x1000 ;èçìåíèì çíà÷åíèå çàíÿòîñòè ïàìÿòè
mov info_real_mode_size,ini_data_ +0x1000 ;èçìåíèì çíà÷åíèå çàíÿòîñòè ïàìÿòè
 
;ïîèñê íà÷àëà áëîêà.
;///////////check [loader]
cld
 
mov ret_on_ch,.start ;set return
mov al,byte [es:di]
push word .first_ret
cmp al,' '
jz .first_sp_1
jmp get_firs_sym.not_space
mov ret_on_ch,.start ;set return
mov al,byte [es:di]
push word .first_ret
cmp al,' '
jz .first_sp_1
jmp get_firs_sym.not_space
.first_sp_1:
jmp get_firs_sym.first_sp
jmp get_firs_sym.first_sp
 
.start:
call get_firs_sym ;get first symbol on new line
call get_firs_sym ;get first symbol on new line
.first_ret: ;ïåðâûé âîçâðàò
; jcxz .end_file ;.end_loader ;found or not found parametrs in section exit in section
test cx,cx
jz error.not_loader
cmp al,'['
jz .parse_loader
jmp .start
; jcxz .end_file ;.end_loader ;found or not found parametrs in section exit in section
test cx,cx
jz error.not_loader
cmp al,'['
jz .parse_loader
jmp .start
;////// ïðîâåðêà íà íàëè÷åå ñåêöèè loader
use_parse_loader
;pause
if DEBUG
xor ax,ax
xor ax,ax
int 16h
end if
end if
;////// âûâîä ãðàôè÷åñêîãî ýêðàíà, âûáîð, ñåêöèè ïîä äåôîëòó
use_any_sec
;ïàðñèíã âûáðàíîé èëè äåôîëòíîé ñåêöèè ò.å. ðàçáîð ïàðàìåòðîâ âûïîëíåíèå ñöåíàðèÿ
/kernel/trunk/sec_loader/trunk/parse_any.inc
25,18 → 25,18
;*****************************************************************************
 
;òóò ðàñïîëîãàåòñÿ ìîäóëü ñ ïîìîùüþ êîòîðîãî áóäóò ïàðñèòüñÿ âñå îñòàëüíûå ñåêöèè
color_sym_black equ 0
color_sym_blue equ 1
color_sym_green equ 2
color_sym_black equ 0
color_sym_blue equ 1
color_sym_green equ 2
color_sym_turquoise equ 3
color_sym_red equ 4
color_sym_red equ 4
 
color_sym_lightgray equ 7
 
color_sym_lightblue equ 9
color_sym_lightblue equ 9
color_sym_lettuce equ 10
color_sym_pink equ 12
color_sym_yellow equ 14
color_sym_pink equ 12
color_sym_yellow equ 14
 
macro use_any_sec
{
45,12 → 45,12
 
if DEBUG
pusha
mov ax,word [value_timeout] ;èäåò ïðîâåðêà íà íàëè÷åå çíà÷åíèÿ timeout, äëÿ áîëåå áûñòðîé ðàáîòû, ýòîò ïàðàìåòð äîëæåí áûòü óæå îáðàáîòàí,ò.å. â ýòîì ñëó÷àå ïðè åãî =0 áóäåò ñôîðìèðîâàí óêàçàòåëü òîëüêî íà äåôîëòíóþ ñåêöèþ, èíà÷å èíôîðìàöèÿ áóäåò ñîáðàíà ïî âñåì ñåêöèÿì è ñîñòàâëåíû óêàçàòåëè â áëîêå ïàìÿòè
mov ax,word [value_timeout] ;èäåò ïðîâåðêà íà íàëè÷åå çíà÷åíèÿ timeout, äëÿ áîëåå áûñòðîé ðàáîòû, ýòîò ïàðàìåòð äîëæåí áûòü óæå îáðàáîòàí,ò.å. â ýòîì ñëó÷àå ïðè åãî =0 áóäåò ñôîðìèðîâàí óêàçàòåëü òîëüêî íà äåôîëòíóþ ñåêöèþ, èíà÷å èíôîðìàöèÿ áóäåò ñîáðàíà ïî âñåì ñåêöèÿì è ñîñòàâëåíû óêàçàòåëè â áëîêå ïàìÿòè
; mov ax,cx
mov cx,0x0a
mov di,show_db1
mov dword[ds:di],' '
mov word [ds:di+4],' '
mov word [ds:di+4],' '
call decode
;Show size
mov si,show_db1
59,15 → 59,15
popa
end if
 
test ax,ax
jz .parse_run_only
test ax,ax
jz .parse_run_only
 
;îòîáðàçèì ïîëíûé ñïèñîê âñåõ íàéäåíûõ ñåêöèé.
if DEBUG
pusha
mov si,show_all_sect
call printplain
popa
pusha
mov si,show_all_sect
call printplain
popa
end if
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov al, 0xf6 ; Ñáðîñ êëàâèàòóðû, ðàçðåøèòü ñêàíèðîâàíèå
115,141 → 115,141
;ïðîöåäóðà ôîðìèðîâàíèÿ áóôåðà äëÿ ñêðîëèíãà ñåêöèé
;if DEBUG
; pusha
; mov ax,point_default
; mov ax,point_default
; mov ax,cx
; mov cx,0x0a
; mov di,show_db1
; mov dword[ds:di],' '
; mov word [ds:di+4],' '
; mov word [ds:di+4],' '
; call decode
;Show size
; mov si,show_db1
; call printplain
;
; xor ax,ax
; int 0x16
; xor ax,ax
; int 0x16
; popa
;end if
;;;;;;;;;;;;;ðàçìåð ïðåäûäóùåé ñåöèè óñòàíîâèì =0
mov save_descript_size,18
mov save_descript_size,18
;îòîáðàçèòü black screen
show_bl_sc ;es=0xb800
show_bl_sc ;es=0xb800
.show_all_scr:
get_frame_buffer ;es=0x2000
;îòîáðàæåíèå ñåêöèé
call show_bl_sc_sect ;es=0xb800
call show_bl_sc_sect ;es=0xb800
;îòîáðàçèòü àêòèâíûé êóðñîð
.show_active_cursor:
show_act_cursor
show_descript ;ìàêðîñ ïî îòîáðàæåíèþ îïèñàíèÿ ñåêöèè
show_descript ;ìàêðîñ ïî îòîáðàæåíèþ îïèñàíèÿ ñåêöèè
 
;îòîáðàçèòü Press any key ....
mov eax,dword [old_timer]
cmp eax,dword [timer_]
jz .interrupt_16
mov eax,dword [old_timer]
cmp eax,dword [timer_]
jz .interrupt_16
 
show_timer_message
mov word [start_stack],sp
mov word [start_stack],sp
.interrupt_16:
xor ax,ax ;ïîëó÷èì èíôîðìàöèþ î òîì ÷òî íàæàòî
int 0x16
xor ax,ax ;ïîëó÷èì èíôîðìàöèþ î òîì ÷òî íàæàòî
int 0x16
;check on change
mov ebx,dword [old_timer]
cmp ebx,dword [timer_]
jz @f
mov ebx,dword [old_timer]
cmp ebx,dword [timer_]
jz @f
;restore timer interrupt
cli
cli
push 0
pop es
; mov eax,dword [old_timer] ; âîññòàíîâèì ïðåæäíåå ïðåðûâàíèå
mov [es:8*4],ebx
mov dword [timer_],ebx
sti
push ax
sti
push ax
clear_timer_msg
pop ax
pop ax
@@:
call clean_active_cursor ;clean old cursor ;es=0xb800
call clean_active_cursor ;clean old cursor ;es=0xb800
 
cmp ah,0x48 ;ðåàêöèÿ ñèñòåìû íà ñîáûòèÿ
jz .up
cmp ah,0x50
jz .down
cmp ah,0x49
jz .pgup
cmp ah,0x51
jz .pgdown
cmp ah,0x47
jz .home
cmp ah,0x4f
jz .end
cmp ah,0x48 ;ðåàêöèÿ ñèñòåìû íà ñîáûòèÿ
jz .up
cmp ah,0x50
jz .down
cmp ah,0x49
jz .pgup
cmp ah,0x51
jz .pgdown
cmp ah,0x47
jz .home
cmp ah,0x4f
jz .end
 
cmp al,0xD
jnz .show_active_cursor
cmp al,0xD
jnz .show_active_cursor
 
jmp .end_show_all ;ïàðñèíã ñåêöèè êîòîðàÿ óêàçàíà â point_default
jmp .end_show_all ;ïàðñèíã ñåêöèè êîòîðàÿ óêàçàíà â point_default
.up:
mov si,point_to_point_def ;çíà÷åíèå óêàçàòåëÿ
add si,2
lea ax,point_to_hframe
mov si,point_to_point_def ;çíà÷åíèå óêàçàòåëÿ
add si,2
lea ax,point_to_hframe
 
cmp si,ax
ja @f
cmp si,ax
ja @f
 
mov point_to_point_def,si
mov ax,[si]
mov point_default,ax
jmp .show_active_cursor
mov point_to_point_def,si
mov ax,[si]
mov point_default,ax
jmp .show_active_cursor
@@:
call find_before_sect
jmp .show_all_scr
call find_before_sect
jmp .show_all_scr
 
 
 
.down:
mov si,point_to_point_def ;çíà÷åíèå óêàçàòåëÿ
mov ax,point_to_eframe ;óêàçàòåëü íà ïîñëåäíèé ýëåìåíò
sub si,2
cmp si,ax
jb @f
mov si,point_to_point_def ;çíà÷åíèå óêàçàòåëÿ
mov ax,point_to_eframe ;óêàçàòåëü íà ïîñëåäíèé ýëåìåíò
sub si,2
cmp si,ax
jb @f
 
mov point_to_point_def,si
mov ax,[si]
mov point_default,ax
jmp .show_active_cursor
mov point_to_point_def,si
mov ax,[si]
mov point_default,ax
jmp .show_active_cursor
 
@@: call find_next_sect
jmp .show_all_scr
@@: call find_next_sect
jmp .show_all_scr
 
.pgup:
mov cx,size_show_section
mov cx,size_show_section
@@:
push cx
call find_before_sect
pop cx
loop @b
jmp .show_all_scr
push cx
call find_before_sect
pop cx
loop @b
jmp .show_all_scr
 
 
.pgdown:
mov cx,size_show_section
mov cx,size_show_section
@@:
push cx
call find_next_sect
pop cx
loop @b
jmp .show_all_scr
push cx
call find_next_sect
pop cx
loop @b
jmp .show_all_scr
 
.home:
xor di,di
call find_next_sect.h
jmp .show_all_scr
xor di,di
call find_next_sect.h
jmp .show_all_scr
 
.end:
mov di,save_cx
call find_before_sect.e
jmp .show_all_scr
mov di,save_cx
call find_before_sect.e
jmp .show_all_scr
 
 
 
257,10 → 257,10
; òóò ìû áóäåì ïàðñèòü òîëüêî äåôîëòíóþ ñåêöèþ è âûïîëíÿòü åå íè÷åãî íå ïðåäëàãàÿ ïîëüçîâàòåëþ èç äèàëîãîâ.
.parse_run_only:
if DEBUG
pusha
mov si,no_show_only_w
call printplain
popa
pusha
mov si,no_show_only_w
call printplain
popa
end if
 
 
287,9 → 287,9
;;;;;;;;;;;;;;;
;î÷èñòèì ýêðàí è âûâåäåì ìåíþ
; draw frames
xor ax,ax
xor ax,ax
if DEBUG
mov ax,0x0720
mov ax,0x0720
end if
push 0xb800
pop es
296,54 → 296,54
xor di, di
; draw top
mov cx, 25 * 80
rep stosw
rep stosw
;;;;;;;;;;;;;;;;;;;;;;; show 'Secondary Loader v0.xxx'
mov di,164
mov si,version
mov cx,version_end-version
mov ah,color_sym_yellow
mov di,164
mov si,version
mov cx,version_end-version
mov ah,color_sym_yellow
@@:
lodsb
stosw
loop @b
lodsb
stosw
loop @b
;;;;;;;;;;;;;;;;;;;;;;; show firm ))
mov di,286
mov ah,color_sym_pink;color_sym_red
mov al,'K'
stosw
mov al,' '
stosw
mov ah,color_sym_lightgray;color_sym_lightblue;color_sym_pink
mov si,soft_mes
mov cx,soft_mes_end- soft_mes
mov di,(2*160-(2*(soft_mes_end-soft_mes+4))) ;286
mov ah,color_sym_pink;color_sym_red
mov al,'K'
stosw
mov al,' '
stosw
mov ah,color_sym_lightgray;color_sym_lightblue;color_sym_pink
mov si,soft_mes
mov cx,soft_mes_end- soft_mes
@@:
lodsb
stosw
loop @b
lodsb
stosw
loop @b
;;;;;;;;;;;;;;;;;;;;;;; show '__________________________'
mov di,480
mov ah,color_sym_yellow
mov al,'Ä'
mov cx,61
rep stosw
mov di,480
mov ah,color_sym_yellow
mov al,'Ä'
mov cx,61
rep stosw
;;;;;;;;;;;;;;;;;;;;;;; show 'Select section'
mov di,804
mov si,select_section
mov cx,select_section_end - select_section
mov ah,color_sym_lightgray
mov di,804
mov si,select_section
mov cx,select_section_end - select_section
mov ah,color_sym_lightgray
@@:
lodsb
stosw
loop @b
lodsb
stosw
loop @b
;;;;;;;;;;;;;;;;;;;;;;; show 'Section description'
mov di,880
mov si,section_description
mov cx,section_description_end - section_description
; mov ah,color_sym_lightgray
mov di,880
mov si,section_description
mov cx,section_description_end - section_description
; mov ah,color_sym_lightgray
@@:
lodsb
stosw
loop @b
lodsb
stosw
loop @b
 
}
 
352,54 → 352,54
;;;;;;;;;;;;;;;;;;;;; show Press any key
;;;;;;;;;;;;;;;;;;;;; show ramk
 
xor ax,ax
mov di,3360
mov cx,80*4
rep stosw
xor ax,ax
mov di,3360
mov cx,80*4
rep stosw
 
mov di,3362
mov ah,color_sym_pink
mov al,0xDA
stosw
mov al,0xc4
mov cx,76
rep stosw
mov al,0xBF
stosw
add di,4
mov al,0xb3
stosw
add di,152
stosw
add di,4
stosw
add di,152
stosw
add di,4
mov al,0xc0
stosw
mov al,0xc4
mov cx,76
rep stosw
mov al,0xd9
stosw
mov al,0xDA
stosw
mov al,0xc4
mov cx,76
rep stosw
mov al,0xBF
stosw
add di,4
mov al,0xb3
stosw
add di,152
stosw
add di,4
stosw
add di,152
stosw
add di,4
mov al,0xc0
stosw
mov al,0xc4
mov cx,76
rep stosw
mov al,0xd9
stosw
;;;;;;;;;;;;;;;;;;;;;;;;ramk is complete show
;show first message
mov si,start_msg
mov cx,start_msg_e-start_msg
mov di,3526
mov si,start_msg
mov cx,start_msg_e-start_msg
mov di,3526
@@:
lodsb
stosw
loop @b
lodsb
stosw
loop @b
;;;;;;;;;;;;;;;;;;;; show press Enter to....
add di,44
mov si,time_msg
mov cx,time_msg_e-time_msg
add di,44
mov si,time_msg
mov cx,time_msg_e-time_msg
@@:
lodsb
stosw
loop @b
lodsb
stosw
loop @b
}
 
 
411,98 → 411,98
 
macro get_frame_buffer
{
mov cx,save_cx ;it's placed size of ini file
mov cx,save_cx ;it's placed size of ini file
les di,dword [file_data]
 
mov si,di ;point frame
mov bx,cx
mov dx,size_show_section
; mov point_to_hframe,di ; âíåñåì çíà÷åíèå, òàê ïîäñòðàõîâêà íå áîëåå
mov si,di ;point frame
mov bx,cx
mov dx,size_show_section
; mov point_to_hframe,di ; âíåñåì çíà÷åíèå, òàê ïîäñòðàõîâêà íå áîëåå
 
mov al,byte [es:di]
push word .first_ret_bl_sc
cmp al,' '
jz .first_bl_sc
jmp get_firs_sym.not_space
mov al,byte [es:di]
push word .first_ret_bl_sc
cmp al,' '
jz .first_bl_sc
jmp get_firs_sym.not_space
.first_bl_sc:
jmp get_firs_sym.first_sp
jmp get_firs_sym.first_sp
 
.start_hbl:
call get_firs_sym ;get first symbol on new line
test cx,cx
jz error.correct_exit_bl ;critical error not found default point it's not possible because it's param chacking before
cmp al,'['
jnz .start_hbl
call get_firs_sym ;get first symbol on new line
test cx,cx
jz error.correct_exit_bl ;critical error not found default point it's not possible because it's param chacking before
cmp al,'['
jnz .start_hbl
 
mov si,di ;point frame
mov bx,cx
mov dx,size_show_section
jmp .analisist_al
mov si,di ;point frame
mov bx,cx
mov dx,size_show_section
jmp .analisist_al
 
 
.start_bl:
call get_firs_sym ;get first symbol on new line
call get_firs_sym ;get first symbol on new line
.first_ret_bl_sc: ;ïåðâûé âîçâðàò
test cx,cx
jz error.correct_exit_bl ;critical error not found default point it's not possible because it's param chacking before
test cx,cx
jz error.correct_exit_bl ;critical error not found default point it's not possible because it's param chacking before
.analisist_al:
cmp al,'['
jnz .start_bl
cmp al,'['
jnz .start_bl
;ïðîñìàòðèâàåì ini ôàéë ñ íà÷àëà â ïîèñêàõ ñåêöèè óêàçàíîé êàê default
;ïîèñê ôðåéìà â êîòîðîì ñîäåðæèòüñÿ çíà÷åíèå default
.found_sect_bl:
cmp di,point_loader
jz .start_bl
cmp di,point_default
jz .save_point_def
cmp di,point_loader
jz .start_bl
cmp di,point_default
jz .save_point_def
 
dec dx
jnz .start_bl
dec dx
jnz .start_bl
 
jmp .start_hbl
jmp .start_hbl
 
 
.save_point_def:
;èòàê äàëåå ìû äîëæíû çàïîëíèòü frame áóôåð àäðåñîâ ñåêöèé, ÷òî áû ïîòîì ïî íåìó áûñòðî ïåðåìåùàòüñÿ íå âû÷èñëÿÿ ñíîâà àäðåñà
mov di,si ;óêàçàòåëü íà íà÷àëî
mov cx,bx
lea si,point_to_hframe
mov dx,size_show_section+1 ;ò.ê. ó íàñ ñòðóêòóðà ñîäåðæèò ðàçìåð ìåæäó ïåðâûì è âòîðûì óêàçàòåëåì, òî íàì íóæíî íà 1 àäðåñ áîëüøå îáñ÷èòàòü ñåêöèé.
mov di,si ;óêàçàòåëü íà íà÷àëî
mov cx,bx
lea si,point_to_hframe
mov dx,size_show_section+1 ;ò.ê. ó íàñ ñòðóêòóðà ñîäåðæèò ðàçìåð ìåæäó ïåðâûì è âòîðûì óêàçàòåëåì, òî íàì íóæíî íà 1 àäðåñ áîëüøå îáñ÷èòàòü ñåêöèé.
;ïåðåõîäèì íà îáðàáîòêó çíà÷åíèÿ óêàçàòåëÿ
mov al,byte [es:di]
push word .first_ret_mfb
cmp al,' '
jz .first_bl_mbf
jmp get_firs_sym.not_space
mov al,byte [es:di]
push word .first_ret_mfb
cmp al,' '
jz .first_bl_mbf
jmp get_firs_sym.not_space
.first_bl_mbf:
jmp get_firs_sym.first_sp
jmp get_firs_sym.first_sp
 
.start_mfb:
call get_firs_sym ;get first symbol on new line
call get_firs_sym ;get first symbol on new line
.first_ret_mfb: ;ïåðâûé âîçâðàò
jcxz .val_buff_comp ;.end_loader ;found or not found parametrs in section exit in section
cmp al,'['
jnz .start_mfb
jcxz .val_buff_comp ;.end_loader ;found or not found parametrs in section exit in section
cmp al,'['
jnz .start_mfb
 
.found_sect_mfb:
cmp di,point_loader ;if we have section loader
jz .start_mfb
cmp di,point_loader ;if we have section loader
jz .start_mfb
 
mov [si],di
mov [si],di
 
sub si,2
dec dx
jnz .start_mfb
sub si,2
dec dx
jnz .start_mfb
;bufer is full
jmp @f
jmp @f
.val_buff_comp:
push save_cx
pop word [si]
sub si,2
push save_cx
pop word [si]
sub si,2
@@:
 
add si,4
mov point_to_eframe,si
add si,4
mov point_to_eframe,si
 
}
 
509,46 → 509,46
macro show_act_cursor
{
;îòîáðàæåíèå êóðñîðà ïî óìîë÷àíèþ
lea si,point_to_hframe
mov di,962-160
mov ax,point_default
mov cx,size_show_section
lea si,point_to_hframe
mov di,962-160
mov ax,point_default
mov cx,size_show_section
.home_show_cur:
mov bx,[si]
add di,160
cmp bx,ax
jz .show_cursor_activ
sub si,2
loop .home_show_cur
mov bx,[si]
add di,160
cmp bx,ax
jz .show_cursor_activ
sub si,2
loop .home_show_cur
 
.show_cursor_activ:
; push 0xb800
; pop es
mov point_to_point_def,si
mov ax,(color_sym_red*0x100+0x10)
stosw
add di,68
inc ax
stosw
; push 0xb800
; pop es
mov point_to_point_def,si
mov ax,(color_sym_red*0x100+0x10)
stosw
add di,68
inc ax
stosw
}
 
macro clear_timer_msg
{
push 0xb800
pop es
xor ax,ax
push 0xb800
pop es
xor ax,ax
if DEBUG
mov ax,0x0720
mov ax,0x0720
end if
;;;;;;;;;;;;;;;;;;;;; show Press any key
mov di,3360
mov cx,80*4
rep stosw
mov di,3360
mov cx,80*4
rep stosw
 
;show sect
push ini_data_
pop es
call show_bl_sc_sect ;es=0xb800
push ini_data_
pop es
call show_bl_sc_sect ;es=0xb800
 
}
 
562,21 → 562,21
local .end_sh_desc_sec
local .loop_message
local .show_mess_prev_eq
mov di,point_default
push ini_data_
mov si,point_to_point_def
pop es
sub si,2
mov cx,[si] ;çàãðóçèì óêàçàòåëü íàñëåäóþùèþ ñåêöèþ
sub cx,di ;âîò òåïåðü èìååì èñòèíûé ðàçìåð
mov di,point_default
push ini_data_
mov si,point_to_point_def
pop es
sub si,2
mov cx,[si] ;çàãðóçèì óêàçàòåëü íàñëåäóþùèþ ñåêöèþ
sub cx,di ;âîò òåïåðü èìååì èñòèíûé ðàçìåð
;di - óêàçàòåëü íà äåôîëòíóþ ñåêöèþ ò.å. âûáðàííóþ cx - ðàçìåð îáëàñòè. äëÿ ïðîñìîòðà
 
.start_p_sh_d:
call get_firs_sym ;get first symbol on new line
test cx,cx
jz .exit ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'d'
jnz .start_p_sh_d
call get_firs_sym ;get first symbol on new line
test cx,cx
jz .exit ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'d'
jnz .start_p_sh_d
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
mov bx,cx
585,99 → 585,99
mov si,parse_descript
mov cx,parse_descript_e - parse_descript
repe cmpsb
jnz .rest_value_loop_sh_d ;is not compare
jnz .rest_value_loop_sh_d ;is not compare
 
sub bx,parse_descript_e - parse_descript ;correct cx
add bx,cx
mov cx,bx
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ðàçáîð àëÿ ' = '
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
jcxz .rest_value_loop_sh_d ;not found param timeout
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
jcxz .rest_value_loop_sh_d ;not found param timeout
cmp ah,byte [es:di-1] ;find '='
jnz .rest_value_loop_sh_d
repe scasb ;cut ' '
inc cx
dec di
cmp ah,byte [es:di-1] ;find '='
jnz .rest_value_loop_sh_d
repe scasb ;cut ' '
inc cx
dec di
;;;;;;;;;;;;;;;;;;;;di óêàçûâàåò íà ñòðî÷êó, êîòîðóþ íàì íóæíî âûâîäèòü.
;ñòðî÷êà áóäåò âûâîäèòüñÿ áëîêàìè ïî 37 ñèìâîëîâ.
;íàñòðîèì êóäà áóäåì âûâîäèòü ò.å. íà÷àëî
;es:di - óêàçûâàþò íà ñòðî÷êó èç êîòîðîé ìû áåðåì ñèìâîë, ds:si êóäà áóäåì âûâîäèòü
push di
pop si
push di
pop si
 
push es
pop ds
push es
pop ds
 
push 0xb800
pop es
mov di,1040
mov bx,18
mov find_sec_di,di
mov save_cx_d,bx
;;;;;;;;;;;;;;;;;;;;;;;;;;
push 0xb800
pop es
mov di,1040
mov bx,18
mov find_sec_di,di
mov save_cx_d,bx
;;;;;;;;;;;;;;;;;;;;;;;;;;
;clean string
 
push di
xor ax,ax
push di
xor ax,ax
 
@@: mov cx,38
push di
rep stosw
pop di
@@: mov cx,38
push di
rep stosw
pop di
 
cmp save_descript_size,bx
jz @f
cmp save_descript_size,bx
jz @f
 
 
add di,160
dec bx
jnz @b
add di,160
dec bx
jnz @b
 
@@: pop di
@@: pop di
;enter in mess
.show_mess_prev_eq:
lodsb
mov ah,color_sym_lettuce;color_sym_turquoise
; sub di,2
cmp al,'"'
jz .loop_message
cmp al,"'"
jnz .end_sh_desc_sec
lodsb
mov ah,color_sym_lettuce;color_sym_turquoise
; sub di,2
cmp al,'"'
jz .loop_message
cmp al,"'"
jnz .end_sh_desc_sec
 
.loop_message:
mov cx,38
mov cx,38
@@:
lodsb
cmp al,'"'
jz .end_sh_desc_sec
cmp al,"'"
jz .end_sh_desc_sec
stosw
loop @b
add find_sec_di,160
mov di,find_sec_di
dec save_cx_d
cmp save_cx_d,0
jnz .loop_message
lodsb
cmp al,'"'
jz .end_sh_desc_sec
cmp al,"'"
jz .end_sh_desc_sec
stosw
loop @b
add find_sec_di,160
mov di,find_sec_di
dec save_cx_d
cmp save_cx_d,0
jnz .loop_message
 
.end_sh_desc_sec:
push save_cx_d
pop save_descript_size
push save_cx_d
pop save_descript_size
 
push cs
pop ds
jmp .exit
push cs
pop ds
jmp .exit
 
 
.rest_value_loop_sh_d:
mov di,ax
mov cx,bx
jmp .start_p_sh_d
mov di,ax
mov cx,bx
jmp .start_p_sh_d
 
.exit:
}
/kernel/trunk/sec_loader/trunk/parse_dat.inc
12,7 → 12,7
; names of its contributors may be used to endorse or promote products
; derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka <Lrz> ''AS IS'' AND ANY
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname <Lrz> ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
29,11 → 29,11
parse_loader_e:
parse_l_timeout db 'timeout'
parse_l_timeout_e:
parse_l_default db 'default'
parse_l_default db 'default'
parse_l_default_e:
parse_name db 'ame'
parse_name db 'ame'
parse_name_e:
parse_descript db 'descript'
parse_descript db 'descript'
parse_descript_e:
 
parse_LoaderModule db 'LoaderModule'
42,15 → 42,15
parse_RamdiskSize_e:
parse_RamdiskFS db 'RamdiskFS'
parse_RamdiskFS_e:
parse_RamdiskSector db 'RamdiskSector'
parse_RamdiskSector db 'RamdiskSector'
parse_RamdiskSector_e:
parse_RamdiskCluster db 'RamdiskCluster'
parse_RamdiskCluster db 'RamdiskCluster'
parse_RamdiskCluster_e:
parse_RFS_FAT db 'FAT'
parse_RFS_FAT db 'FAT'
parse_RFS_FAT_e:
parse_RFS_KRFS db 'KRFS'
parse_RFS_KRFS db 'KRFS'
parse_RFS_KRFS_e:
parse_Loader_Image db 'LoaderImage'
parse_Loader_Image db 'LoaderImage'
parse_Loader_Image_e:
parse_RamdiskFile db 'RamdiskFile'
parse_RamdiskFile db 'RamdiskFile'
parse_RamdiskFile_e:
/kernel/trunk/sec_loader/trunk/parse_def_sect.inc
12,7 → 12,7
; names of its contributors may be used to endorse or promote products
; derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka <Lrz> ''AS IS'' AND ANY
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname <Lrz> ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
28,41 → 28,41
;òèïû îøèáîê ïðè îáðàáîòêå ìàêðîñà
;Ìàêðîñ RamdiskFS
;/îïðåäåëåíèå ôëàãîâ â çàïèñè êîðíåâîé äèðåêòîðèè
ATTR_READ_ONLY equ 0x01
ATTR_HIDDEN equ 0x02
ATTR_SYSTEM equ 0x04
ATTR_VOLUME_ID equ 0x08
ATTR_DIRECTORY equ 0x10
ATTR_ARCHIVE equ 0x20
ATTR_READ_ONLY equ 0x01
ATTR_HIDDEN equ 0x02
ATTR_SYSTEM equ 0x04
ATTR_VOLUME_ID equ 0x08
ATTR_DIRECTORY equ 0x10
ATTR_ARCHIVE equ 0x20
 
 
 
show_error_1 equ 0x1 ;êîí÷èëèñü äàííûå - íå çàïëàíèðîâàííûé êîíåö ñåêöèè
show_error_2 equ 0x2 ;íåò çàâåðøàþùåãî ñèìâîëà â ðàçìåðå ðàì äèñêà.
show_error_3 equ 0x4 ; ðàì äèñê áóäåò èìåòü ðàçìåð =64 êá.
show_error_4 equ 0x8 ;
show_error_1 equ 0x1 ;êîí÷èëèñü äàííûå - íå çàïëàíèðîâàííûé êîíåö ñåêöèè
show_error_2 equ 0x2 ;íåò çàâåðøàþùåãî ñèìâîëà â ðàçìåðå ðàì äèñêà.
show_error_3 equ 0x4 ; ðàì äèñê áóäåò èìåòü ðàçìåð =64 êá.
show_error_4 equ 0x8 ;
 
macro use_parse_def_sect
{
mov di,point_default
push ini_data_
pop es
mov si,point_to_point_def
sub si,2
mov cx,[si] ;çàãðóçèì óêàçàòåëü íàñëåäóþùèþ ñåêöèþ
mov di,point_default
push ini_data_
pop es
mov si,point_to_point_def
sub si,2
mov cx,[si] ;çàãðóçèì óêàçàòåëü íàñëåäóþùèþ ñåêöèþ
 
xor ax,ax ;îáíóëèì àx äëÿ î÷èñòêè ôëàãîâ
xor ax,ax ;îáíóëèì àx äëÿ î÷èñòêè ôëàãîâ
 
sub cx,di ;âîò òåïåðü èìååì èñòèíûé ðàçìåð
mov save_cx_d,cx ;ñîõðàíèì çíà÷åíèå cx ñâîåé ïåðåìåííîé
sub cx,di ;âîò òåïåðü èìååì èñòèíûé ðàçìåð
mov save_cx_d,cx ;ñîõðàíèì çíà÷åíèå cx ñâîåé ïåðåìåííîé
;îáíóëèì ïåðåìåííóþ ôëàãîâ, ýòî íåîáõîäèìî, äëÿ òîãî, ÷òî áû èçáåæàòü îáðàáîòêó ïîâòîðÿþùèõñÿ çíà÷åíèé
 
mov status_flag,ax
mov status_flag,ax
;;;;
;ÂÕîä â îáðàáîòêó ïàðñèíãà çíà÷åíèé ñåêöèé. es:di - óêàçàòåëü íà íà÷àëî ñåêöèè cx ðàçìåð ñåêöèè äîñòóïíîé äëÿ ïàðñèíãà
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;ñîãëàøåíèå íå ðàçðóøàåì bp, es, cs, sp
;use_Loader_Image ;çàãðóçèòü îáðàç âûøå 1 ìá
;ñîãëàøåíèå íå ðàçðóøàåì bp, es, cs, sp
;use_Loader_Image ;çàãðóçèòü îáðàç âûøå 1 ìá
use_RamdiskFS
;ïðîâåðÿåòñÿ ñàìûé ïîñëåäíèé.
use_LoaderModule ;îñîáåííîñòü - ïåðåäàåò óïðàâëåíèå íà çàãðóæåííûé ìîäóëü.
74,15 → 74,15
{
local .found_end_str
 
mov di,point_default ;restore value
mov cx,save_cx_d
mov di,point_default ;restore value
mov cx,save_cx_d
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
.start_p_LM:
call get_firs_sym ;get first symbol on new line
test cx,cx
jz ._afterLoaderModule ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'L'
jnz .start_p_LM
call get_firs_sym ;get first symbol on new line
test cx,cx
jz ._afterLoaderModule ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'L'
jnz .start_p_LM
;ïðîâåðêà íà çíà÷åíèå LoaderModule
; parse_LoaderModule
mov bx,cx
91,30 → 91,30
mov si,parse_LoaderModule
mov cx,parse_LoaderModule_e - parse_LoaderModule
repe cmpsb
jnz .rest_value_loop_LM ;is not compare
jnz .rest_value_loop_LM ;is not compare
 
sub bx,parse_LoaderModule_e - parse_LoaderModule ;correct cx
add bx,cx
mov cx,bx
 
test status_flag,flag_found_LM ;îöåíêà ôëàãîâ
jz .correct_is_not_set_LM
test status_flag,flag_found_LM ;îöåíêà ôëàãîâ
jz .correct_is_not_set_LM
 
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
 
.correct_is_not_set_LM:
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
jcxz .rest_value_loop_LM ;not found param timeout
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
jcxz .rest_value_loop_LM ;not found param timeout
cmp ah,byte [es:di-1] ;find '='
jnz .rest_value_loop_LM
repe scasb ;cut ' '
inc cx
dec di
cmp ah,byte [es:di-1] ;find '='
jnz .rest_value_loop_LM
repe scasb ;cut ' '
inc cx
dec di
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
122,45 → 122,45
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà LoaderModule = kord/kernel.loader
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ dw,dw,db'kord/kernel.loader',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
;ñîõðàíèëè ïåâûå 2 word
push dword [es:di-6]
lea si,[di-6]
push dword [es:di-6]
lea si,[di-6]
 
push word [es:di-2]
xor ax,ax
mov word [es:di-6],ax ;âíîñèì íóæíûå çíà÷åíèÿ
push word [es:di-2]
xor ax,ax
mov word [es:di-6],ax ;âíîñèì íóæíûå çíà÷åíèÿ
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
mov ax,info_real_mode_size ;0x3000 ;ñëåäóþùèé ñåãìåíò çà äàííûìè
mov ax,info_real_mode_size ;0x3000 ;ñëåäóþùèé ñåãìåíò çà äàííûìè
 
 
mov word [es:di-4],ax
mov word [es:di-2],16 ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì
mov word [es:di-4],ax
mov word [es:di-2],16 ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì
;;;;;; ïîèñê êîíöà ñòðî÷êè
@@: mov al,byte [es:di]
cmp al,' '
jz .found_end_str
cmp al,0xa
jz .found_end_str
cmp al,0xd
jz .found_end_str
inc di
dec cx
jnz @b
@@: mov al,byte [es:di]
cmp al,' '
jz .found_end_str
cmp al,0xa
jz .found_end_str
cmp al,0xd
jz .found_end_str
inc di
dec cx
jnz @b
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðåøíèÿ ñòðîêè
.found_end_str:
 
push word [es:di]
xor ax,ax
mov word [es:di],ax
push word [es:di]
xor ax,ax
mov word [es:di],ax
; xor ax,ax ; function 1 - read file
mov di,si ;file_data
inc ax
push si
push es
mov di,si ;file_data
inc ax
push si
push es
 
push es
pop ds
push cs
pop es
push es
pop ds
push cs
pop es
 
call far dword [es:loader_callback]
 
167,24 → 167,22
push cs
pop ds
 
pop es
pop si
pop es
pop si
 
test bx,bx
jnz .error_LM
 
 
jmp far dword [es:si]
jmp far dword [es:si]
 
 
 
 
.error_LM:
call error.LoaderModule
call error.LoaderModule
.rest_value_loop_LM:
mov di,ax
mov cx,bx
jmp .start_p_LM
mov di,ax
mov cx,bx
jmp .start_p_LM
 
._afterLoaderModule:
}
194,30 → 192,34
{
if DEBUG
local ._not_memory_in_sys
mov si,ramdiskFS_st
call printplain
;//////// clear window
mov ax,3
int 0x10
;\\\\\\\\\ clear window is end
mov si,ramdiskFS_st
call printplain
end if
; îáíóëèì ðåãèñòð ñîñòîÿíèÿ îøèáîê
xor ax,ax
mov show_errors_sect,ax
xor ax,ax
mov show_errors_sect,ax
use_free_memory ; óçíàåì êàêîãî îáúåìà ó íàñ äîñòóïíà ïàìÿòü. çíà÷åíèå âîçàðàùàåòñÿ â ax
;óçíàåì ñêîëüêî ó íàñ åñòü ïàìÿòè è ñìîæåì ëè ìû ñôîðìèðîâàòü íóæíîãî ðàçìåðà ðàì äèñê.
use_RamdiskSize ;çíà÷åíèå âîçâðàùàåòñÿ â bx
cmp free_ad_memory,bx ; ðàçìåðíîñòü â êá.
jbe ._not_memory_in_sys
movzx eax,bx
shl eax,10 ;*1024 = get size in byte
mov save_ramdisksize,eax ; ñîðõàíèì ðàçìåð â byte
cmp free_ad_memory,bx ; ðàçìåðíîñòü â êá.
jbe ._not_memory_in_sys
movzx eax,bx
shl eax,10 ;*1024 = get size in byte
mov save_ramdisksize,eax ; ñîðõàíèì ðàçìåð â byte
 
get_type_FS ;ïîëó÷èì òèï ôàéëîâîé ñèñòåìû + ñîçäàäèì åå
 
._not_memory_in_sys:
if DEBUG
;pause
xor ax,ax
int 0x16
xor ax,ax
int 0x16
end if
}
macro use_RamdiskSize
233,14 → 235,14
local ._end_parse_RS
;îáðàáàòûâàåòñÿ ðàçìåð ôîðìèðóåìîãî ðàì äèñêà
;çàãðóçèì íà÷àëî ñåêöèè, ò.ê. áóäåì ïðîñìàòðèâàòü ñ íà÷àëà è âñþ ñåêöèþ
mov di,point_default ;restore value
mov cx,save_cx_d
mov di,point_default ;restore value
mov cx,save_cx_d
.start_p_RS:
call get_firs_sym ;get first symbol on new line
test cx,cx
jz ._end_parse_RS ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'R'
jnz .start_p_RS
call get_firs_sym ;get first symbol on new line
test cx,cx
jz ._end_parse_RS ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'R'
jnz .start_p_RS
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
; parse_RamdiskSize
mov bx,cx
249,77 → 251,77
mov si,parse_RamdiskSize
mov cx,parse_RamdiskSize_e - parse_RamdiskSize
repe cmpsb
jnz .rest_value_loop_RS ;is not compare
jnz .rest_value_loop_RS ;is not compare
 
sub bx,parse_RamdiskSize_e - parse_RamdiskSize ;correct cx
add bx,cx
mov cx,bx
 
test status_flag,flag_found_RS ;îöåíêà ôëàãîâ
jz .correct_is_not_set_RS
test status_flag,flag_found_RS ;îöåíêà ôëàãîâ
jz .correct_is_not_set_RS
 
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
 
.correct_is_not_set_RS:
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
jcxz .end_get_RS_ERROR_1 ;not found param
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
jcxz .end_get_RS_ERROR_1 ;not found param
cmp ah,byte [es:di-1] ;find '='
jnz .start_p_RS ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ
repe scasb ;cut ' '
inc cx
dec di
cmp ah,byte [es:di-1] ;find '='
jnz .start_p_RS ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ
repe scasb ;cut ' '
inc cx
dec di
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Òóò íóæíî ïðåîáðàçîâûâàòü ñòðî÷êó â öèôðîâîå çíà÷åíèå.
;;;;;;;;;;;;;;;;;;;;;;;;;;
xor bx,bx
mov cx,5
@@: mov al,byte [es:di]
cmp al,'0'
jb .CS
cmp al,'9'
jbe .correct_val_RS
xor bx,bx
mov cx,5
@@: mov al,byte [es:di]
cmp al,'0'
jb .CS
cmp al,'9'
jbe .correct_val_RS
.CS:
cmp al,'K'
jz .correct_size_RS
jmp .end_get_RS_ERROR_2
.correct_val_RS:
imul bx,10
xor al,0x30
add bl,al
inc di
loop @b
cmp al,'K'
jz .correct_size_RS
jmp .end_get_RS_ERROR_2
.correct_val_RS:
imul bx,10
xor al,0x30
add bl,al
inc di
loop @b
 
.correct_size_RS:
;âîçìîæåí 1 âàðèàíò, êîãäà ðàçìåð çàäàí â K êèëëîáàéòàõ
;âíóòðåííûé ôîðìàò äàííûõ ýòî êîë-âî çàïðîùåíîé ïàìÿòè â êá.
test bx,bx
jnz @f ;åñëè çíà÷åíèå îòëè÷íî îò 0
test bx,bx
jnz @f ;åñëè çíà÷åíèå îòëè÷íî îò 0
;;;;;ñîîáùåíèå îá îøèáêå, ðàçìåð "íàéäåíîãî" áëîêà =0 ìèíèìàëüíî ìû äîëæíû
;óñòàíîâèòü 64 êá ðàçìåð ðàì äèñêà.
or show_errors_sect,show_error_3
mov bx,64
or show_errors_sect,show_error_3
mov bx,64
@@:
jmp ._end_parse_RS
jmp ._end_parse_RS
 
 
.rest_value_loop_RS:
mov di,ax
mov cx,bx
jmp .start_p_RS
mov di,ax
mov cx,bx
jmp .start_p_RS
.end_get_RS_ERROR_1:
;ñîîáùåíèå îá îøèáêå - äàííûé ó÷àñòîê êîäà íå áûë êîððåêòíî îáðàáîòàí :(
or show_errors_sect,show_error_1
jmp ._end_parse_RS
.end_get_RS_ERROR_2:
or show_errors_sect,show_error_2
or show_errors_sect,show_error_1
jmp ._end_parse_RS
.end_get_RS_ERROR_2:
or show_errors_sect,show_error_2
 
._end_parse_RS:
if DEBUG
328,7 → 330,7
mov cx,0x0a
mov di,RamdiskSize_msg
mov dword[ds:di],' '
mov word [ds:di+4],' '
mov word [ds:di+4],' '
call decode
;Show size
mov si,RamdiskSize_msg
340,31 → 342,31
}
 
macro use_free_memory
{
{
local _support_function_use_free_memory
;ìàêðîñ äëÿ ïîëó÷åíèÿ îáùåãî ÷èñëà äîñòóïíîé ïàìÿòè äëÿ ôîðìèðîâàíèÿ ðàì äèñêà çà ïðåäåëàìè 1 ìá.
;ìàêðîñ äëÿ ïîëó÷åíèÿ îáùåãî ÷èñëà äîñòóïíîé ïàìÿòè â êá, äëÿ ôîðìèðîâàíèÿ ðàì äèñêà çà ïðåäåëàìè 1 ìá.
;èñïîëüçóåòñÿ 0õ88 ôóíêöèÿ 0õ15 ïðåðûâàíèÿ
; åñëè ïîääåðæèâàåòñÿ ôóíêöèÿ, òî â ax çíà÷åíèå â êá, åñëè íåò, òî â ax=0
mov ah,0x88 ;ah,0x88
int 0x15
jnc ._support_function_use_free_memory
xor ax,ax
mov ah,0x88 ;ah,0x88
int 0x15
jnc ._support_function_use_free_memory
xor ax,ax
;âîçâðàùàåò â ax ÷èñëî â êá
._support_function_use_free_memory:
mov free_ad_memory,ax ; åñëè íå ïîääåðæèâàåòñÿ áèîñîì, òî â ax=0
mov free_ad_memory,ax ; åñëè íå ïîääåðæèâàåòñÿ áèîñîì, òî â ax=0
if DEBUG
pusha
pushad
movzx eax,ax
mov cx,0x0a
mov di,free_memory_msg
mov dword[ds:di],' '
mov word [ds:di+4],' '
mov word [ds:di+4],' '
call decode
;Show size
mov si,free_memory_msg
call printplain
 
popa
popad
end if
 
 
378,14 → 380,14
 
macro get_type_FS ;ïîëó÷èòü è ñîçäàòü îáðàç äëÿ çàäàííîé RFS.
{
mov di,point_default ;restore value
mov cx,save_cx_d
mov di,point_default ;restore value
mov cx,save_cx_d
.start_g_tpe_RFS:
call get_firs_sym ;get first symbol on new line
test cx,cx
jz ._end_parse_FRS ;._end_get_type_RFS ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'R'
jnz .start_g_tpe_RFS
call get_firs_sym ;get first symbol on new line
test cx,cx
jz ._end_parse_FRS ;._end_get_type_RFS ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'R'
jnz .start_g_tpe_RFS
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
; parse_RamdiskSize
mov bx,cx
394,31 → 396,31
mov si,parse_RamdiskFS
mov cx,parse_RamdiskFS_e - parse_RamdiskFS
repe cmpsb
jnz .start_g_tpe_RFS_rest_v ;is not compare
jnz .start_g_tpe_RFS_rest_v ;is not compare
 
sub bx,parse_RamdiskFS_e - parse_RamdiskFS ;correct cx
add bx,cx
mov cx,bx
 
test status_flag,flag_found_GTRFMS ;îöåíêà ôëàãîâ
jz .correct_is_not_set_FRS
test status_flag,flag_found_GTRFMS ;îöåíêà ôëàãîâ
jz .correct_is_not_set_FRS
 
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
 
.correct_is_not_set_FRS:
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
test cx,cx
jz .end_get_FRS_ERROR_1 ;not found param
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
test cx,cx
jz .end_get_FRS_ERROR_1 ;not found param
cmp ah,byte [es:di-1] ;find '='
jnz .start_g_tpe_RFS ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ
repe scasb ;cut ' '
inc cx
dec di
cmp ah,byte [es:di-1] ;find '='
jnz .start_g_tpe_RFS ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ
repe scasb ;cut ' '
inc cx
dec di
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Òóò íóæíî ïðåîáðàçîâûâàòü ñòðî÷êó â öèôðîâîå çíà÷åíèå.
;;;;;;;;;;;;;;;;;;;;;;;;;;
428,9 → 430,9
mov si,parse_RFS_FAT
mov cx,parse_RFS_FAT_e - parse_RFS_FAT
repe cmpsb
jnz .krfs_cmp ;is not compare
jnz .krfs_cmp ;is not compare
 
make_FAT_RamFS ;ñäåëàòü
make_FAT_RamFS ;ñäåëàòü
 
if DEBUG
pusha
438,33 → 440,33
call printplain
popa
end if
jmp ._end_parse_FRS
jmp ._end_parse_FRS
 
.krfs_cmp:
mov cx,bx
mov di,ax
.krfs_cmp:
mov cx,bx
mov di,ax
 
mov si,parse_RFS_KRFS
mov cx,parse_RFS_KRFS_e - parse_RFS_KRFS
repe cmpsb
; jnz @f ;is not compare
; jnz @f ;is not compare
 
jmp ._end_parse_FRS
jmp ._end_parse_FRS
 
 
.start_g_tpe_RFS_rest_v:
mov cx,bx
mov di,ax
jmp .start_g_tpe_RFS
mov cx,bx
mov di,ax
jmp .start_g_tpe_RFS
.end_get_FRS_ERROR_1:
;ñîîáùåíèå îá îøèáêå - äàííûé ó÷àñòîê êîäà íå áûë êîððåêòíî îáðàáîòàí :(
or show_errors_sect,show_error_1
jmp ._end_parse_FRS
.end_get_FRS_ERROR_2:
or show_errors_sect,show_error_2
or show_errors_sect,show_error_1
jmp ._end_parse_FRS
.end_get_FRS_ERROR_2:
or show_errors_sect,show_error_2
 
._end_parse_FRS:
if DEBUG
484,77 → 486,77
local .fat16
; ìû äîëæíû ñôîðìèðîâàòü â íà÷àëüíûé îáðàç Ram FS, à ïîòîì çàïèñàòü åãî çà îáëàñòü âûøå 1 ìá..
;äëÿ ñëó÷àÿ ñ FAT12
; mov di,fat12_buffer ;ds äîëæåí áûòü = cs
; mov di,fat12_buffer ;ds äîëæåí áûòü = cs
;es:di - óêàçûâàþò íà íà÷àëî áëîêà äëÿ ôîðìèðîâàíèÿ ðàì ôñ.
use_RamdiskSector ;âîçðàùàåìîå çíà÷åíèå â ax ðàçìåð ñåêòîðà â áàéòàõ
cmp ax,4096 ;ïî ñïåöèôèêàöèè çíà÷åíèå äîëæíî áûòü â ïðåäåëàõ îò 1 äî 4096
ja .RS1
test ax,ax
jnz @f ;îøèáêà åñëè ñþäà ïðûãíóëè âñå òàêè ...
use_RamdiskSector ;âîçðàùàåìîå çíà÷åíèå â ax ðàçìåð ñåêòîðà â áàéòàõ
cmp ax,4096 ;ïî ñïåöèôèêàöèè çíà÷åíèå äîëæíî áûòü â ïðåäåëàõ îò 1 äî 4096
ja .RS1
test ax,ax
jnz @f ;îøèáêà åñëè ñþäà ïðûãíóëè âñå òàêè ...
 
.RS1: mov word [fat12_buffer.BPB_BytsPerSec],512
.RS1: mov word [fat12_buffer.BPB_BytsPerSec],512
;;;;;;;;;;ñêàæåì ÷òî ïî äåôîëòó áóäåì þçàòü çíà÷åíèå...
@@: mov word [fat12_buffer.BPB_BytsPerSec],ax ;òóò âñå îê
@@: mov word [fat12_buffer.BPB_BytsPerSec],ax ;òóò âñå îê
 
;BPB_SecPerClus êîë-âî ñåêòîðîâ â êëàñòåðå
use_RamdiskCluster ;âîçðàùàåìîå çíà÷åíèå â al
cmp al,128
ja @f
; test al,0x1 ;ïðîâåðêà íà êðàòíîñòü )
; jnz @f
use_RamdiskCluster ;âîçðàùàåìîå çíà÷åíèå â al
cmp al,128
ja @f
; test al,0x1 ;ïðîâåðêà íà êðàòíîñòü )
; jnz @f
 
mov byte [fat12_buffer.BPB_SecPerClus],al
mov byte [fat12_buffer.BPB_SecPerClus],al
 
;incorrect value will be set dafault
;incorrect value will be set dafault
 
;íèæå íåêîððåêòíîå çíà÷åíèå â ò.ê. ðàçìåð êðàòåí 2 è â äèàïàçîíå îò 1 äî 128 âêëþ÷èòåëüíî
; ìû äîëæíû ðóãíóòüñÿ íà ýòî
;@@: ;mov byte [fat12_buffer.BPB_SecPerClus],1
;@@: ;mov byte [fat12_buffer.BPB_SecPerClus],1
 
;;;;; îïðåäåëåèì êàêàÿ ó íàñ áóäåò èñïîëüçîâàòüñÿ FAT
;ïî óñëîâèþ, fat12<4085<=fat16<65525<=fat32
; fat12_buffer.BPB_BytsPerSec*fat12_buffer.BPB_SecPerClus = êîë-âî ñåêòîðîâ
movzx eax,word [fat12_buffer.BPB_BytsPerSec]
movzx ebx,byte [fat12_buffer.BPB_SecPerClus]
movzx eax,word [fat12_buffer.BPB_BytsPerSec]
movzx ebx,byte [fat12_buffer.BPB_SecPerClus]
 
imul ebx,eax ;òóò ðàçìåðíîñòü ñåêòîðà
mov eax,save_ramdisksize ;ðàçìåð çàïðîøåííîãî ðàì äèñêà â áàéòàõ
cdq
idiv ebx
imul ebx,eax ;òóò ðàçìåðíîñòü ñåêòîðà
mov eax,save_ramdisksize ;ðàçìåð çàïðîøåííîãî ðàì äèñêà â áàéòàõ
cdq
idiv ebx
;;;;;;;; ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx
;ïîëó÷èì êîë-âî ñåêòîðîâ, è ìîæåì óæå îïðåäåëèòü òèï FAT êîòîðóþ íóæíî äåëàòü.
cmp eax,4085
jb .fat12
cmp eax,65525
jb .fat16
cmp eax,4085
jb .fat12
cmp eax,65525
jb .fat16
;;;;;;;;;;;;;;;;;;;;;;;; òóò fat32
mov set_ramfs,32 ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
mov word [fat12_buffer.BPB_RsvdSecCnt],32
xor eax,eax
mov word [fat12_buffer.BPB_RootEntCnt],ax
mov word [fat12_buffer.BPB_TotSec16],ax
mov dword [fat12_buffer.BPB_TotSec32],eax
mov set_ramfs,32 ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
mov word [fat12_buffer.BPB_RsvdSecCnt],32
xor eax,eax
mov word [fat12_buffer.BPB_RootEntCnt],ax
mov word [fat12_buffer.BPB_TotSec16],ax
mov dword [fat12_buffer.BPB_TotSec32],eax
 
 
.fat16: ;fat16
.fat16: ;fat16
;Äëÿ FAT12 è FAT16 äèñêîâ ýòî ïîëå ñîäåðæèò êîëè÷åñòâî ñåêòîðîâ, à BPB_TotSec32 ðàâíî 0, åñëè çíà÷åíèå <óìåùàåòñÿ> (ìåíüøå 0x10000).
jmp $
mov set_ramfs,16 ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
movzx ebx,byte [fat12_buffer.BPB_SecPerClus]
imul eax,ebx
jmp $
mov set_ramfs,16 ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
movzx ebx,byte [fat12_buffer.BPB_SecPerClus]
imul eax,ebx
 
cmp eax,0x10000
jae @f
mov word [fat12_buffer.BPB_TotSec16],ax
mov dword [fat12_buffer.BPB_TotSec32],0
cmp eax,0x10000
jae @f
mov word [fat12_buffer.BPB_TotSec16],ax
mov dword [fat12_buffer.BPB_TotSec32],0
@@:
;êîëè÷åñòâî ñåêòîðîâ çàíèìàåìîå îäíîé êîïèåé ôàò
; mov word [fat12_buffer.BPB_FATSz16],0x9 ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ??
; mov word [fat12_buffer.BPB_FATSz16],0x9 ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ??
;;;; çàïîëíèì BPB_RootEntCnt Äëÿ FAT12 è FAT16 äèñêîâ, ýòî ïîëå ñîäåðæèò ÷èñëî
;32-áàéòíûõ ýëåìåíòîâ êîðíåâîé äèðåêòîðèè. Äëÿ FAT32 äèñêîâ, ýòî ïîëå äîëæíî
;áûòü 0. Ïîêà êîíñòàíòà, íóæíî áóäåò ïîçæå äîäåëàòü.
mov eax,root_dir_entry_count
mov word [fat12_buffer.BPB_RootEntCnt],ax ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
mov eax,root_dir_entry_count
mov word [fat12_buffer.BPB_RootEntCnt],ax ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
;ïî äîêóìåíòàöèè ðåêîìåíäóþò îòðåçàòü 16 êá äëÿ ðóò äèð íî ýòî î÷ ìíîãî, äàæå äëÿ êîîñ. èìõî äëÿ íà÷àëà õâàòèò è 7 êá
;;;;;;;
;Äëÿ FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. Äëÿ FAT32 ýòî çíà÷åíèå
575,34 → 577,34
;}
;=====================================
;RootDirSectors
movzx ebx, word [fat12_buffer.BPB_BytsPerSec]
imul eax,32
add eax,ebx
dec eax
movzx ebx, word [fat12_buffer.BPB_BytsPerSec]
imul eax,32
add eax,ebx
dec eax
 
cdq
idiv ebx
cdq
idiv ebx
;;;;;;;; ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx äëÿ äèñêåòû 1.44 ó íàñ äîëæíî áûòü çíà÷åíèå =14
;BPB_ResvdSecCnt + RootDirSectors
movzx ebx, word [fat12_buffer.BPB_RsvdSecCnt]
add ebx,eax
movzx ebx, word [fat12_buffer.BPB_RsvdSecCnt]
add ebx,eax
;DskSize ó íàñ ýòî çíà÷åíèå óæå ïîëó÷åíî è äîñòóïíî
movzx eax,word [fat12_buffer.BPB_TotSec16] ;äîëæåí áûòü â ñåêòîðàõ
sub eax,ebx
movzx eax,word [fat12_buffer.BPB_TotSec16] ;äîëæåí áûòü â ñåêòîðàõ
sub eax,ebx
 
 
;TmpVal1=eax
shl edi,8 ;=edi*256
movzx ecx,byte [fat12_buffer.BPB_NumFATs]
add edi,ecx
shl edi,8 ;=edi*256
movzx ecx,byte [fat12_buffer.BPB_NumFATs]
add edi,ecx
;TmpVal2=edi
add eax,edi
dec eax
cdq
idiv edi
add eax,edi
dec eax
cdq
idiv edi
;FATSz = ñåé÷àñ ÷àñòíîå â eax, à îñòàòîê â edx
mov word [fat12_buffer.BPB_FATSz16],ax
mov word [fat12_buffer.BPB_FATSz16],ax
 
 
 
612,46 → 614,56
 
 
.fat12: ;fat12
if DEBUG
; âûâåäåì â îòëàäêå, ÷òî ñîáèðàåìñÿ äåëàòü îáðàç äèñêà c FS=fat12
pushad
mov si,start_making_FAT12_msg
call printplain
popad
end if
 
 
 
;Äëÿ FAT12 è FAT16 äèñêîâ ýòî ïîëå ñîäåðæèò êîëè÷åñòâî ñåêòîðîâ, à BPB_TotSec32 ðàâíî 0, åñëè çíà÷åíèå <óìåùàåòñÿ> (ìåíüøå 0x10000).
mov set_ramfs,12 ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
movzx ebx,byte [fat12_buffer.BPB_SecPerClus]
imul eax,ebx
mov set_ramfs,12 ;óñòàíîâèì òèï ôàéëîâîé ñèñòåìû
movzx ebx,byte [fat12_buffer.BPB_SecPerClus]
imul eax,ebx
 
cmp eax,0x10000
jae @f
mov word [fat12_buffer.BPB_TotSec16],ax
mov dword [fat12_buffer.BPB_TotSec32],0
cmp eax,0x10000
jae @f
mov word [fat12_buffer.BPB_TotSec16],ax
mov dword [fat12_buffer.BPB_TotSec32],0
@@:
;êîëè÷åñòâî ñåêòîðîâ çàíèìàåìîå îäíîé êîïèåé ôàò
; mov word [fat12_buffer.BPB_FATSz16],0x9 ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ??
; mov word [fat12_buffer.BPB_FATSz16],0x9 ;Äëÿ FAT12/FAT16 ýòî êîëè÷åñòâî ñåêòîðîâ îäíîé FAT. ??
;;;; çàïîëíèì BPB_RootEntCnt Äëÿ FAT12 è FAT16 äèñêîâ, ýòî ïîëå ñîäåðæèò ÷èñëî
;32-áàéòíûõ ýëåìåíòîâ êîðíåâîé äèðåêòîðèè. Äëÿ FAT32 äèñêîâ, ýòî ïîëå äîëæíî
;áûòü 0. Ïîêà êîíñòàíòà, íóæíî áóäåò ïîçæå äîäåëàòü.
mov eax,root_dir_entry_count
mov word [fat12_buffer.BPB_RootEntCnt],ax ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
mov eax,root_dir_entry_count
mov word [fat12_buffer.BPB_RootEntCnt],ax ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
;ïî äîêóìåíòàöèè ðåêîìåíäóþò îòðåçàòü 16 êá äëÿ ðóò äèð íî ýòî î÷ ìíîãî, äàæå äëÿ êîîñ. èìõî äëÿ íà÷àëà õâàòèò è 7 êá
;;;;;;;
;DskSize(â ñåêòîðàõ)*12 (ðàçìåðíîñòü ôàéëîâîé ñèñòåìû, ò.å ïðåäïîëîæèì ñêîëüêî áèòîâ ïîòðåáóåòñÿ äëÿ àäðåñàöèè ýòîãî îáúåìà) /8 (÷òî ïîëó÷èòü ðàçìåð â áàéòàõ)
;ïîëó÷åííîå ÷èñëî îêðóãëÿåì â áîëüøóþ ñòîðîíó êðàòíîå ñåêòîðó ò.å. 512 áàéò Òàêîé ïîäõîä íå óíèâåðñàëåí, íî ïîêà ïîéäåò
;âîîáùå ó ìåëêîñîôò ýòî âñå ñ÷èòàåòñÿ ðó÷êàìè, íî ìû áóäåì þçàòü òîëüêî ïîä êîîñ ðàì äèñê ñ ôàò12
movzx eax, word [fat12_buffer.BPB_TotSec16]
imul eax,12
shr eax,3 ;äåëèì íà 8 íî ò.å. íàì íóæíî äåëèòü åùå è íà 512 èëè áîëåå â çàâèñèìîñòè îò ðàçìåðîâ êëàñòåðà
movzx ebx,word [fat12_buffer.BPB_BytsPerSec] ;ðàçìåð ñåêòîðà
cdq
idiv ebx ;ðàçäåëèì íà ðàçìåð êëàñòåðà
movzx eax, word [fat12_buffer.BPB_TotSec16]
imul eax,12
shr eax,3 ;äåëèì íà 8 íî ò.å. íàì íóæíî äåëèòü åùå è íà 512 èëè áîëåå â çàâèñèìîñòè îò ðàçìåðîâ êëàñòåðà
movzx ebx,word [fat12_buffer.BPB_BytsPerSec] ;ðàçìåð ñåêòîðà
cdq
idiv ebx ;ðàçäåëèì íà ðàçìåð êëàñòåðà
;ñåé÷àñ ó íàñ â eax çíà÷åíèå åãî íóæíî îêðóãëèòü â áîëüøóþ ñòîðîíó êðàòíîìó 512 áàéòàì
;ïðèìåíèì ñëåäóþùåå î÷èñòèì and è äîáàâèì 512 áàéò. òàêèì îáðàçîì âûðàâíèì íà 512 áàéò
;íî ò.ê. âñå ðàâíî äåëèòü íèæíèé êîä íàì íå íóæåí
; and eax,0xfff200
; add eax,0x200 ;äîáàâèì 512 áàéò äëÿ 1.44 äèñêåòû èäåàëüíî ïîäõîäèò ))
; and eax,0xfff200
; add eax,0x200 ;äîáàâèì 512 áàéò äëÿ 1.44 äèñêåòû èäåàëüíî ïîäõîäèò ))
 
inc ax
inc ax
;ïî èäåå äîëæíî íà êàæäóþ ôàò òàáëèöó
;ðåçåðâèðîâàòüñÿ 9 ñåêòîðîâ ò.å. ïîëó÷àåòñÿ 2*9=18+1 =19 ñåêòîðîâ ò.å. ðóò äèð íàõîäèòüñÿ íà ñ 20 ñåòîðà ò.å. ñ àäðåñà 0õ2600
;ñåé÷àñ íóæíî âû÷èñëèòü ñêîëüêî áóäåò ñåêòîðîâ çàíèìàòü ôàò ) íóæíî ðàçäåëèòü íà 512
;FATSz = ñåé÷àñ ÷àñòíîå â eax
mov word [fat12_buffer.BPB_FATSz16],ax
mov word [fat12_buffer.BPB_FATSz16],ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
get_firstDataSector ;ïîëó÷èòü ñìåùåíèå äî äàííûõ
;ñîçäàäèì ïåâóþ çàïèñü â ôàò ïî îïðåäåëåííîìó àäðåñó.
663,29 → 675,29
use_RamdiskFile
 
;;;; âû÷èñëÿåì óêàçàòåëü íà êîðíåâóþ äèð FirstRootDirSecNum = BPB_ResvdSecCnt + (BPB_NumFATs * BPB_FATSz16);
; movzx ebx, [fat12_buffer.BPB_NumFATs]
; movzx eax,ax
; imul eax,ebx
; movzx ebx, [fat12_buffer.BPB_NumFATs]
; movzx eax,ax
; imul eax,ebx
;eax=(BPB_NumFATs * BPB_FATSz16)
; inc eax
; inc eax
; BPB_ResvdSecCnt çíà÷åíèå òîëüêî 1 äëÿ fat12/16
;â eax óêàçàòåëü íà root dir. äëÿ äèñêåòû fat12 äîëæíî ïîëó÷èòüñÿ ïðè êîë-âî êîïèé fat 1 = 1+ (1*1) =2 èëè 3
 
if DEBUG
pusha
; mov ax,point_default
; mov ax,point_default
; mov ax,cx
mov cx,0x0a
mov di,show_db1
; mov dword[ds:di],' '
; mov word [ds:di+4],' '
; mov word [ds:di+4],' '
call decode
;Show size
mov si,show_db1
call printplain
;
; xor ax,ax
; int 0x16
; xor ax,ax
; int 0x16
popa
end if
 
700,16 → 712,16
macro use_RamdiskSector
{
;äëÿ íåêîòîðûõ FS áóäåò èãíîðèðîâàòüñÿ
mov di,point_default ;restore value
mov cx,save_cx_d
mov di,point_default ;restore value
mov cx,save_cx_d
 
.start_RamdiskSector:
call get_firs_sym ;get first symbol on new line
test cx,cx
jz .end_RamdiskSector ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
call get_firs_sym ;get first symbol on new line
test cx,cx
jz .end_RamdiskSector ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
 
cmp al,'R'
jnz .start_RamdiskSector
cmp al,'R'
jnz .start_RamdiskSector
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
; parse_RamdiskSize
 
719,66 → 731,66
mov si,parse_RamdiskSector
mov cx,parse_RamdiskSector_e - parse_RamdiskSector
repe cmpsb
jnz .RamdiskSector_rest_val ;is not compare
jnz .RamdiskSector_rest_val ;is not compare
 
sub bx,parse_RamdiskSector_e - parse_RamdiskSector ;correct cx
add bx,cx
mov cx,bx
 
test status_flag,flag_found_RamdiskSector ;îöåíêà ôëàãîâ
jz .correct_is_not_set_RamdiskSector
test status_flag,flag_found_RamdiskSector ;îöåíêà ôëàãîâ
jz .correct_is_not_set_RamdiskSector
 
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
 
.correct_is_not_set_RamdiskSector:
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
jcxz .end_get_RamS_ERROR_1 ;not found param
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
jcxz .end_get_RamS_ERROR_1 ;not found param
cmp ah,byte [es:di-1] ;find '='
jnz .start_RamdiskSector ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ
repe scasb ;cut ' '
inc cx
dec di
cmp ah,byte [es:di-1] ;find '='
jnz .start_RamdiskSector ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ
repe scasb ;cut ' '
inc cx
dec di
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
xor bx,bx
mov cx,4
@@: movzx ax,byte [es:di]
cmp al,'0'
jb .end_RamdiskSector
cmp al,'9'
ja .end_RamdiskSector
xor bx,bx
mov cx,4
@@: movzx ax,byte [es:di]
cmp al,'0'
jb .end_RamdiskSector
cmp al,'9'
ja .end_RamdiskSector
;;;;;;;;;;;;;;;;;;;
 
imul bx,10
xor al,0x30
add bx,ax
imul bx,10
xor al,0x30
add bx,ax
 
inc di
inc di
 
loop @b
jmp .end_RamdiskSector
loop @b
jmp .end_RamdiskSector
 
 
.RamdiskSector_rest_val:
mov cx,bx
mov di,ax
jmp .start_RamdiskSector
mov cx,bx
mov di,ax
jmp .start_RamdiskSector
.end_get_RamS_ERROR_1:
 
.end_RamdiskSector:
mov ax,bx
mov ax,bx
 
if DEBUG
pusha
movzx eax,bx;save_cx_d;point_default
movzx eax,bx;save_cx_d;point_default
mov cx,0x0a
mov di,RamdiskSector_msg
mov dword[ds:di],' '
mov dword [ds:di+4],' '
mov dword [ds:di+4],' '
call decode
;Show size
mov si,RamdiskSector_msg
787,25 → 799,25
popa
end if
 
; pop di
; pop es
; pop di
; pop es
}
 
macro use_RamdiskCluster
{
;äëÿ íåêîòîðûõ FS áóäåò èãíîðèðîâàòüñÿ
; push es
; push di
mov di,point_default ;restore value
mov cx,save_cx_d
; push ini_data_
; pop es
; push es
; push di
mov di,point_default ;restore value
mov cx,save_cx_d
; push ini_data_
; pop es
.start_RamdiskCluster:
call get_firs_sym ;get first symbol on new line
test cx,cx
jz .end_RamdiskCluster ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'R'
jnz .start_RamdiskCluster
call get_firs_sym ;get first symbol on new line
test cx,cx
jz .end_RamdiskCluster ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'R'
jnz .start_RamdiskCluster
;ïðîâåðêà íà çíà÷åíèÿ RamdiskSize
; parse_RamdiskSize
 
815,46 → 827,46
mov si,parse_RamdiskCluster
mov cx,parse_RamdiskCluster_e - parse_RamdiskCluster
repe cmpsb
jnz .RamdiskCluster_rest_val ;is not compare
jnz .RamdiskCluster_rest_val ;is not compare
 
sub bx,parse_RamdiskCluster_e - parse_RamdiskCluster ;correct cx
add bx,cx
mov cx,bx
 
test status_flag,flag_found_RamdiskCluster ;îöåíêà ôëàãîâ
jz .correct_is_not_set_RamdiskCluster
test status_flag,flag_found_RamdiskCluster ;îöåíêà ôëàãîâ
jz .correct_is_not_set_RamdiskCluster
 
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
 
.correct_is_not_set_RamdiskCluster:
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
jcxz .end_get_RamSC_ERROR_1 ;not found param
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
jcxz .end_get_RamSC_ERROR_1 ;not found param
cmp ah,byte [es:di-1] ;find '='
jnz .start_RamdiskCluster ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ
repe scasb ;cut ' '
inc cx
dec di
cmp ah,byte [es:di-1] ;find '='
jnz .start_RamdiskCluster ; ïåðåéäåì íà íà÷àëî è ïîïðîáóåì íàéòè åùå ñåêöèþ
repe scasb ;cut ' '
inc cx
dec di
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@: movzx ax,byte [es:di]
cmp al,'0'
jb .end_RamdiskCluster
cmp al,'9'
ja .end_RamdiskCluster
@@: movzx ax,byte [es:di]
cmp al,'0'
jb .end_RamdiskCluster
cmp al,'9'
ja .end_RamdiskCluster
;;;;;;;;;;;;;;;;;;;
xor al,0x30
xor al,0x30
 
jmp .end_RamdiskCluster
jmp .end_RamdiskCluster
 
 
.RamdiskCluster_rest_val:
mov cx,bx
mov di,ax
jmp .start_RamdiskCluster
mov cx,bx
mov di,ax
jmp .start_RamdiskCluster
.end_get_RamSC_ERROR_1:
 
.end_RamdiskCluster:
882,15 → 894,15
local .error_LI
local .rest_value_loop
local .found_end_str
mov di,point_default ;restore value
mov cx,save_cx_d
mov di,point_default ;restore value
mov cx,save_cx_d
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
.start_p_LI:
call get_firs_sym ;get first symbol on new line
test cx,cx
jz .exit ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'L'
jnz .start_p_LI
call get_firs_sym ;get first symbol on new line
test cx,cx
jz .exit ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'L'
jnz .start_p_LI
;ïðîâåðêà íà çíà÷åíèå LoaderModule
; parse_LoaderModule
mov bx,cx
899,30 → 911,30
mov si,parse_LoaderImage
mov cx,parse_LoaderImage_e - parse_LoaderImage
repe cmpsb
jnz .rest_value_loop ;is not compare
jnz .rest_value_loop ;is not compare
 
sub bx,parse_LoaderImage_e - parse_LoaderImage ;correct cx
add bx,cx
mov cx,bx
 
; test status_flag,flag_found_LM ;îöåíêà ôëàãîâ
; jz .correct_is_not_set_LI
; test status_flag,flag_found_LM ;îöåíêà ôëàãîâ
; jz .correct_is_not_set_LI
 
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
 
;.correct_is_not_set_LI:
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
jcxz .rest_value_loop_LI ;not found param timeout
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
jcxz .rest_value_loop_LI ;not found param timeout
cmp ah,byte [es:di-1] ;find '='
jnz .rest_value_loop_LI
repe scasb ;cut ' '
inc cx
dec di
cmp ah,byte [es:di-1] ;find '='
jnz .rest_value_loop_LI
repe scasb ;cut ' '
inc cx
dec di
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
930,46 → 942,46
;ýòî âûãëÿäèò òàê: â ini ôàéëå ñóùåñòâóåò ñòðî÷êà LoaderModule = kord/kernel.loader
;ìû åå ìîäèôèöèðóåì äî òàêîãî ñîñòîÿíèÿ dw,dw,db'kord/kernel.loader',0 êîíå÷íî ñîõðàíèâ òå çíà÷åíèÿ êîòîðûå ìû çàìåíÿåì
;ñîõðàíèëè ïåâûå 2 word
push dword [es:di-6]
lea si,[di-6]
push dword [es:di-6]
lea si,[di-6]
 
push word [es:di-2]
xor ax,ax
mov word [es:di-6],ax ;âíîñèì íóæíûå çíà÷åíèÿ
push word [es:di-2]
xor ax,ax
mov word [es:di-6],ax ;âíîñèì íóæíûå çíà÷åíèÿ
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
mov ax,info_real_mode_size ;0x3000 ;ñëåäóþùèé ñåãìåíò çà äàííûìè
mov ax,info_real_mode_size ;0x3000 ;ñëåäóþùèé ñåãìåíò çà äàííûìè
 
 
mov word [es:di-4],ax
mov word [es:di-2],16 ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì
mov word [es:di-4],ax
mov word [es:di-2],16 ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ñ÷èòàåì
;;;;;; ïîèñê êîíöà ñòðî÷êè
@@: mov al,byte [es:di]
cmp al,' '
jz .found_end_str
cmp al,0xa
jz .found_end_str
cmp al,0xd
jz .found_end_str
inc di
dec cx
jnz @b
@@: mov al,byte [es:di]
cmp al,' '
jz .found_end_str
cmp al,0xa
jz .found_end_str
cmp al,0xd
jz .found_end_str
inc di
dec cx
jnz @b
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðåøíèÿ ñòðîêè
.found_end_str:
; ÷òåíèå áëîêà ïî 64 êá â ñåãìåíò è çàáðàñûâàíèå åãî âûøå 1 ìá.
push word [es:di]
xor ax,ax
mov word [es:di],ax
push word [es:di]
xor ax,ax
mov word [es:di],ax
; xor ax,ax ; function 1 - read file
mov di,si ;file_data
inc ax
push si
push es
mov di,si ;file_data
inc ax
push si
push es
call far dword [loader_callback]
push cs
pop ds
 
pop es
pop si
pop es
pop si
 
test bx,bx
jnz .error_LM
989,15 → 1001,15
 
 
 
jmp far dword [es:si]
jmp far dword [es:si]
 
 
 
 
.rest_value_loop:
mov di,ax
mov cx,bx
jmp .start_p_LI
mov di,ax
mov cx,bx
jmp .start_p_LI
 
.exit:
 
1020,20 → 1032,20
;çàãðóçêà ôàéëîâ ñ èñïîëüçîâàíèå callback ñåðâèñà ïåðâè÷íîãî çàãðóç÷èêà
;èñïîëüçóåòñÿ òîëüêî äëÿ çàãðóçêè íåîáõîäèìûõ è íåáîëüøèõ ôàéëîâ, ò.ê. äîñòàòî÷íî ìåäëåííî ðàáîòàåò
;äëÿ çàãðóçêè èñïîëüçóåò 0õ87 ôóíêöèþ int 0x15 ïðåðûâàíèÿ - çàãðóçêà áëîêîâ äàííûõ äî 64 êá âûøå 1 ìá
local .start_loop
local .start_loop
local ._end
local .rest_value_loop
local .error
mov di,point_default ;restore value
mov cx,save_cx_d
mov data_offset,0 ;clean offset
mov di,point_default ;restore value
mov cx,save_cx_d
mov data_offset,0 ;clean offset
;îáðàáîòêà êîíñòðóêöèè òèïà LoaderModule=kord/kolibri.ldm
.start_loop:
call get_firs_sym ;get first symbol on new line
test cx,cx
jz ._end ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'R'
jnz .start_loop
call get_firs_sym ;get first symbol on new line
test cx,cx
jz ._end ;íåòó? íó ëàäíî - ñëåäóþùåå çíà÷åíèå òîãäà )
cmp al,'R'
jnz .start_loop
;ïðîâåðêà íà çíà÷åíèå RamdiskFile
mov bx,cx
mov ax,di
1041,33 → 1053,33
mov si,parse_RamdiskFile
mov cx,parse_RamdiskFile_e - parse_RamdiskFile
repe cmpsb
jnz .rest_value_loop ;is not compare
jnz .rest_value_loop ;is not compare
 
sub bx,parse_RamdiskFile_e - parse_RamdiskFile ;correct cx
add bx,cx
mov cx,bx
; test status_flag,flag_found_LM ;îöåíêà ôëàãîâ
; jz .correct_is_not_set_LM
; test status_flag,flag_found_LM ;îöåíêà ôëàãîâ
; jz .correct_is_not_set_LM
 
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
; mov si,found_equal_timeout ;ìû íàøëè ÷òî ôëàã óæå óñòàíîâëåí, èíôîðìèðóåì
; call printplain
; jmp .get_next_str
 
;.correct_is_not_set_LM:
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
test ecx,ecx
jz .rest_value_loop ;not found param timeout
mov ax,0x3d20 ;cut al=' ' ah='='
repe scasb
test ecx,ecx
jz .rest_value_loop ;not found param timeout
cmp ah,byte [es:di-1] ;find '='
jnz .rest_value_loop
repe scasb ;cut ' '
inc cx
dec di
cmp ah,byte [es:di-1] ;find '='
jnz .rest_value_loop
repe scasb ;cut ' '
inc cx
dec di
 
mov save_di_RAMDISK,di
mov save_cx_RAMDISK,cx
mov save_di_RAMDISK,di
mov save_cx_RAMDISK,cx
;di óêàçûâàåò íà íà÷àëî áëîêà èíôîðìàöèè, â cx äëèííà äî êîíöà ñåêöèè.
;ïîñëå çàãðóçêè çàíîñèòüñÿ çíà÷åíèå çàíÿòîé ïàìÿòè.
;äëÿ òîãî ÷òî áû çàãðóçèòü ìîäóëü, âîñïîëüçóåìñÿ callback ñåðâèñîì
1078,67 → 1090,67
 
;//ïðîâåðêà íàëè÷èÿ òàêîãî æå èìåíè â ðóò äèð
 
@@: mov al,byte [es:di]
cmp al,',' ; ò.å. èùåì ðàçäåëèòåëü
jz .found_end_str
inc di
dec cx
jnz @b
@@: mov al,byte [es:di]
cmp al,',' ; ò.å. èùåì ðàçäåëèòåëü
jz .found_end_str
inc di
dec cx
jnz @b
;;;not found äîïóñòèì,÷òî ýòî êîíåö ôàéëà è îí íå èìååò ïðèâû÷íîãî çàâåðøåíèÿ ñòðîêè
.found_end_str:
; mov al,byte [es:di]
; cmp al,' ' ; óáèðàåì ïðîáåëû, åñëè îíè åñòü
; jnz @f
; inc di
; dec cx
; jnz .found_end_str
; mov al,byte [es:di]
; cmp al,' ' ; óáèðàåì ïðîáåëû, åñëè îíè åñòü
; jnz @f
; inc di
; dec cx
; jnz .found_end_str
 
;@@:
mov point_to_dest_file_name,di
inc di
mov point_to_dest_file_name,di
inc di
;ïðîâåðêà èíäèâèäóàëüíîñòè èìåíè ôàéëà
check_name_file
;/restore di - point and cx -size section
mov di,save_di_RAMDISK
mov cx,save_cx_RAMDISK
mov di,save_di_RAMDISK
mov cx,save_cx_RAMDISK
 
test al,al
jnz .start_loop ;åñëè â al çíà÷åíèå íå =0, òî òàêîå èìÿ óæå ñóùåñòâóåò â ñèñòåìå.
test al,al
jnz .start_loop ;åñëè â al çíà÷åíèå íå =0, òî òàêîå èìÿ óæå ñóùåñòâóåò â ñèñòåìå.
 
 
 
push dword [es:di-6]
lea si,[di-6]
push dword [es:di-6]
lea si,[di-6]
 
push word [es:di-2]
push di
xor ax,ax
mov word [es:di-6],ax ;âíîñèì íóæíûå çíà÷åíèÿ
push word [es:di-2]
push di
xor ax,ax
mov word [es:di-6],ax ;âíîñèì íóæíûå çíà÷åíèÿ
;info_real_mode_size ðàçìåð è óêàçàòåëü íà îáëàñòü â êîòîðóþ ìîæíî çàãðóçèòüñÿ
mov ax,info_real_mode_size ;0x3000 ;ñëåäóþùèé ñåãìåíò çà äàííûìè
mov ax,info_real_mode_size ;0x3000 ;ñëåäóþùèé ñåãìåíò çà äàííûìè
 
 
mov word [es:di-4],ax
mov word [es:di-2],16 ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ÷èòàåì
mov word [es:di-4],ax
mov word [es:di-2],16 ;êîë-âî áëîêîâ ïî 4 êá =64 êá ò.å. áîëüøå íå ÷èòàåì
 
mov di,point_to_dest_file_name
mov di,point_to_dest_file_name
 
push word [es:di]
push cx
xor ax,ax
mov word [es:di],ax
push word [es:di]
push cx
xor ax,ax
mov word [es:di],ax
; xor ax,ax ; function 1 - read file
push di
mov di,si ;file_data
inc ax
push si
push es
push bp
push di
mov di,si ;file_data
inc ax
push si
push es
push bp
 
push es
pop ds
push cs
pop es
push es
pop ds
push cs
pop es
 
call far dword [es:loader_callback]
 
1146,30 → 1158,30
push cs
pop ds
 
pop bp
pop es
pop si
pop bp
pop es
pop si
 
cmp bx,2
ja .error
; ñåé÷àñ ó íàñ â dx:ax ðàçìåð ôàéëà, êîòîðûé ìû çàãðóçèëè.
; âîçìîæíà ñèòóàöèÿ, êîãäà â bx=1 ò.å. åñòü åùå äàííûå íà äèñêå
mov status_flag_loader_f,bx
mov status_flag_loader_f,bx
 
shl edx,16
mov dx,ax
; shr edx,10 ;ðàçìåð ôàéëà â êá.
;;â edx ðàçìåð â áàéòàõ.
mov save_file_size,edx
mov eax,edx
shl edx,16
mov dx,ax
; shr edx,10 ;ðàçìåð ôàéëà â êá.
;;â edx ðàçìåð â áàéòàõ.
mov save_file_size,edx
mov eax,edx
;âîññòàíîâèì ïîëíîñòüþ ôàéë ñöåíàðèÿ
pop di
pop cx ;äëèííà îñòàòêà ñ 2-îé ÷àñòüþ èìåíè ò.å. ñ èìåíåì íàçíà÷åíèåì.
pop word [es:di]
pop di
pop word [es:di-2]
pop dword [es:di-6]
pop di
pop cx ;äëèííà îñòàòêà ñ 2-îé ÷àñòüþ èìåíè ò.å. ñ èìåíåì íàçíà÷åíèåì.
pop word [es:di]
pop di
pop word [es:di-2]
pop dword [es:di-6]
 
if DEBUG
pusha
1194,11 → 1206,11
 
 
; çàãðóçèì ÷åìó ó íàñ ðàâåí êëàñòåð
; mov ax,word [fat12_buffer.BPB_BytsPerSec] ;êîë-âî áàéòîâ â ñåêòîðå ìîæåò áûòü ëþáîå 512 1024 2048 4096 2 áàéòà
; movzx bx,byte [fat12_buffer.BPB_SecPerClus] ;êîë-âî ñåêòîðîâ â êëàñòåðå
; imul ax,bx
; mov ax,word [fat12_buffer.BPB_BytsPerSec] ;êîë-âî áàéòîâ â ñåêòîðå ìîæåò áûòü ëþáîå 512 1024 2048 4096 2 áàéòà
; movzx bx,byte [fat12_buffer.BPB_SecPerClus] ;êîë-âî ñåêòîðîâ â êëàñòåðå
; imul ax,bx
;ñåé÷àñ â eax ðàçìåð êëàñòåðà (512) áàéò
;â edx äëèíà ôàéëà â áàéòàõ äî 64 êá
;â edx äëèíà ôàéëà â áàéòàõ äî 64 êá
;çàêèíèì ôàéë çà 1 ìá
;1 íàì íóæíî ñîñòàâèòü ôàò òàáëèöó ò.å. ïðîèçâåñòè ðàçìåòêó ðàìäèñêà, çàòåì ïåðåíåñåì ïî àäðåñó ôàéë
 
1208,9 → 1220,9
move_file_up
 
;ïðîâåðèì, çàãðóæåí ëè äî êîíöà ôàéë? ò.å. åñëè ðàçìåð ôàéëà áîëüøå ÷åì 64 êá, òî áóäåò ïîäãðóæàòü îñòàâøèåñÿ áëîêè
cmp status_flag_loader_f,0x1
jnz @f
;íóæíî äîçàãóçèòü äàííûå ôàéëà è ïåðåíåñòè èõ çà 1-ûé ìá ñîãëàñíî ôàò ñòðóêòóðå
cmp status_flag_loader_f,0x1
jnz @f
;íóæíî äîçàãóçèòü äàííûå ôàéëà è ïåðåíåñòè èõ çà 1-ûé ìá ñîãëàñíî ôàò ñòðóêòóðå
 
 
 
1222,26 → 1234,26
 
@@:
;òóò îðãàíèçîâàí öèêë ïî çàãðóçêå ôàéëîâ â êîðíåâóþ äèðåêòîðèþ
mov di,save_di_RAMDISK
mov cx,save_cx_RAMDISK
mov di,save_di_RAMDISK
mov cx,save_cx_RAMDISK
if DEBUG
pusha
xor ax,ax
int 0x16
xor ax,ax
int 0x16
popa
end if
 
 
jmp .start_loop
jmp .start_loop
 
 
.error:
;call error.LoaderModule
;call error.LoaderModule
;fixme!
.rest_value_loop:
mov di,ax
mov cx,bx
jmp .start_loop
mov di,ax
mov cx,bx
jmp .start_loop
 
._end:
;ïåðåíåñåì çà 1-ûé ìá ôàò è ðóò äèð
1253,9 → 1265,9
 
 
;çàãðóçêà áëîêà
; mov ah,0x87
; mov cx, ;size in byte
; mov ah,0x87
; mov cx, ;size in byte
 
;es:si point to descripts
 
1265,23 → 1277,23
macro use_BPB_RAM
;äàííûé ìàêðîñ çàêèäûâàåò BPB ñòðóêòóðó, ïîêà òîëüêî ôàò12 çà 1 ìá
{
mov ax,fat12_buffer
mov ax,fat12_buffer
mov si,table_15_87
add word [si+8*2+2],ax
add word [si+8*2+2],ax
push es
push ds
pop es
mov cx,31 ;ôàò12 óêëàäûâàåòñÿ â 62 áàéòà 62/2=31
mov cx,31 ;ôàò12 óêëàäûâàåòñÿ â 62 áàéòà 62/2=31
mov ah, 0x87
int 0x15
pop es
;add 512 byte for destination adress
; add dword [si+8*3+2], 512
; add dword [si+8*3+2], 512
; test ah, ah
; jz
; jz
if DEBUG
pusha
mov ax,word [si+8*2+2]
mov ax,word [si+8*2+2]
mov cx,0x0a
mov di,BPB_msg
call decode
1295,35 → 1307,35
;äàííûé ìàêðîñ ñîçäàåò îôîðìëÿåò 3 ïåðâûõ áàéòà fat òàáëèöû, è óñòàíàâëèâàåò óêàçàòåëü íà ñëåäóþùèé áëîê, è âíîñèò 0 çíà÷åíèå
;äëÿ ñìåùåíèÿ â êîðíåâîé òàáëèöå.
{
mov al,byte [fat12_buffer.BPB_Media]
mov al,byte [fat12_buffer.BPB_Media]
 
 
push ds
push ds
 
 
mov di,info_real_mode_size
add di,0x1000
push di ; push word info_real_mode_size+0x1000 ;cëåäóþùèé ñåãìåíò çà çàãðóæåííûì ó÷àñòêîì
xor di,di
mov point_to_free_root,di ;çíà÷åíèå ñìåùåíèÿ =0 â êîðíåâîé ôàò òàáëèöå îïèñàíèÿ
mov di,info_real_mode_size
add di,0x1000
push di ; push word info_real_mode_size+0x1000 ;cëåäóþùèé ñåãìåíò çà çàãðóæåííûì ó÷àñòêîì
xor di,di
mov point_to_free_root,di ;çíà÷åíèå ñìåùåíèÿ =0 â êîðíåâîé ôàò òàáëèöå îïèñàíèÿ
 
 
pop ds
pop ds ; çàãðóæåí ñëåäóþùèé ñåãìåíò ò.å. ïóñòîé ñåãìåíò
 
mov byte [di],al
or ax,-1
inc di
mov word [di],ax
mov byte [di],al
or ax,-1
inc di
mov word [di],ax
 
 
 
pop ds
mov point_next_fat_str,3
pop ds
mov point_next_fat_str,3
 
if DEBUG
pusha
mov ax,point_next_fat_str
pushad
mov ax,point_next_fat_str
mov cx,0x0a
mov di,fat_create_msg
call decode
1330,7 → 1342,7
;Show size
mov si,fat_create_msg
call printplain
popa
popad
end if
 
}
1339,157 → 1351,157
;ïîêà ïîääåðæèâàåòñÿ òîëüêî ôàò12, ïîêà ))
;âû÷èñëåíèå ñìåæíûõ êëàñòåðîâ è çàíåñåíèå èíôû â fat/
{
local .step2
local .step3
local .end
local .step2
local .step3
local .end
local .eof_file
 
;di point on root dir íà ôðè ñåêöèþ.
push es
push es
 
mov ax,info_real_mode_size
add ax,0x1000
mov es,ax ; push word info_real_mode_size+0x1000 ;ñåãìåíò ñëåäóþùèé çà çàãðóæåííûì áëîêîì â 64 êá
mov ax,info_real_mode_size
add ax,0x1000
mov es,ax ; push word info_real_mode_size+0x1000 ;ñåãìåíò ñëåäóþùèé çà çàãðóæåííûì áëîêîì â 64 êá
 
; îïðåäåëÿåì òèï ôàò ïîêà íå îïðåäåëÿåì, ïîêà òîëüêî ôàò 12
; 12 áèò, äëÿ âû÷åñëåíèÿ ñîñåäíèõ êàëàñòåðîâ.
mov di,firstDataSect ;â ñåêòîðàõ
sub di,size_root_dir
mov di,firstDataSect ;â ñåêòîðàõ
sub di,size_root_dir
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
shl di,9 ;imul 512
add di,point_to_free_root ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
shl di,9 ;imul 512
add di,point_to_free_root ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
;íåîáõîäèìî âíåñòè çíà÷åíèå â ðóò äèð ò.å. 32 áàéòà
;gs:di - óêàçàòåëü äëÿ âíåñåíèÿ èíôîðàöèè â ðóò îáëàñòü ôàò òàáëèöû èíîðìàöèè î ôàéëå.
mov si,shot_name_fat
mov cx,11
mov si,shot_name_fat
mov cx,11
;çàïèøåì â ñòðóêòóðó èìÿ
@@: lodsb
stosb
loop @b
@@: lodsb
stosb
loop @b
 
;çàïèøåì àòðèáóòû ôàéëà è DIR_NTRes - çàðåçåâðèðîâàííûé áàéò =0
xor ax,ax
mov ah,ATTR_VOLUME_ID
mov word [es:di],ax
add di,2
xor ax,ax
mov ah,ATTR_VOLUME_ID
mov word [es:di],ax
add di,2
;DIR_CrtTimeTenth
mov byte [es:di],100
inc di
mov byte [es:di],100
inc di
;DIR_CrtTime
mov word [es:di],0x032b ;äàòà
add di,2
mov word [es:di],0x032b ;äàòà
add di,2
;DIR_CrtDate
mov word [es:di],0x0 ;âðåìÿ ><
add di,2
mov word [es:di],0x0 ;âðåìÿ ><
add di,2
;DIR_LstAccDate
mov word [es:di],0x032b ;äàòà ìîåãî
add di,2
mov word [es:di],0x032b ;äàòà ìîåãî
add di,2
;DIR_FstClusHI
mov word [es:di],0x0 ;âðåìÿ äëÿ ôàò12 /16 âñåãäà 0
add di,2
mov word [es:di],0x0 ;âðåìÿ äëÿ ôàò12 /16 âñåãäà 0
add di,2
;DIR_WrtTime
mov word [es:di],0x0 ;âðåìÿ ><
add di,2
mov word [es:di],0x0 ;âðåìÿ ><
add di,2
;DIR_WrtDate
mov word [es:di],0x032b
add di,2
mov ax,point_next_fat_str
mov word [es:di],ax
add di,2
mov word [es:di],0x032b
add di,2
mov ax,point_next_fat_str
mov word [es:di],ax
add di,2
 
push di
;DIR_FstClusLO Ìëàäøåå ñëîâî íîìåðà ïåðâîãî êëàñòåðà.
; mov ax,point_next_fat_str ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè
push di
;DIR_FstClusLO Ìëàäøåå ñëîâî íîìåðà ïåðâîãî êëàñòåðà.
; mov ax,point_next_fat_str ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè
;FATOffset = N + (N / 2) ò.å. ýòî óæå ó íàñ ñìåùåíèå ìû çíàåì ÷òî -íà÷èíàåòñÿ âñå ñ 3-ãî ýëåìåíòà çàïèñè ôàò
mov bx,ax
shr bx,1
add ax,bx
mov bx,ax
shr bx,1
add ax,bx
;â àõ ñåé÷àñ FATOffset
;ThisFATEntOffset = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec);
mov bx, word [fat12_buffer.BPB_BytsPerSec]
cwd
idiv bx
mov bx, word [fat12_buffer.BPB_BytsPerSec]
cwd
idiv bx
;ax=ThisFATEntOffset= rem (FATOffset / BPB_BytsPerSec) ÷åòíûé èëè íå÷åòíûé óêàçàòåëü.
mov si,ax
mov si,ax
;íàì íóæíî â öèêëå çàïèñàòü âñå êëàñòåðû êîòîðûå áóäóò èñïîëüçîâàíû äëÿ ðàçìåùåíèÿ ôàéëà.
;óçíàåì ðàçìåð êëàñòåðà.
movzx eax,word [fat12_buffer.BPB_BytsPerSec]
movzx ebx,byte [fat12_buffer.BPB_SecPerClus]
imul eax,ebx
movzx eax,word [fat12_buffer.BPB_BytsPerSec]
movzx ebx,byte [fat12_buffer.BPB_SecPerClus]
imul eax,ebx
;ax - ðàçìåð êëàñòåðà.
;ñåé÷àñ áóäåì çàïèñûâàòü âî âðåìåííûé áóôåð ôàò òàáëèöó äëÿ âûáðàííîãî ôàéëà. Ïîñêîëüêó ìû åãî çàãðóçèëè âîçìîæíî íå ïîëíîñòüþ
;ìû îáðàáîòàåì çàïèñü äëÿ ôàò ïîëíîñòüþ, â íå çàâèñèìîñòè îò ïðåäåëà áóôåðà ãäå âîçìîæíà ÷àñòü ôàéëà.
mov ebx,save_file_size ;ðàçìåð ôàéëà â áàéòàõ
@@: sub ebx,eax
cmp ebx,eax
jbe .eof_file
;ìû îáðàáîòàåì çàïèñü äëÿ ôàò ïîëíîñòüþ, â íå çàâèñèìîñòè îò ïðåäåëà áóôåðà ãäå âîçìîæíà ÷àñòü ôàéëà.
mov ebx,save_file_size ;ðàçìåð ôàéëà â áàéòàõ
@@: sub ebx,eax
cmp ebx,eax
jbe .eof_file
 
inc point_next_fat_str
mov cx,point_next_fat_str ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè
inc point_next_fat_str
mov cx,point_next_fat_str ;çàãðóçèì óêàçàòåëü íà ýëåìåíò ôàò òàáëèöû ò.å. ýòî íîìåð ôàò çàïèñè
;FATOffset = N + (N / 2) ò.å. ýòî óæå ó íàñ ñìåùåíèå ìû çíàåì ÷òî -íà÷èíàåòñÿ âñå ñ 3-ãî ýëåìåíòà çàïèñè ôàò
mov dx,ax
shr dx,1
add cx,dx
mov dx,ax
shr dx,1
add cx,dx
 
 
 
test si,0x1
jz .step2
shl cx,4
mov word[es:si],cx
inc si
add cx,ax
jmp @b
test si,0x1
jz .step2
shl cx,4
mov word[es:si],cx
inc si
add cx,ax
jmp @b
 
.step2: and cx,0x0FFF
mov word[es:si],cx
inc si
add cx,ax
jmp @b
.step2: and cx,0x0FFF
mov word[es:si],cx
inc si
add cx,ax
jmp @b
 
.eof_file:
mov cx,0x0fff
test si,0x1
jz .step3
shl cx,4
mov word[es:si],cx
jmp .end
mov cx,0x0fff
test si,0x1
jz .step3
shl cx,4
mov word[es:si],cx
jmp .end
 
.step3: and cx,0x0FFF
mov word[es:si],cx
.step3: and cx,0x0FFF
mov word[es:si],cx
 
.end: inc point_next_fat_str
.end: inc point_next_fat_str
 
pop di
pop di
;DIR_FileSize 32-áèòíûé DWORD ñîäåðæèò ðàçìåð ôàéëà â áàéòàõ.
mov eax,save_file_size
mov dword [es:di],eax
mov eax,save_file_size
mov dword [es:di],eax
 
if DEBUG
pushad
 
mov di,firstDataSect ;â ñåêòîðàõ
sub di,size_root_dir
mov di,firstDataSect ;â ñåêòîðàõ
sub di,size_root_dir
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
shl di,9 ;imul 512
add di,point_to_free_root ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
shl di,9 ;imul 512
add di,point_to_free_root ;ñìåùåíèå â óæå çàïèñàííûõ 32-õ ñòðóêòóðàõ.
 
mov si,dest_name_fat
mov cx,11
mov si,dest_name_fat
mov cx,11
;çàïèøåì â ñòðóêòóðó èìÿ
@@: mov al,byte [es:di]
inc di
mov byte [ds:si],al
inc si
loop @b
xor ax,ax
mov byte [si],al
mov si,dest_name_fat
@@: mov al,byte [es:di]
inc di
mov byte [ds:si],al
inc si
loop @b
xor ax,ax
mov byte [si],al
mov si,dest_name_fat
call printplain
popad
popad
 
END IF
 
1497,8 → 1509,8
 
 
 
add point_to_free_root,32 ;óâåëèöèì ñìåùåíèå äî ñëåäóþùåãî çíà÷åíèÿ.
pop es
add point_to_free_root,32 ;óâåëèöèì ñìåùåíèå äî ñëåäóþùåãî çíà÷åíèÿ.
pop es
 
}
 
1510,30 → 1522,30
;ìàêðîñ äëÿ âû÷èñëåíèÿ ïåâîãî ñåêòîðà äàííûõ ò.å. äàííûõ ôàéëîâ â ôàòå
;âû÷èñëèì FirstDataSector = BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors;
{
mov ax,word [fat12_buffer.BPB_FATSz16]
movzx bx,byte [fat12_buffer.BPB_NumFATs]
imul ax,bx ;9x1=9
mov ax,word [fat12_buffer.BPB_FATSz16]
movzx bx,byte [fat12_buffer.BPB_NumFATs]
imul ax,bx ;9x1=9
;ax=BPB_NumFATs * FATSz
mov bx,word [fat12_buffer.BPB_RootEntCnt] ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
shr bx,4 ;imul bx,32 and then div 512 -> in bx size in sectors
add ax,bx ;9+14=23
mov size_root_dir,bx
movzx bx,byte [fat12_buffer.BPB_RsvdSecCnt] ;add 1 for fat 16/12
add ax,bx
mov bx,word [fat12_buffer.BPB_RootEntCnt] ; count of 32-byte dir. entries (224*32 = 14 sectors= 7 kb)
shr bx,4 ;imul bx,32 and then div 512 -> in bx size in sectors
add ax,bx ;9+14=23
mov size_root_dir,bx
movzx bx,byte [fat12_buffer.BPB_RsvdSecCnt] ;add 1 for fat 16/12
add ax,bx
;ax=firstDataSector - ãäå íà÷èíàåòñÿ ïåðâûé ñåêòîðî îò 0 ñåêòîðà â ñåêòîðàõ. - ôàêòè÷åñêè = 24 ñåêòîð
mov firstDataSect,ax ;ñîõðàíèì äëÿ âû÷èñëåíèÿ
; ïîëó÷èìçíà÷åíèå êëàñòåðîâ, ýòî îáúåì â êîòîðûé ìû ìîæåì çàïèñàòü äàííûå
mov bx,word [fat12_buffer.BPB_TotSec16]
sub bx,ax
mov ax,bx
movzx bx,byte [fat12_buffer.BPB_SecPerClus]
cwd
idiv bx
mov DataClasters,ax
mov firstDataSect,ax ;ñîõðàíèì äëÿ âû÷èñëåíèÿ
; ïîëó÷èìçíà÷åíèå êëàñòåðîâ, ýòî îáúåì â êîòîðûé ìû ìîæåì çàïèñàòü äàííûå
mov bx,word [fat12_buffer.BPB_TotSec16]
sub bx,ax
mov ax,bx
movzx bx,byte [fat12_buffer.BPB_SecPerClus]
cwd
idiv bx
mov DataClasters,ax
 
if DEBUG
pusha
mov ax,firstDataSect ;ïåðâûé ñåêòîð äàííûõ
pushad
mov ax,firstDataSect ;ïåðâûé ñåêòîð äàííûõ
mov cx,0x0a
mov di,firstDataSect_msg
call decode
1541,7 → 1553,7
mov si,firstDataSect_msg
call printplain
;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax,size_root_dir ;ðàçìåð ðóò äèð â ñåòîêòîðàõ
mov ax,size_root_dir ;ðàçìåð ðóò äèð â ñåòîêòîðàõ
mov cx,0x0a
mov di,size_root_dir_msg
call decode
1549,7 → 1561,7
mov si,size_root_dir_msg
call printplain
;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax,DataClasters ;êëàñòåðû
mov ax,DataClasters ;êëàñòåðû
mov cx,0x0a
mov di,DataClasters_msg
call decode
1556,7 → 1568,7
;Show size
mov si,DataClasters_msg
call printplain
popa
popad
 
end if
 
1579,23 → 1591,23
;di - óêàçàòåëü íà èìÿ ôàéëà ò.å. es:di óêàçûâàåò íà èìÿ ôàéëà íàçíà÷åíèÿ
;âûõîäíûå äàííûå eax =-1 èìÿ ñîâïàëî, eax=0 èìÿ íå ñîâïàëî.
{
local .no_equal
local .exit
local .no_equal
local .exit
;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè.
;ïðåîáðàçóåì â àíàëîã ôàò çàïèñè ñòî÷êó ñ èìåíåì íàçíà÷åíèÿ
convertion_file_name
test ax,ax
jnz .exit
convertion_file_name
test ax,ax
jnz .exit
 
mov si,shot_name_fat
mov si,shot_name_fat
 
;âû÷èñëèì óêàçàòåëü íà êîðíåâóþ äèðåêòîðèþ
mov di,firstDataSect
sub di,size_root_dir
mov di,firstDataSect
sub di,size_root_dir
;òåïåðü â ax ðàçìåð â ñåêòîðàõ íà÷àëà ðóò äèð
 
 
shl di,9 ;imul 512
shl di,9 ;imul 512
 
 
 
1602,52 → 1614,71
 
;di= Ýòî ñìåùåíèå îò íà÷àëà áóôåðà äî ðóò äèðåêòîðèè.
;çàãðóçèì çíà÷åíèå - ò.å. êîë-âî ýëåìåíòîâ, êîòîðûå ìû ìîæåì ïðîñìàòðèâàòü.
mov dx,root_dir_entry_count
mov dx,root_dir_entry_count
; mov si,point_to_dest_file_name
mov ax,info_real_mode_size
add ax,0x1000
mov ax,info_real_mode_size
add ax,0x1000
 
 
mov gs,ax
mov cx,11 ;size of name in struct FAT
mov gs,ax
mov cx,11 ;size of name in struct FAT
 
@@:
mov al,byte [ds:si+bx]
mov ah,byte [gs:di+bx] ;gs:di - point to name in fat struct
inc bx
@@:
mov al,byte [ds:si+bx]
mov ah,byte [gs:di+bx] ;gs:di - point to name in fat struct
 
cmp ah,al
jnz .no_equal
if DEBUG
pushad
 
; dec cx
; jnz @b
loop @b
mov cx,11
;input cx=size al=char áóäåò âûâåäåí ñèìâîë ñêîëüêî ðàç óêàçàíî â cx
@@:
mov al,byte [gs:di]
inc di
call putchar
loop @b
 
xor ax,ax
int 0x16
 
popad
end if
inc bx
 
cmp ah,al
jnz .no_equal
 
; dec cx
; jnz @b
loop @b
;.succesfuly:
;ïå÷àëüíî, òàêîå èìÿ óæå èìååòñÿ :(
or ax,-1
jmp .exit
or ax,-1
jmp .exit
 
 
.no_equal:
mov cx,11;save_cx_check_name
xor bx,bx
add di,32 ;fat struct =32 byte
dec dx
jnz @b
mov cx,11;save_cx_check_name
xor bx,bx
add di,32 ;fat struct =32 byte
dec dx
jnz @b
 
;.exit_check_name:
and ax,0
and ax,0
 
.exit:
 
if DEBUG
pusha
; movzx eax,ax;point_next_fat_str
; movzx eax,ax;point_next_fat_str
mov cx,0x0a
mov di,check_name_fat_msg
mov dword [di],' '
mov word [di+4],' '
mov dword [di],' '
mov word [di+4],' '
call decode
;Show size
mov si,check_name_fat_msg
1661,124 → 1692,125
macro convertion_file_name
;ìàêðîñ êîíâåðòàöèè èìåíè, ýòî íóæíî ïîñêîëüêó ôîðìàò ïðåäñòàâëåííûé íå ñîîòâåòñâóåò ôàò è íàïðÿìóþ ðåäêî ìîæíî êîãäà èñïîëüçîâàòü
;ïðåîáðàçîâàíèå èìåíè òèïà hello.asm â 'HELLO ASM', â ñîîòâåòñòâèè ñ ïðàâèëàìè fat.
;âõîäíûå ïàðàìåòðû es:di óêàçàòåëü íà èìÿ ôàéëà êîòîðîå íóæíî ïðåîáðàçîâàòü, êîíå÷íûé áóôåð shot_name_fat
{
local .next_step
local .next_step
local .error
local .st1
local .st2
local .st2_l
local .st3
local .st4_s
local .st4
local .st5
local .st2_l
local .st3
local .st4_s
local .st4
local .st5
 
;âû÷èñëèì äëèííó ñòðî÷êè èìåíè íàçíà÷åíèÿ, êîòîðóþ áóäåì ñðàâíèâàòü ñ óæå çàïèñàííûìè äàííûìè.
; mov di,point_to_dest_file_name âõîäíîé ïàðàìåòð
mov si,shot_name_fat
or first_input,-1 ;ïðè ïåðâîì âõîäå óñòàíàâëèâàåì ôëàã
mov cx,11 ;äëèííà èìåíè â ñòóêòóðå ôàò òàáëèöû
; mov di,point_to_dest_file_name âõîäíîé ïàðàìåòð
mov si,shot_name_fat
or first_input,-1 ;ïðè ïåðâîì âõîäå óñòàíàâëèâàåì ôëàã
mov cx,11 ;äëèííà èìåíè â ñòóêòóðå ôàò òàáëèöû
 
@@:
mov al,byte [es:di]
cmp al,0xa
jz .st4_s
cmp al,0xd
jz .st4_s
cmp al,0x20
jz .st4_s
@@:
mov al,byte [es:di]
cmp al,0xa
jz .st4_s
cmp al,0xd
jz .st4_s
cmp al,0x20
jz .st4_s
 
cmp al,0x20
jb .error
cmp al,0x22
jz .error
cmp al,0x2a
jz .error
cmp al,0x2b
jz .error
cmp al,0x2c
jz .error
cmp al,0x2F
jz .error
cmp al,0x20
jb .error
cmp al,0x22
jz .error
cmp al,0x2a
jz .error
cmp al,0x2b
jz .error
cmp al,0x2c
jz .error
cmp al,0x2F
jz .error
 
cmp al,0x3a
jz .error
cmp al,0x3b
jz .error
cmp al,0x3c
jz .error
cmp al,0x3d
jz .error
cmp al,0x3E
jz .error
cmp al,0x3F
jz .error
cmp al,0x3a
jz .error
cmp al,0x3b
jz .error
cmp al,0x3c
jz .error
cmp al,0x3d
jz .error
cmp al,0x3E
jz .error
cmp al,0x3F
jz .error
 
cmp al,0x5b
jz .error
cmp al,0x5c
jz .error
cmp al,0x5d
jz .error
cmp al,0x5b
jz .error
cmp al,0x5c
jz .error
cmp al,0x5d
jz .error
 
cmp al,0x7c
jz .error
cmp al,0x7c
jz .error
 
cmp first_input,-1
jnz .next_step
and first_input,0 ;ñáîðîñèì ôëàã.
cmp al,'.'
jz .error ;îáðàáîòêà òî÷êè, ôàéë íå ìîæåò íà÷èíàòüñÿ ñ òî÷êè
cmp first_input,-1
jnz .next_step
and first_input,0 ;ñáîðîñèì ôëàã.
cmp al,'.'
jz .error ;îáðàáîòêà òî÷êè, ôàéë íå ìîæåò íà÷èíàòüñÿ ñ òî÷êè
 
.next_step:
cmp al,0x2e
jnz .st2 ;îáðàáîòêà òî÷êè, â ñåðåäèíå ôàéëà
cmp al,0x2e
jnz .st2 ;îáðàáîòêà òî÷êè, â ñåðåäèíå ôàéëà
;òóò ó íàñ óñòàíîâëåí ðàçäåëèòåëü
;âñå îñòàëüíåî ìåñòî çàéìóò ïðîáåëû
mov al,' '
mov al,' '
 
;!fixme îáðàáîòàíû íå âñå èñêëþ÷åíèÿ :(
cmp cl,3 ;ôîðìàò ôàéëà òàêîé GIDGIDIIASM ò.å. gidgidii.asm
jbe .st2
cmp cl,3 ;ôîðìàò ôàéëà òàêîé GIDGIDIIASM ò.å. gidgidii.asm
jbe .st2
 
 
.st3:
mov byte [si],al
inc si
dec cx
cmp cx,3
ja .st3
; inc cx
inc di
jmp @b
.st3:
mov byte [si],al
inc si
dec cx
cmp cx,3
ja .st3
; inc cx
inc di
jmp @b
 
.st2:
cmp al,0x60
jbe .st2_l
xor al,0x20 ;ñäåëàåì çàãëàâíûå áóêâû
.st2_l: mov byte [si],al
inc di
inc si
; dec cx
; jnz @b
loop @b
.st5: xor ax,ax
jmp @f
cmp al,0x60
jbe .st2_l
xor al,0x20 ;ñäåëàåì çàãëàâíûå áóêâû
.st2_l: mov byte [si],al
inc di
inc si
; dec cx
; jnz @b
loop @b
.st5: xor ax,ax
jmp @f
 
;;;;;;;;ôàéë çàêîí÷èëñÿ, è íóæíî âíåñòè â êîíåö ïðîáåëû
.st4_s: mov al,' '
.st4: mov byte [si],al
inc si
loop .st4
jmp .st5
.st4_s: mov al,' '
.st4: mov byte [si],al
inc si
loop .st4
jmp .st5
 
.error: or ax,-1
.error: or ax,-1
@@:
 
if DEBUG
pusha
; mov ax,point_next_fat_str
; mov ax,point_next_fat_str
mov cx,0x0a
mov di,convertion_file_name_msg
call decode
1786,9 → 1818,9
mov si,convertion_file_name_msg
call printplain
 
mov si,shot_name_fat
mov byte [si+12],0
call printplain
mov si,shot_name_fat
mov byte [si+12],0
call printplain
popa
 
end if
1797,34 → 1829,34
macro move_file_up
;ìàêðîñ êîòîðûé ïåðåìåùàåò çà 1 ìá ñ ïðàâèëàìè ôàò äàííûå ôàéëà.
{
local .st1
local .correct_on_byte
local .st1
local .correct_on_byte
;ñåé÷àñ èìååò áûòü ñèòóàöèÿ, êîãäà BPB óæå ïåðåìåùåí çà 1 ìá, ôàò, è ðóò äèð áóäóò ïîçæå ïåðåìåùåíû,
;à íàì íóæíî âû÷èñëèòü ìåñòî, è ïåðåíåñòè òóäà ñîäåðæèìîå ôàéëà
;ïîëó÷åíîå çíà÷åíèå óêàçûâàåò â áàéòàõ íà íà÷àëî äàííûõ
 
mov ax,info_real_mode_size ; ñåãìåíò ãäå ðàñïîëîæåíû äàííûå
mov ax,info_real_mode_size ; ñåãìåíò ãäå ðàñïîëîæåíû äàííûå
mov si,table_15_87
mov word [si+8*2+2],ax
mov word [si+8*2+2],ax
;ñìåùåíèå äî äàííûõ óæå çà 1-ì ìá
movzx eax,firstDataSect
movzx edx,data_offset
add eax,edx
movzx eax,firstDataSect
movzx edx,data_offset
add eax,edx
 
movzx ebx,word [fat12_buffer.BPB_BytsPerSec]
movzx edx,byte [fat12_buffer.BPB_SecPerClus]
imul bx,dx ;ïîëó÷èì ðàçìåð êëàñòåðà
movzx ebx,word [fat12_buffer.BPB_BytsPerSec]
movzx edx,byte [fat12_buffer.BPB_SecPerClus]
imul bx,dx ;ïîëó÷èì ðàçìåð êëàñòåðà
 
 
 
push ebx ;save bx
push ebx ;save bx
 
imul eax,ebx
; shl eax,9 ;óìíîæèì íà 512
imul eax,ebx
; shl eax,9 ;óìíîæèì íà 512
if DEBUG
pusha
; mov eax,ebx;point_next_fat_str
pusha
; mov eax,ebx;point_next_fat_str
mov cx,0x0a
mov di,show_db1
call decode
1831,38 → 1863,38
;Show size
mov si,show_db1
call printplain
popa
popa
 
end if
 
; mov bx,word [fat12_buffer.BPB_BytsPerSec]
; movzx dx,byte [fat12_buffer.BPB_SecPerClus]
; imul bx,dx
; cwd
; idiv bx
; mov bx,word [fat12_buffer.BPB_BytsPerSec]
; movzx dx,byte [fat12_buffer.BPB_SecPerClus]
; imul bx,dx
; cwd
; idiv bx
 
mov dl,0x10
mov dl,0x10
 
@@: cmp eax,0x00010000
jb @f
@@: cmp eax,0x00010000
jb @f
 
sub eax,0x00010000
inc dl
jmp @b
sub eax,0x00010000
inc dl
jmp @b
 
 
@@: mov byte [si+8*3+3],dl ;êóäà ïèñàòü
mov word [si+8*3+2],ax
@@: mov byte [si+8*3+3],dl ;êóäà ïèñàòü
mov word [si+8*3+2],ax
 
mov ecx,save_file_size ;ðàçìåð ôàéëà â áàéòàõ.
cmp ecx,0x0000ffff ;ðàçìåð áëîêà ò.å. 64 êá
jbe .correct_on_byte ;êîððåêòèðîâêà íà áàéò çíà÷åíèÿ
mov ecx,save_file_size ;ðàçìåð ôàéëà â áàéòàõ.
cmp ecx,0x0000ffff ;ðàçìåð áëîêà ò.å. 64 êá
jbe .correct_on_byte ;êîððåêòèðîâêà íà áàéò çíà÷åíèÿ
 
 
 
mov ecx,0x00010000 ;65536
sub save_file_size,ecx ;îòíèìèì
; jmp .st1 ;ïîëó÷èì 0õ8000
mov ecx,0x00010000 ;65536
sub save_file_size,ecx ;îòíèìèì
; jmp .st1 ;ïîëó÷èì 0õ8000
 
 
 
1870,23 → 1902,23
;êîððåêòèðîâêà çíà÷åíèÿ äîëæíà áûòü âûïîëåíåíà íà ðàçìåð êëàñòåðà
.correct_on_byte:
;/óçíàåì ðàçìåð êëàñòåðà
pop eax ;restore size of claster
push ecx
@@: inc data_offset
pop eax ;restore size of claster
push ecx
@@: inc data_offset
 
cmp eax,ecx
jae @f
sub ecx,eax
jmp @b
@@: pop ecx
cmp eax,ecx
jae @f
sub ecx,eax
jmp @b
@@: pop ecx
 
 
 
 
test ecx,0x1
jz .st1
inc ecx
.st1: shr ecx,1 ; ïðåîáðàçîâàòü çíà÷åíèå äëÿ 0x87 function
test ecx,0x1
jz .st1
inc ecx
.st1: shr ecx,1 ; ïðåîáðàçîâàòü çíà÷åíèå äëÿ 0x87 function
 
;ïåðåíåñåì áëîê çà 1 ìá
push es
1898,8 → 1930,8
pop es
 
if DEBUG
pusha
; mov ax,point_next_fat_str
pusha
; mov ax,point_next_fat_str
mov cx,0x0a
mov di,return_code_af_move
call decode
1906,7 → 1938,7
;Show size
mov si,return_code_af_move
call printplain
popa
popa
 
end if
 
1918,29 → 1950,29
{
local .st1
 
mov ax,info_real_mode_size
add ax,0x1000
mov ax,info_real_mode_size
add ax,0x1000
 
mov si,table_15_87
mov word [si+8*2+2],ax
mov word [si+8*2+2],ax
;ñìåùåíèå äî äàííûõ
mov ax,512
mov word [si+8*3+2],ax
mov ax,512
mov word [si+8*3+2],ax
;fixme! òóò íåîáõîäèìî ñäåëàòü ïîäåðæêó ò.å. ôîðìèðîâàòü ñìåùåíèå ôàéëà â óæå çàïèñàííûõ äàííûõ.
 
movzx ecx,word [fat12_buffer.BPB_FATSz16]
movzx bx,byte [fat12_buffer.BPB_NumFATs]
imul cx,bx ;9x1=9
movzx ecx,word [fat12_buffer.BPB_FATSz16]
movzx bx,byte [fat12_buffer.BPB_NumFATs]
imul cx,bx ;9x1=9
 
add cx,size_root_dir ;ðàçìåð êîðíåâîé äèððåêòîðèè
shl ecx,9 ;imul 512
add cx,size_root_dir ;ðàçìåð êîðíåâîé äèððåêòîðèè
shl ecx,9 ;imul 512
 
 
;êîððåêòèðîâêà çíà÷åíèÿ
test ecx,0x1
jz .st1
inc ecx
.st1: shr ecx,1
test ecx,0x1
jz .st1
inc ecx
.st1: shr ecx,1
 
push es
push ds
1951,8 → 1983,8
pop es
 
if DEBUG
pusha
; mov ax,point_next_fat_str
pusha
; mov ax,point_next_fat_str
mov cx,0x0a
mov di,return_code_af_fat_m
call decode
1959,7 → 1991,7
;Show size
mov si,return_code_af_fat_m
call printplain
popa
popa
 
end if
 
/kernel/trunk/sec_loader/trunk/parse_loader.inc
12,7 → 12,7
; names of its contributors may be used to endorse or promote products
; derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka <Lrz> ''AS IS'' AND ANY
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname <Lrz> ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
/kernel/trunk/sec_loader/trunk/sl_equ.inc
0,0 → 1,98
; Copyright (c) 2008-2009, <Lrz>
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are met:
; * Redistributions of source code must retain the above copyright
; notice, this list of conditions and the following disclaimer.
; * Redistributions in binary form must reproduce the above copyright
; notice, this list of conditions and the following disclaimer in the
; documentation and/or other materials provided with the distribution.
; * Neither the name of the <organization> nor the
; names of its contributors may be used to endorse or promote products
; derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka <Lrz> ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;*****************************************************************************
; Ïðåäîïðåäåëåíèÿ
DEBUG equ 1 ;êîìïèëÿöèÿ ñ îòëàäî÷íîé èíôîðìàöèåé =1 áåç îòëàäî÷íîé èíôîðàöèè =0
loop_read_startos_file equ 3 ;êîë-âî ïîïûòîê ñ÷èòàòü ÷åðåç callback ñåðâèñ ôàéë êîíôèãóðàöèè áëîê2
root_dir_entry_count equ 224 ;êîë-âî ýëåìåíòîâ â êîðíåâîé äèððåêòîðèè
;point_to_fat_struc equ 0xA000 ;âðåìåííûé áóôåð, êóäà áóäåò ðàçìåùåíà Fat òàáëèöà, è çàòåì ïåðåíåñåíà çà 1 ìá
ini_data_ equ 0x2000 ;ôàéë ãäå ðàçìåùåí ôàéë ñöåíàðèÿ çàãðóçêè, òàì ïðîèñõîäèò ñèíòàêñè÷åñêèé ðàçáîð
size_show_section equ 18
default_timeout_value equ 5 ;default value to timeout is will was some errors
flag_found_default equ 0x1 ;default value is found
flag_found_timeout equ 0x2 ;timeout value is found
flag_found_LM equ 0x1 ;found LM value
flag_found_RS equ 0x2 ;found RS value
flag_found_GTRFMS equ 0x4 ;found type RamFS
flag_found_RamdiskSector equ 0x8 ;found RamdiskSector
flag_found_RamdiskCluster equ 0x16 ;found RamdiskCluster
;statick data ýòè äàííûå íå ïðåäîïðåäåëÿþòñÿ â òå÷åíèè âûïîëíåíèÿ âñåé ïðîãðàììû.
save_cx equ word [bp-2] ;save cx size ini file
ret_on_ch equ word [bp-4] ;point to return ðàçðóøàåìîå çíà÷åíèå
save_cx_d equ word [bp-6] ;save cx - size default section and working section
status_flag equ word [bp-8] ;status flag
point_loader equ word [bp-10]
point_default equ word [bp-12] ;point to default
 
;äàííûå êîòîðûå çàâèñèìû îò âåòêè âûïîëíåíèÿ è êîòîðûå ìîãóò áûòü ïåðåîïðåäåëåíû â ïðîöåññå âûïîëíåíèÿ ïðîãðàììû.
point_to_hframe equ word [bp-14] ;point on start frame (for change section)
point_to_1 equ word [bp-16]
point_to_2 equ word [bp-18]
point_to_3 equ word [bp-20]
point_to_4 equ word [bp-22]
point_to_5 equ word [bp-24]
point_to_6 equ word [bp-26]
point_to_7 equ word [bp-28]
point_to_8 equ word [bp-30]
point_to_9 equ word [bp-32]
point_to_10 equ word [bp-34]
point_to_11 equ word [bp-36]
point_to_12 equ word [bp-38]
point_to_13 equ word [bp-40]
point_to_14 equ word [bp-42]
point_to_15 equ word [bp-44]
point_to_16 equ word [bp-46]
point_to_16 equ word [bp-48]
point_to_17 equ word [bp-50]
point_to_18 equ word [bp-52]
;here array for fast scroling 16 word - poin to start section
point_to_point_def equ word [bp-54]
point_to_eframe equ word [bp-56] ;point on point frame
 
 
 
; òóò ðàñïîëîæåíî âðåìåííîå õðàíèëèùå äëÿ cx è di ïðè ïåðåõîäå íà ñëåäóþùèé áóôåð ïðè ïîèñêå ñåêöèé
find_sec_di equ word [bp-58] ;òóò áóäåò õðàíèòüñÿ di
info_real_mode_size equ word [bp-60];òóò õðàíèòüñÿ èíôîðìàöèÿ î çàíÿòîé îáëàñòè ò.å. ðàçìåð, ìîæíî óçíàòü ñêîëüêî îñòàëîñü ìåñòà âû÷èñëèâ
free_ad_memory equ word [bp-62] ;ñêîëüêî ó íàñ ðàñøèðåííîé ïàìÿòè äëÿ ôîðìèðîâàíèÿ ðàì äèñêà è çàãðóçêè ìîäóëåé
show_errors_sect equ word [bp-64] ;ïåðåìåíàÿ êîòîðàÿ õðàíèò áèòû îøèáîê äëÿ êàæäîé ëîãè÷åñêîé ñåêöèè.
save_descript_size equ word [bp-66] ;save descript size previos section ñîõðàíèì ðàçìåð ïðåäûäóùåé ñåêöèè êîòîðóþ âûâîäèëè
save_ramdisksize equ dword [bp-70] ;save size of ramdisk in byte
save_file_size equ dword [bp-74] ;save size of reading file
set_ramfs equ word [bp-76] ;îïðåäåëåííûé òèï ôàéëîâîé ñèñòåìû,íóæíî äëÿ ôîðìèðîâàíèÿ ðàì äèñêà
point_next_fat_str equ word [bp-78] ;óêàçàòåëü íà ñëåäóþùèé ýëåìåíò fat òàáëèöû
size_root_dir equ word [bp-80] ;êîë-âî ýëåìåíòîâ â ñåêòîðàõ ïî 512 áàéò êîðíåâîé äèðåêòîðèè
firstDataSect equ word [bp-82] ;ïåðâûé ñåêòîð äàííûõ â ñåòîðàõ îò 0
DataClasters equ word [bp-84] ;ðàçìåð ìàññèâà äîñòóïíîé äëÿ çàïèñè äàííûõ â êëàñòåðàõ.
point_to_free_root equ word [bp-86] ;óêàçàòåëü íà ñëåäóþùèé ïóñòóþ çàïèñü â ðóò äèð
point_to_dest_file_name equ word [bp-88] ;óêàçûâàåò íà íà÷àëî èìåíè ôàéëà íàçíà÷åíèÿ.
data_offset equ word [bp-90] ;ñìåùåíèå â êëàñòåðàõ äëÿ çàïèñàííûõ äàííûõ ò.å ïåðåêèíóòûõ çà 1-é ìá
first_input equ word [bp-92] ;ïîëå äëÿ ôëàãîâ â ïðåîáðàçîâàíèè èìåíè.
save_di_RAMDISK equ word [bp-94] ;ñîõðàíèì di -óêàçàòåëÿ ïðè îáðàáîòêå ñåêöèè
save_cx_RAMDISK equ word [bp-96] ;ñîõðàíèì ðàçìåð îñòàòêà ñåêöèè
status_flag_loader_f equ word [bp-98] ;ñîõðàíèì ðåçóëüòàò âûïîëåíåíèÿ çàãðóçêè ôàéëà
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;äàííûå êîòîðûå èñïîëüçóþòñÿ ïðè îáðàáîòêå ñåêöèè, ò.å. ïîñëå íàæàòèÿ Enter, óæå íå âîçìîæíî âåðíóòüñÿ â ïåðâîíà÷àëüíûé ýêðàí
;äëÿ âîçâðàòà, íåîáõîäèìî ïåðåçàïóñòèòü ïîëíîñòüþ êîä ò.å. ñòàðòîâàòü ñ 0õ1000:0000