diff --git a/kernel/trunk/sec_loader/trunk/boot/build.bat b/kernel/trunk/sec_loader/trunk/boot/build.bat index 00039e5053..24948f9fea 100644 --- a/kernel/trunk/sec_loader/trunk/boot/build.bat +++ b/kernel/trunk/sec_loader/trunk/boot/build.bat @@ -13,4 +13,8 @@ echo ============================== 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 diff --git a/kernel/trunk/sec_loader/trunk/boot/floppy.asc b/kernel/trunk/sec_loader/trunk/boot/floppy.asc new file mode 100644 index 0000000000..7d2ba1bfd7 --- /dev/null +++ b/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-$ \ No newline at end of file diff --git a/kernel/trunk/sec_loader/trunk/boot/mkfloppy.inc b/kernel/trunk/sec_loader/trunk/boot/mkfloppy.inc new file mode 100644 index 0000000000..1f21abab4b --- /dev/null +++ b/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 \ No newline at end of file diff --git a/kernel/trunk/sec_loader/trunk/boot_st.inc b/kernel/trunk/sec_loader/trunk/boot_st.inc index f6fcef8ec6..3abf541a0e 100644 --- a/kernel/trunk/sec_loader/trunk/boot_st.inc +++ b/kernel/trunk/sec_loader/trunk/boot_st.inc @@ -31,14 +31,14 @@ ;====================================================================== -version db 'Secondary Loader v 0.009',0 +version db 'Secondary Loader v 0.010',0 version_end: select_section db 'Select section:' 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 @@ load_ini db '>Ini file loaded successfully',0 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: diff --git a/kernel/trunk/sec_loader/trunk/debug_msg.inc b/kernel/trunk/sec_loader/trunk/debug_msg.inc index 7eb621ab4c..16d92d5330 100644 --- a/kernel/trunk/sec_loader/trunk/debug_msg.inc +++ b/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 @@ _not_found db '[ not found',0 _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 diff --git a/kernel/trunk/sec_loader/trunk/listing.inc b/kernel/trunk/sec_loader/trunk/listing.inc new file mode 100644 index 0000000000..4ef5f8eebd --- /dev/null +++ b/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 diff --git a/kernel/trunk/sec_loader/trunk/loader.asm b/kernel/trunk/sec_loader/trunk/loader.asm index 3e0ed4db46..631f3fcafb 100644 --- a/kernel/trunk/sec_loader/trunk/loader.asm +++ b/kernel/trunk/sec_loader/trunk/loader.asm @@ -1,4 +1,4 @@ -; Copyright (c) 2009, +; Copyright (c) 2008-2009, ; 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 ''AS IS'' AND ANY +; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname ''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 BE LIABLE FOR ANY @@ -25,103 +25,29 @@ ;***************************************************************************** ;start of the project 13.02.2008 year. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Secondary Loader copyright Alexey Teplov aka & K Soft team +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Secondary Loader copyright Alexey Teplov nickname ;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' 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 @@ start: 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,19 +154,64 @@ cpugood: ; 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 +;SET DEFAULT Not use ini file +error_ini: + mov si, error_ini_f1 ;Error: cannot load ini file, buffer is full + dec bx + jz err_show_ini + mov si, error_ini_f2 ;Error: ini file not found + dec bx + jz err_show_ini + mov si, error_ini_f3 ;Error: cannot read ini file + dec bx + jz err_show_ini + + mov si, error_ini_nf ;Error: unrecognized error when loading ini file +err_show_ini: + call printplain + mov si, error_ini_common + call printplain +; wait for keypress + xor ax,ax + int 16h + +ini_loaded: + + jmp $ + +align 4 +check_conf_file: ;Check config file in current dir push ax ;save size file if DEBUG @@ -250,46 +233,18 @@ 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 - dec bx - jz err_show_ini - mov si, error_ini_f2 ;Error: ini file not found - dec bx - jz err_show_ini - mov si, error_ini_f3 ;Error: cannot read ini file - dec bx - jz err_show_ini - - mov si, error_ini_nf ;Error: unrecognized error when loading ini file -err_show_ini: - call printplain - mov si, error_ini_common - call printplain -; wait for keypress - mov ah, 0 - int 16h - -ini_loaded: - - jmp $ - - - - ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;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 @@ table_15_87: 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,33 +282,33 @@ fat12_buffer: ;структура для дирректории 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 ? } ;Тут будут распологатсья данные, которые затруднительно распологать в стековой области.... ;;; ;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 diff --git a/kernel/trunk/sec_loader/trunk/parse.inc b/kernel/trunk/sec_loader/trunk/parse.inc index 035ba30d7a..595c1f3e77 100644 --- a/kernel/trunk/sec_loader/trunk/parse.inc +++ b/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 ''AS IS'' AND ANY +; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname ''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 BE LIABLE FOR ANY @@ -36,47 +36,47 @@ macro use_parse 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 ;парсинг выбраной или дефолтной секции т.е. разбор параметров выполнение сценария diff --git a/kernel/trunk/sec_loader/trunk/parse_any.inc b/kernel/trunk/sec_loader/trunk/parse_any.inc index ce5534da2f..1ae93fb833 100644 --- a/kernel/trunk/sec_loader/trunk/parse_any.inc +++ b/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 @@ macro use_any_sec 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 @@ if DEBUG 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 @@ end if ;процедура формирования буфера для скролинга секций ;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 @@ clear_timer_msg ; тут мы будем парсить только дефолтную секцию и выполнять ее ничего не предлагая пользователю из диалогов. .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,63 +287,63 @@ macro show_bl_sc ;;;;;;;;;;;;;;; ;очистим экран и выведем меню ; draw frames - xor ax,ax + xor ax,ax if DEBUG - mov ax,0x0720 + mov ax,0x0720 end if push 0xb800 pop es 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 @@ macro show_timer_message ;;;;;;;;;;;;;;;;;;;;; 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,144 +411,144 @@ macro show_timer_message 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 } 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 .rest_value_loop_sh_d 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 @@ local .show_mess_prev_eq 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: } \ No newline at end of file diff --git a/kernel/trunk/sec_loader/trunk/parse_dat.inc b/kernel/trunk/sec_loader/trunk/parse_dat.inc index 2d7e4e1f1a..8279f25173 100644 --- a/kernel/trunk/sec_loader/trunk/parse_dat.inc +++ b/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 ''AS IS'' AND ANY +; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname ''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 BE LIABLE FOR ANY @@ -29,11 +29,11 @@ parse_loader db '[loader]' 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 db 'RamdiskSize' 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: diff --git a/kernel/trunk/sec_loader/trunk/parse_def_sect.inc b/kernel/trunk/sec_loader/trunk/parse_def_sect.inc index 895a1fe2c2..2a985a670f 100644 --- a/kernel/trunk/sec_loader/trunk/parse_def_sect.inc +++ b/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 ''AS IS'' AND ANY +; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname ''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 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 @@ macro use_LoaderModule { 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 @@ local .found_end_str 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,69 +122,67 @@ local .found_end_str ;это выглядит так: в 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] 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 @@ macro use_RamdiskFS { 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_get_RS_ERROR_2 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 @@ local ._end_parse_RS 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 @@ if DEBUG 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 @@ end if } 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 show_ERRORS 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 @@ macro get_type_FS ; 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 @@ macro get_type_FS ; 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 @@ if DEBUG 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 .fat12 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 @@ use_RamdiskCluster ; ;} ;===================================== ;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 @@ use_RamdiskCluster ; .fat12: ;fat12 -;Для FAT12 и FAT16 дисков это поле содержит количество секторов, а BPB_TotSec32 равно 0, если значение <умещается> (меньше 0x10000). - mov set_ramfs,12 ;установим тип файловой системы - movzx ebx,byte [fat12_buffer.BPB_SecPerClus] - imul eax,ebx +if DEBUG +; выведем в отладке, что собираемся делать образ диска c FS=fat12 + pushad + mov si,start_making_FAT12_msg + call printplain + popad +end if - cmp eax,0x10000 - jae @f - mov word [fat12_buffer.BPB_TotSec16],ax - mov dword [fat12_buffer.BPB_TotSec32],0 + + +;Для FAT12 и FAT16 дисков это поле содержит количество секторов, а BPB_TotSec32 равно 0, если значение <умещается> (меньше 0x10000). + 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 @@: ;количество секторов занимаемое одной копией фат -; 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_BPB_RAM 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 @@ end if 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 @@ macro use_RamdiskSector 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 @@ if DEBUG 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 @@ macro use_RamdiskCluster 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 .exit 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 @@ local .found_end_str 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 @@ local .found_end_str ;это выглядит так: в 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 @@ local .found_end_str - 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 @@ macro use_RamdiskFile ;загрузка файлов с использование 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 @@ local .error 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 @@ local .error ;//проверка наличия такого же имени в рут дир -@@: 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 @@ check_name_file 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 @@ end if ; загрузим чему у нас равен кластер -; 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 @@ register_file_in_fat 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 @@ move_file_up @@: ;тут организован цикл по загрузке файлов в корневую директорию - 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 @@ move_up_fat_and_root_d ;загрузка блока -; 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 @@ move_up_fat_and_root_d 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,42 +1307,42 @@ macro first_create_fat_table ;данный макрос создает оформляет 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 ;Show size mov si,fat_create_msg call printplain - popa + popad end if } @@ -1339,157 +1351,157 @@ macro register_file_in_fat ;пока поддерживается только фат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 @@ END IF - add point_to_free_root,32 ;увелицим смещение до следующего значения. - pop es + add point_to_free_root,32 ;увелицим смещение до следующего значения. + pop es } @@ -1510,30 +1522,30 @@ macro get_firstDataSector ;макрос для вычисления певого сектора данных т.е. данных файлов в фате ;вычислим 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 @@ if DEBUG 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,14 +1561,14 @@ if DEBUG mov si,size_root_dir_msg call printplain ;;;;;;;;;;;;;;;;;;;;;;;;;; - mov ax,DataClasters ;кластеры + mov ax,DataClasters ;кластеры mov cx,0x0a mov di,DataClasters_msg call decode ;Show size mov si,DataClasters_msg call printplain - popa + popad end if @@ -1579,75 +1591,94 @@ macro check_name_file ;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 ;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 @@ end if 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 @@ if DEBUG 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,72 +1829,72 @@ end if 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 ;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 @@ end if ;корректировка значения должна быть выполенена на размер кластера .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,15 +1930,15 @@ end if 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 ;Show size mov si,return_code_af_move call printplain - popa + popa end if @@ -1918,29 +1950,29 @@ macro move_up_fat_and_root_d { 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,15 +1983,15 @@ local .st1 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 ;Show size mov si,return_code_af_fat_m call printplain - popa + popa end if diff --git a/kernel/trunk/sec_loader/trunk/parse_loader.inc b/kernel/trunk/sec_loader/trunk/parse_loader.inc index 2fed81312a..ed229d9d98 100644 --- a/kernel/trunk/sec_loader/trunk/parse_loader.inc +++ b/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 ''AS IS'' AND ANY +; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname ''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 BE LIABLE FOR ANY diff --git a/kernel/trunk/sec_loader/trunk/sl_equ.inc b/kernel/trunk/sec_loader/trunk/sl_equ.inc new file mode 100644 index 0000000000..311700815b --- /dev/null +++ b/kernel/trunk/sec_loader/trunk/sl_equ.inc @@ -0,0 +1,98 @@ +; Copyright (c) 2008-2009, +; 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 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 ''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 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