Diskuze: Zápis souborového systému na disk


Ahoj,
mohl bys to trochu rozvést? V jakém formátu ty ovladače toho souborového systému máš? A problém máš tedy s formátováním svazku (oddílu) tím tvým systémem? Nebo je ti jinak?
U Windows je to tak, že pokud u nějakého diskového oddílu nerozpoznají souborový systém, tak se ten oddíl namountuje se souborovým systémem RAW, který dovoluje zápis a čtení sektorů. Namountovat by se to mělo normálně pod písmenem jako jiné svazky. Pak by stačilo přímým přístupem k tomu oddílu provést formátování (Windows API funkce CreateFile, WriteFile a CloseHandle).
Bohužel jsem vlastní souborový systém nikdy nepsal a ani se nesnažil manuálně integrovat do Windows (ani jiného OS), takže tady asi nepomůžu.
Na Unixu (pokud to není věc pouze Linuxu, v těchto OSech se prakticky neorientuju) by ten zápis mohl jít řešit zápisem do souboru /dev/sdaX či /dev/hdaX (X je přirozené číslo), které reprezentují zařízení pevných disků (asi budou existovat i soubory reprezentující jednotlivé diskové oddíly). Pak by asi stačilo použít standardní Cčkové funkce (fopen, fseek, fwrite, fclose) na provedení formátování.
Pokud to chceš formátovat v rámci kernel driveru, tak asi bude třeba posílat příslušnému diskovému zařízení požadavky na zápis na dané adresy. Ale tady vůbec nevím, jak to funguje. Vím, jak to funguje na Windows a myslím si, že to na jiných operačních systémech bude implementováno podobným způsobem.
Přes přerušení se, pokud vím, přistupovalo k disku (a k jiným službám) v operačním systému MS-DOS (přerušení 13h pro disk). Nemyslím, že by tento způsob byl přenositelný na *NIX. Tedy, pokud chceš formátovat z usermodu (třeba přes ty standardní funkce), tak to možná přes přerušení bude realizováno, protože bude docházet k systémovým voláním (na Linuxu snad ještě pořád přerušení 50h, nebo nějaké speciální instrukce typu SYSTENTER či SYSCALL).
Kit:14.6.2013 13:51
Zkus nějakou databázi, například SQLite, na kterou se připojíš přes FUSE.


Domiy:14.6.2013 14:13
Jak mi pomůže databáze? Chci jen vytvořit tabulku přerušení, asi 10 souborů pro správu identifikace, přístupu atd. A pak dynamický prostor pro systémové funkce, které budou mít data přerušení v té tabulce, co bude v prvním sektoru. Pak budu moci přerušovat jako v Unixu do kernelu - zde do funkcí... (Do BIOSu dám jen most.) To znamená, že vše jsou vlastně soubory + adresa HDD paměti pro normální soubory a složky... (Jejich adresy již budou spravovány v několika z těch cca 10 souborů.) Přistupovat k těm 10ti souborům by bylo nejpohodlnější zase přes nějaké přerušení... (Spravující spustitelné soubory by byly v té dynamické paměti s polu s dalšími funkcemi jako TTY výpis (Mnohem prorpacovanější, než "10h AH = 09h".) atp.)


Domiy:14.6.2013 15:12
Tak jsem disassembleroval FAT32 a dostal:
00000000 EB58 jmp short 0x5a
00000002 90 nop
00000003 46 inc si
00000004 52 push dx
00000005 44 inc sp
00000006 4F dec di
00000007 53 push bx
00000008 352E31 xor ax,0x312e
0000000B 0002 add [bp+si],al
0000000D 0820 or [bx+si],ah
0000000F 0002 add [bp+si],al
00000011 0000 add [bx+si],al
00000013 0000 add [bx+si],al
00000015 F8 clc
00000016 0000 add [bx+si],al
00000018 3F aas
00000019 0012 add [bp+si],dl
0000001B 002C add [si],ch
0000001D C7 db 0xc7
0000001E A800 test al,0x0
00000020 BCFA63 mov sp,0x63fa
00000023 00F3 add bl,dh
00000025 1800 sbb [bx+si],al
00000027 0000 add [bx+si],al
00000029 0000 add [bx+si],al
0000002B 0002 add [bp+si],al
0000002D 0000 add [bx+si],al
0000002F 0001 add [bx+di],al
00000031 00060000 add [0x0],al
00000035 0000 add [bx+si],al
00000037 0000 add [bx+si],al
00000039 0000 add [bx+si],al
0000003B 0000 add [bx+si],al
0000003D 0000 add [bx+si],al
0000003F 00800029 add [bx+si+0x2900],al
00000043 FB sti
00000044 0B4837 or cx,[bx+si+0x37]
00000047 46 inc si
00000048 52 push dx
00000049 45 inc bp
0000004A 45 inc bp
0000004B 44 inc sp
0000004C 4F dec di
0000004D 53 push bx
0000004E 3230 xor dh,[bx+si]
00000050 3132 xor [bp+si],si
00000052 46 inc si
00000053 41 inc cx
00000054 54 push sp
00000055 3332 xor si,[bp+si]
00000057 2020 and [bx+si],ah
00000059 20FC and ah,bh
0000005B FA cli
0000005C 29C0 sub ax,ax
0000005E 8ED8 mov ds,ax
00000060 BD007C mov bp,0x7c00
00000063 B8E01F mov ax,0x1fe0
00000066 8EC0 mov es,ax
00000068 89EE mov si,bp
0000006A 89EF mov di,bp
0000006C B90001 mov cx,0x100
0000006F F3A5 rep movsw
00000071 EA7A7CE01F jmp word 0x1fe0:0x7c7a
00000076 0000 add [bx+si],al
00000078 60 pushaw
00000079 008ED88E add [bp-0x7128],cl
0000007D D08D66E0 ror byte [di-0x1f9a],1
00000081 FB sti
00000082 885640 mov [bp+0x40],dl
00000085 BEC17D mov si,0x7dc1
00000088 E8F400 call word 0x17f
0000008B 6631C0 xor eax,eax
0000008E 66894644 mov [bp+0x44],eax
00000092 8B460E mov ax,[bp+0xe]
00000095 6603461C add eax,[bp+0x1c]
00000099 66894648 mov [bp+0x48],eax
0000009D 6689464C mov [bp+0x4c],eax
000000A1 668B4610 mov eax,[bp+0x10]
000000A5 66F76E24 imul dword [bp+0x24]
000000A9 6601464C add [bp+0x4c],eax
000000AD B80002 mov ax,0x200
000000B0 3B460B cmp ax,[bp+0xb]
000000B3 7408 jz 0xbd
000000B5 01C0 add ax,ax
000000B7 FF06347D inc word [0x7d34]
000000BB EBF3 jmp short 0xb0
000000BD 668B462C mov eax,[bp+0x2c]
000000C1 6650 push eax
000000C3 E89400 call word 0x15a
000000C6 724D jc 0x115
000000C8 C45E76 les bx,[bp+0x76]
000000CB E8B700 call word 0x185
000000CE 31FF xor di,di
000000D0 B90B00 mov cx,0xb
000000D3 BEF17D mov si,0x7df1
000000D6 F3A6 repe cmpsb
000000D8 7415 jz 0xef
000000DA 83C720 add di,byte +0x20
000000DD 83E7E0 and di,byte -0x20
000000E0 3B7E0B cmp di,[bp+0xb]
000000E3 75EB jnz 0xd0
000000E5 4A dec dx
000000E6 75E0 jnz 0xc8
000000E8 6658 pop eax
000000EA E83400 call word 0x121
000000ED EBD2 jmp short 0xc1
000000EF 26FF7509 push word [es:di+0x9]
000000F3 26FF750F push word [es:di+0xf]
000000F7 6658 pop eax
000000F9 29DB sub bx,bx
000000FB 6650 push eax
000000FD E85A00 call word 0x15a
00000100 720D jc 0x10f
00000102 E88000 call word 0x185
00000105 4A dec dx
00000106 75FA jnz 0x102
00000108 6658 pop eax
0000010A E81400 call word 0x121
0000010D EBEC jmp short 0xfb
0000010F 8A5E40 mov bl,[bp+0x40]
00000112 FF6E76 jmp word far [bp+0x76]
00000115 BEEE7D mov si,0x7dee
00000118 E86400 call word 0x17f
0000011B 30E4 xor ah,ah
0000011D CD16 int 0x16
0000011F CD19 int 0x19
00000121 06 push es
00000122 57 push di
00000123 53 push bx
00000124 89C7 mov di,ax
00000126 C1E702 shl di,0x2
00000129 50 push ax
0000012A 8B460B mov ax,[bp+0xb]
0000012D 48 dec ax
0000012E 21C7 and di,ax
00000130 58 pop ax
00000131 66C1E807 shr eax,0x7
00000135 66034648 add eax,[bp+0x48]
00000139 BB0020 mov bx,0x2000
0000013C 8EC3 mov es,bx
0000013E 29DB sub bx,bx
00000140 663B4644 cmp eax,[bp+0x44]
00000144 7407 jz 0x14d
00000146 66894644 mov [bp+0x44],eax
0000014A E83800 call word 0x185
0000014D 268065030F and byte [es:di+0x3],0xf
00000152 26668B05 mov eax,[es:di]
00000156 5B pop bx
00000157 5F pop di
00000158 07 pop es
00000159 C3 ret
0000015A 663DF8FFFF0F cmp eax,0xffffff8
00000160 7315 jnc 0x177
00000162 6648 dec eax
00000164 6648 dec eax
00000166 660FB6560D movzx edx,byte [bp+0xd]
0000016B 6652 push edx
0000016D 66F7E2 mul edx
00000170 665A pop edx
00000172 6603464C add eax,[bp+0x4c]
00000176 C3 ret
00000177 F9 stc
00000178 C3 ret
00000179 31DB xor bx,bx
0000017B B40E mov ah,0xe
0000017D CD10 int 0x10
0000017F AC lodsb
00000180 3C00 cmp al,0x0
00000182 75F5 jnz 0x179
00000184 C3 ret
00000185 52 push dx
00000186 56 push si
00000187 57 push di
00000188 6650 push eax
0000018A 89E7 mov di,sp
0000018C 6A00 push byte +0x0
0000018E 6A00 push byte +0x0
00000190 6650 push eax
00000192 06 push es
00000193 53 push bx
00000194 6A01 push byte +0x1
00000196 6A10 push byte +0x10
00000198 89E6 mov si,sp
0000019A 8A5640 mov dl,[bp+0x40]
0000019D B442 mov ah,0x42
0000019F CD13 int 0x13
000001A1 89FC mov sp,di
000001A3 6658 pop eax
000001A5 7308 jnc 0x1af
000001A7 50 push ax
000001A8 30E4 xor ah,ah
000001AA CD13 int 0x13
000001AC 58 pop ax
000001AD EBD9 jmp short 0x188
000001AF 6640 inc eax
000001B1 035E0B add bx,[bp+0xb]
000001B4 7307 jnc 0x1bd
000001B6 8CC2 mov dx,es
000001B8 80C610 add dh,0x10
000001BB 8EC2 mov es,dx
000001BD 5F pop di
000001BE 5E pop si
000001BF 5A pop dx
000001C0 C3 ret
000001C1 4C dec sp
000001C2 6F outsw
000001C3 61 popaw
000001C4 64696E672046 imul bp,[fs:bp+0x67],word 0x4620
000001CA 7265 jc 0x231
000001CC 6544 gs inc sp
000001CE 4F dec di
000001CF 53 push bx
000001D0 2000 and [bx+si],al
000001D2 0000 add [bx+si],al
000001D4 0000 add [bx+si],al
000001D6 0000 add [bx+si],al
000001D8 0000 add [bx+si],al
000001DA 0000 add [bx+si],al
000001DC 0000 add [bx+si],al
000001DE 0000 add [bx+si],al
000001E0 0000 add [bx+si],al
000001E2 0000 add [bx+si],al
000001E4 0000 add [bx+si],al
000001E6 0000 add [bx+si],al
000001E8 0000 add [bx+si],al
000001EA 0000 add [bx+si],al
000001EC 0000 add [bx+si],al
000001EE 4E dec si
000001EF 6F outsw
000001F0 204B45 and [bp+di+0x45],cl
000001F3 52 push dx
000001F4 4E dec si
000001F5 45 inc bp
000001F6 4C dec sp
000001F7 2020 and [bx+si],ah
000001F9 53 push bx
000001FA 59 pop cx
000001FB 53 push bx
000001FC 0000 add [bx+si],al
000001FE 55 push bp
000001FF AA stosb
00000200 52 push dx
00000201 52 push dx
00000202 61 popaw
00000203 41 inc cx
00000204 0000 add [bx+si],al
00000206 0000 add [bx+si],al
00000208 0000 add [bx+si],al
0000020A 0000 add [bx+si],al
0000020C 0000 add [bx+si],al
0000020E 0000 add [bx+si],al
00000210 0000 add [bx+si],al
00000212 0000 add [bx+si],al
00000214 0000 add [bx+si],al
00000216 0000 add [bx+si],al
00000218 0000 add [bx+si],al
0000021A 0000 add [bx+si],al
0000021C 0000 add [bx+si],al
0000021E 0000 add [bx+si],al
00000220 0000 add [bx+si],al
00000222 0000 add [bx+si],al
00000224 0000 add [bx+si],al
00000226 0000 add [bx+si],al
00000228 0000 add [bx+si],al
0000022A 0000 add [bx+si],al
0000022C 0000 add [bx+si],al
0000022E 0000 add [bx+si],al
00000230 0000 add [bx+si],al
00000232 0000 add [bx+si],al
00000234 0000 add [bx+si],al
00000236 0000 add [bx+si],al
00000238 0000 add [bx+si],al
0000023A 0000 add [bx+si],al
0000023C 0000 add [bx+si],al
0000023E 0000 add [bx+si],al
00000240 0000 add [bx+si],al
00000242 0000 add [bx+si],al
00000244 0000 add [bx+si],al
00000246 0000 add [bx+si],al
00000248 0000 add [bx+si],al
0000024A 0000 add [bx+si],al
0000024C 0000 add [bx+si],al
0000024E 0000 add [bx+si],al
00000250 0000 add [bx+si],al
00000252 0000 add [bx+si],al
00000254 0000 add [bx+si],al
00000256 0000 add [bx+si],al
00000258 0000 add [bx+si],al
0000025A 0000 add [bx+si],al
0000025C 0000 add [bx+si],al
0000025E 0000 add [bx+si],al
00000260 0000 add [bx+si],al
00000262 0000 add [bx+si],al
00000264 0000 add [bx+si],al
00000266 0000 add [bx+si],al
00000268 0000 add [bx+si],al
0000026A 0000 add [bx+si],al
0000026C 0000 add [bx+si],al
0000026E 0000 add [bx+si],al
00000270 0000 add [bx+si],al
00000272 0000 add [bx+si],al
00000274 0000 add [bx+si],al
00000276 0000 add [bx+si],al
00000278 0000 add [bx+si],al
0000027A 0000 add [bx+si],al
0000027C 0000 add [bx+si],al
0000027E 0000 add [bx+si],al
00000280 0000 add [bx+si],al
00000282 0000 add [bx+si],al
00000284 0000 add [bx+si],al
00000286 0000 add [bx+si],al
00000288 0000 add [bx+si],al
0000028A 0000 add [bx+si],al
0000028C 0000 add [bx+si],al
0000028E 0000 add [bx+si],al
00000290 0000 add [bx+si],al
00000292 0000 add [bx+si],al
00000294 0000 add [bx+si],al
00000296 0000 add [bx+si],al
00000298 0000 add [bx+si],al
0000029A 0000 add [bx+si],al
0000029C 0000 add [bx+si],al
0000029E 0000 add [bx+si],al
000002A0 0000 add [bx+si],al
000002A2 0000 add [bx+si],al
000002A4 0000 add [bx+si],al
000002A6 0000 add [bx+si],al
000002A8 0000 add [bx+si],al
000002AA 0000 add [bx+si],al
000002AC 0000 add [bx+si],al
000002AE 0000 add [bx+si],al
000002B0 0000 add [bx+si],al
000002B2 0000 add [bx+si],al
000002B4 0000 add [bx+si],al
000002B6 0000 add [bx+si],al
000002B8 0000 add [bx+si],al
000002BA 0000 add [bx+si],al
000002BC 0000 add [bx+si],al
000002BE 0000 add [bx+si],al
000002C0 0000 add [bx+si],al
000002C2 0000 add [bx+si],al
000002C4 0000 add [bx+si],al
000002C6 0000 add [bx+si],al
000002C8 0000 add [bx+si],al
000002CA 0000 add [bx+si],al
000002CC 0000 add [bx+si],al
000002CE 0000 add [bx+si],al
000002D0 0000 add [bx+si],al
000002D2 0000 add [bx+si],al
000002D4 0000 add [bx+si],al
000002D6 0000 add [bx+si],al
000002D8 0000 add [bx+si],al
000002DA 0000 add [bx+si],al
000002DC 0000 add [bx+si],al
000002DE 0000 add [bx+si],al
000002E0 0000 add [bx+si],al
000002E2 0000 add [bx+si],al
000002E4 0000 add [bx+si],al
000002E6 0000 add [bx+si],al
000002E8 0000 add [bx+si],al
000002EA 0000 add [bx+si],al
000002EC 0000 add [bx+si],al
000002EE 0000 add [bx+si],al
000002F0 0000 add [bx+si],al
000002F2 0000 add [bx+si],al
000002F4 0000 add [bx+si],al
000002F6 0000 add [bx+si],al
000002F8 0000 add [bx+si],al
000002FA 0000 add [bx+si],al
000002FC 0000 add [bx+si],al
000002FE 0000 add [bx+si],al
00000300 0000 add [bx+si],al
00000302 0000 add [bx+si],al
00000304 0000 add [bx+si],al
00000306 0000 add [bx+si],al
00000308 0000 add [bx+si],al
0000030A 0000 add [bx+si],al
0000030C 0000 add [bx+si],al
0000030E 0000 add [bx+si],al
00000310 0000 add [bx+si],al
00000312 0000 add [bx+si],al
00000314 0000 add [bx+si],al
00000316 0000 add [bx+si],al
00000318 0000 add [bx+si],al
0000031A 0000 add [bx+si],al
0000031C 0000 add [bx+si],al
0000031E 0000 add [bx+si],al
00000320 0000 add [bx+si],al
00000322 0000 add [bx+si],al
00000324 0000 add [bx+si],al
00000326 0000 add [bx+si],al
00000328 0000 add [bx+si],al
0000032A 0000 add [bx+si],al
0000032C 0000 add [bx+si],al
0000032E 0000 add [bx+si],al
00000330 0000 add [bx+si],al
00000332 0000 add [bx+si],al
00000334 0000 add [bx+si],al
00000336 0000 add [bx+si],al
00000338 0000 add [bx+si],al
0000033A 0000 add [bx+si],al
0000033C 0000 add [bx+si],al
0000033E 0000 add [bx+si],al
00000340 0000 add [bx+si],al
00000342 0000 add [bx+si],al
00000344 0000 add [bx+si],al
00000346 0000 add [bx+si],al
00000348 0000 add [bx+si],al
0000034A 0000 add [bx+si],al
0000034C 0000 add [bx+si],al
0000034E 0000 add [bx+si],al
00000350 0000 add [bx+si],al
00000352 0000 add [bx+si],al
00000354 0000 add [bx+si],al
00000356 0000 add [bx+si],al
00000358 0000 add [bx+si],al
0000035A 0000 add [bx+si],al
0000035C 0000 add [bx+si],al
0000035E 0000 add [bx+si],al
00000360 0000 add [bx+si],al
00000362 0000 add [bx+si],al
00000364 0000 add [bx+si],al
00000366 0000 add [bx+si],al
00000368 0000 add [bx+si],al
0000036A 0000 add [bx+si],al
0000036C 0000 add [bx+si],al
0000036E 0000 add [bx+si],al
00000370 0000 add [bx+si],al
00000372 0000 add [bx+si],al
00000374 0000 add [bx+si],al
00000376 0000 add [bx+si],al
00000378 0000 add [bx+si],al
0000037A 0000 add [bx+si],al
0000037C 0000 add [bx+si],al
0000037E 0000 add [bx+si],al
00000380 0000 add [bx+si],al
00000382 0000 add [bx+si],al
00000384 0000 add [bx+si],al
00000386 0000 add [bx+si],al
00000388 0000 add [bx+si],al
0000038A 0000 add [bx+si],al
0000038C 0000 add [bx+si],al
0000038E 0000 add [bx+si],al
00000390 0000 add [bx+si],al
00000392 0000 add [bx+si],al
00000394 0000 add [bx+si],al
00000396 0000 add [bx+si],al
00000398 0000 add [bx+si],al
0000039A 0000 add [bx+si],al
0000039C 0000 add [bx+si],al
0000039E 0000 add [bx+si],al
000003A0 0000 add [bx+si],al
000003A2 0000 add [bx+si],al
000003A4 0000 add [bx+si],al
000003A6 0000 add [bx+si],al
000003A8 0000 add [bx+si],al
000003AA 0000 add [bx+si],al
000003AC 0000 add [bx+si],al
000003AE 0000 add [bx+si],al
000003B0 0000 add [bx+si],al
000003B2 0000 add [bx+si],al
000003B4 0000 add [bx+si],al
000003B6 0000 add [bx+si],al
000003B8 0000 add [bx+si],al
000003BA 0000 add [bx+si],al
000003BC 0000 add [bx+si],al
000003BE 0000 add [bx+si],al
000003C0 0000 add [bx+si],al
000003C2 0000 add [bx+si],al
000003C4 0000 add [bx+si],al
000003C6 0000 add [bx+si],al
000003C8 0000 add [bx+si],al
000003CA 0000 add [bx+si],al
000003CC 0000 add [bx+si],al
000003CE 0000 add [bx+si],al
000003D0 0000 add [bx+si],al
000003D2 0000 add [bx+si],al
000003D4 0000 add [bx+si],al
000003D6 0000 add [bx+si],al
000003D8 0000 add [bx+si],al
000003DA 0000 add [bx+si],al
000003DC 0000 add [bx+si],al
000003DE 0000 add [bx+si],al
000003E0 0000 add [bx+si],al
000003E2 0000 add [bx+si],al
000003E4 7272 jc 0x458
000003E6 41 inc cx
000003E7 61 popaw
000003E8 AA stosb
000003E9 340C xor al,0xc
000003EB 003B add [bp+di],bh
000003ED 1100 adc [bx+si],ax
000003EF 0000 add [bx+si],al
000003F1 0000 add [bx+si],al
000003F3 0000 add [bx+si],al
000003F5 0000 add [bx+si],al
000003F7 0000 add [bx+si],al
000003F9 0000 add [bx+si],al
000003FB 0000 add [bx+si],al
000003FD 0055AA add [di-0x56],dl
00000400 0000 add [bx+si],al
00000402 0000 add [bx+si],al
00000404 0000 add [bx+si],al
00000406 0000 add [bx+si],al
00000408 0000 add [bx+si],al
0000040A 0000 add [bx+si],al
0000040C 0000 add [bx+si],al
0000040E 0000 add [bx+si],al
00000410 0000 add [bx+si],al
00000412 0000 add [bx+si],al
00000414 0000 add [bx+si],al
00000416 0000 add [bx+si],al
00000418 0000 add [bx+si],al
0000041A 0000 add [bx+si],al
0000041C 0000 add [bx+si],al
0000041E 0000 add [bx+si],al
00000420 0000 add [bx+si],al
00000422 0000 add [bx+si],al
00000424 0000 add [bx+si],al
00000426 0000 add [bx+si],al
00000428 0000 add [bx+si],al
0000042A 0000 add [bx+si],al
0000042C 0000 add [bx+si],al
0000042E 0000 add [bx+si],al
00000430 0000 add [bx+si],al
00000432 0000 add [bx+si],al
00000434 0000 add [bx+si],al
00000436 0000 add [bx+si],al
00000438 0000 add [bx+si],al
0000043A 0000 add [bx+si],al
0000043C 0000 add [bx+si],al
0000043E 0000 add [bx+si],al
00000440 0000 add [bx+si],al
00000442 0000 add [bx+si],al
00000444 0000 add [bx+si],al
00000446 0000 add [bx+si],al
00000448 0000 add [bx+si],al
0000044A 0000 add [bx+si],al
0000044C 0000 add [bx+si],al
0000044E 0000 add [bx+si],al
00000450 0000 add [bx+si],al
00000452 0000 add [bx+si],al
00000454 0000 add [bx+si],al
00000456 0000 add [bx+si],al
00000458 0000 add [bx+si],al
0000045A 0000 add [bx+si],al
0000045C 0000 add [bx+si],al
0000045E 0000 add [bx+si],al
00000460 0000 add [bx+si],al
00000462 0000 add [bx+si],al
00000464 0000 add [bx+si],al
00000466 0000 add [bx+si],al
00000468 0000 add [bx+si],al
0000046A 0000 add [bx+si],al
0000046C 0000 add [bx+si],al
0000046E 0000 add [bx+si],al
00000470 0000 add [bx+si],al
00000472 0000 add [bx+si],al
00000474 0000 add [bx+si],al
00000476 0000 add [bx+si],al
00000478 0000 add [bx+si],al
0000047A 0000 add [bx+si],al
0000047C 0000 add [bx+si],al
0000047E 0000 add [bx+si],al
00000480 0000 add [bx+si],al
00000482 0000 add [bx+si],al
00000484 0000 add [bx+si],al
00000486 0000 add [bx+si],al
00000488 0000 add [bx+si],al
0000048A 0000 add [bx+si],al
0000048C 0000 add [bx+si],al
0000048E 0000 add [bx+si],al
00000490 0000 add [bx+si],al
00000492 0000 add [bx+si],al
00000494 0000 add [bx+si],al
00000496 0000 add [bx+si],al
00000498 0000 add [bx+si],al
0000049A 0000 add [bx+si],al
0000049C 0000 add [bx+si],al
0000049E 0000 add [bx+si],al
000004A0 0000 add [bx+si],al
000004A2 0000 add [bx+si],al
000004A4 0000 add [bx+si],al
000004A6 0000 add [bx+si],al
000004A8 0000 add [bx+si],al
000004AA 0000 add [bx+si],al
000004AC 0000 add [bx+si],al
000004AE 0000 add [bx+si],al
000004B0 0000 add [bx+si],al
000004B2 0000 add [bx+si],al
000004B4 0000 add [bx+si],al
000004B6 0000 add [bx+si],al
000004B8 0000 add [bx+si],al
000004BA 0000 add [bx+si],al
000004BC 0000 add [bx+si],al
000004BE 0000 add [bx+si],al
000004C0 0000 add [bx+si],al
000004C2 0000 add [bx+si],al
000004C4 0000 add [bx+si],al
000004C6 0000 add [bx+si],al
000004C8 0000 add [bx+si],al
000004CA 0000 add [bx+si],al
000004CC 0000 add [bx+si],al
000004CE 0000 add [bx+si],al
000004D0 0000 add [bx+si],al
000004D2 0000 add [bx+si],al
000004D4 0000 add [bx+si],al
000004D6 0000 add [bx+si],al
000004D8 0000 add [bx+si],al
000004DA 0000 add [bx+si],al
000004DC 0000 add [bx+si],al
000004DE 0000 add [bx+si],al
000004E0 0000 add [bx+si],al
000004E2 0000 add [bx+si],al
000004E4 0000 add [bx+si],al
000004E6 0000 add [bx+si],al
000004E8 0000 add [bx+si],al
000004EA 0000 add [bx+si],al
000004EC 0000 add [bx+si],al
000004EE 0000 add [bx+si],al
000004F0 0000 add [bx+si],al
000004F2 0000 add [bx+si],al
000004F4 0000 add [bx+si],al
000004F6 0000 add [bx+si],al
000004F8 0000 add [bx+si],al
000004FA 0000 add [bx+si],al
000004FC 0000 add [bx+si],al
000004FE 0000 add [bx+si],al
00000500 0000 add [bx+si],al
00000502 0000 add [bx+si],al
00000504 0000 add [bx+si],al
00000506 0000 add [bx+si],al
00000508 0000 add [bx+si],al
0000050A 0000 add [bx+si],al
0000050C 0000 add [bx+si],al
0000050E 0000 add [bx+si],al
00000510 0000 add [bx+si],al
00000512 0000 add [bx+si],al
00000514 0000 add [bx+si],al
00000516 0000 add [bx+si],al
00000518 0000 add [bx+si],al
0000051A 0000 add [bx+si],al
0000051C 0000 add [bx+si],al
0000051E 0000 add [bx+si],al
00000520 0000 add [bx+si],al
00000522 0000 add [bx+si],al
00000524 0000 add [bx+si],al
00000526 0000 add [bx+si],al
00000528 0000 add [bx+si],al
0000052A 0000 add [bx+si],al
0000052C 0000 add [bx+si],al
0000052E 0000 add [bx+si],al
00000530 0000 add [bx+si],al
00000532 0000 add [bx+si],al
00000534 0000 add [bx+si],al
00000536 0000 add [bx+si],al
00000538 0000 add [bx+si],al
0000053A 0000 add [bx+si],al
0000053C 0000 add [bx+si],al
0000053E 0000 add [bx+si],al
00000540 0000 add [bx+si],al
00000542 0000 add [bx+si],al
00000544 0000 add [bx+si],al
00000546 0000 add [bx+si],al
00000548 0000 add [bx+si],al
0000054A 0000 add [bx+si],al
0000054C 0000 add [bx+si],al
0000054E 0000 add [bx+si],al
00000550 0000 add [bx+si],al
00000552 0000 add [bx+si],al
00000554 0000 add [bx+si],al
00000556 0000 add [bx+si],al
00000558 0000 add [bx+si],al
0000055A 0000 add [bx+si],al
0000055C 0000 add [bx+si],al
0000055E 0000 add [bx+si],al
00000560 0000 add [bx+si],al
00000562 0000 add [bx+si],al
00000564 0000 add [bx+si],al
00000566 0000 add [bx+si],al
00000568 0000 add [bx+si],al
0000056A 0000 add [bx+si],al
0000056C 0000 add [bx+si],al
0000056E 0000 add [bx+si],al
00000570 0000 add [bx+si],al
00000572 0000 add [bx+si],al
00000574 0000 add [bx+si],al
00000576 0000 add [bx+si],al
00000578 0000 add [bx+si],al
0000057A 0000 add [bx+si],al
0000057C 0000 add [bx+si],al
0000057E 0000 add [bx+si],al
00000580 0000 add [bx+si],al
00000582 0000 add [bx+si],al
00000584 0000 add [bx+si],al
00000586 0000 add [bx+si],al
00000588 0000 add [bx+si],al
0000058A 0000 add [bx+si],al
0000058C 0000 add [bx+si],al
0000058E 0000 add [bx+si],al
00000590 0000 add [bx+si],al
00000592 0000 add [bx+si],al
00000594 0000 add [bx+si],al
00000596 0000 add [bx+si],al
00000598 0000 add [bx+si],al
0000059A 0000 add [bx+si],al
0000059C 0000 add [bx+si],al
0000059E 0000 add [bx+si],al
000005A0 0000 add [bx+si],al
000005A2 0000 add [bx+si],al
000005A4 0000 add [bx+si],al
000005A6 0000 add [bx+si],al
000005A8 0000 add [bx+si],al
000005AA 0000 add [bx+si],al
000005AC 0000 add [bx+si],al
000005AE 0000 add [bx+si],al
000005B0 0000 add [bx+si],al
000005B2 0000 add [bx+si],al
000005B4 0000 add [bx+si],al
000005B6 0000 add [bx+si],al
000005B8 0000 add [bx+si],al
000005BA 0000 add [bx+si],al
000005BC 0000 add [bx+si],al
000005BE 0000 add [bx+si],al
000005C0 0000 add [bx+si],al
000005C2 0000 add [bx+si],al
000005C4 0000 add [bx+si],al
000005C6 0000 add [bx+si],al
000005C8 0000 add [bx+si],al
000005CA 0000 add [bx+si],al
000005CC 0000 add [bx+si],al
000005CE 0000 add [bx+si],al
000005D0 0000 add [bx+si],al
000005D2 0000 add [bx+si],al
000005D4 0000 add [bx+si],al
000005D6 0000 add [bx+si],al
000005D8 0000 add [bx+si],al
000005DA 0000 add [bx+si],al
000005DC 0000 add [bx+si],al
000005DE 0000 add [bx+si],al
000005E0 0000 add [bx+si],al
000005E2 0000 add [bx+si],al
000005E4 0000 add [bx+si],al
000005E6 0000 add [bx+si],al
000005E8 0000 add [bx+si],al
000005EA 0000 add [bx+si],al
000005EC 0000 add [bx+si],al
000005EE 0000 add [bx+si],al
000005F0 0000 add [bx+si],al
000005F2 0000 add [bx+si],al
000005F4 0000 add [bx+si],al
000005F6 0000 add [bx+si],al
000005F8 0000 add [bx+si],al
000005FA 0000 add [bx+si],al
000005FC 0000 add [bx+si],al
000005FE 55 push bp
000005FF AA stosb
00000600 0000 add [bx+si],al
00000602 0000 add [bx+si],al
00000604 0000 add [bx+si],al
00000606 0000 add [bx+si],al
00000608 0000 add [bx+si],al
0000060A 0000 add [bx+si],al
0000060C 0000 add [bx+si],al
0000060E 0000 add [bx+si],al
00000610 0000 add [bx+si],al
00000612 0000 add [bx+si],al
00000614 0000 add [bx+si],al
00000616 0000 add [bx+si],al
00000618 0000 add [bx+si],al
0000061A 0000 add [bx+si],al
0000061C 0000 add [bx+si],al
0000061E 0000 add [bx+si],al
00000620 0000 add [bx+si],al
00000622 0000 add [bx+si],al
00000624 0000 add [bx+si],al
00000626 0000 add [bx+si],al
00000628 0000 add [bx+si],al
0000062A 0000 add [bx+si],al
0000062C 0000 add [bx+si],al
0000062E 0000 add [bx+si],al
00000630 0000 add [bx+si],al
00000632 0000 add [bx+si],al
00000634 0000 add [bx+si],al
00000636 0000 add [bx+si],al
00000638 0000 add [bx+si],al
0000063A 0000 add [bx+si],al
0000063C 0000 add [bx+si],al
0000063E 0000 add [bx+si],al
00000640 0000 add [bx+si],al
00000642 0000 add [bx+si],al
00000644 0000 add [bx+si],al
00000646 0000 add [bx+si],al
00000648 0000 add [bx+si],al
0000064A 0000 add [bx+si],al
0000064C 0000 add [bx+si],al
0000064E 0000 add [bx+si],al
00000650 0000 add [bx+si],al
00000652 0000 add [bx+si],al
00000654 0000 add [bx+si],al
00000656 0000 add [bx+si],al
00000658 0000 add [bx+si],al
0000065A 0000 add [bx+si],al
0000065C 0000 add [bx+si],al
0000065E 0000 add [bx+si],al
00000660 0000 add [bx+si],al
00000662 0000 add [bx+si],al
00000664 0000 add [bx+si],al
00000666 0000 add [bx+si],al
00000668 0000 add [bx+si],al
0000066A 0000 add [bx+si],al
0000066C 0000 add [bx+si],al
0000066E 0000 add [bx+si],al
00000670 0000 add [bx+si],al
00000672 0000 add [bx+si],al
00000674 0000 add [bx+si],al
00000676 0000 add [bx+si],al
00000678 0000 add [bx+si],al
0000067A 0000 add [bx+si],al
0000067C 0000 add [bx+si],al
0000067E 0000 add [bx+si],al
00000680 0000 add [bx+si],al
00000682 0000 add [bx+si],al
00000684 0000 add [bx+si],al
00000686 0000 add [bx+si],al
00000688 0000 add [bx+si],al
0000068A 0000 add [bx+si],al
0000068C 0000 add [bx+si],al
0000068E 0000 add [bx+si],al
00000690 0000 add [bx+si],al
00000692 0000 add [bx+si],al
00000694 0000 add [bx+si],al
00000696 0000 add [bx+si],al
00000698 0000 add [bx+si],al
0000069A 0000 add [bx+si],al
0000069C 0000 add [bx+si],al
0000069E 0000 add [bx+si],al
000006A0 0000 add [bx+si],al
000006A2 0000 add [bx+si],al
000006A4 0000 add [bx+si],al
000006A6 0000 add [bx+si],al
000006A8 0000 add [bx+si],al
000006AA 0000 add [bx+si],al
000006AC 0000 add [bx+si],al
000006AE 0000 add [bx+si],al
000006B0 0000 add [bx+si],al
000006B2 0000 add [bx+si],al
000006B4 0000 add [bx+si],al
000006B6 0000 add [bx+si],al
000006B8 0000 add [bx+si],al
000006BA 0000 add [bx+si],al
000006BC 0000 add [bx+si],al
000006BE 0000 add [bx+si],al
000006C0 0000 add [bx+si],al
000006C2 0000 add [bx+si],al
000006C4 0000 add [bx+si],al
000006C6 0000 add [bx+si],al
000006C8 0000 add [bx+si],al
000006CA 0000 add [bx+si],al
000006CC 0000 add [bx+si],al
000006CE 0000 add [bx+si],al
000006D0 0000 add [bx+si],al
000006D2 0000 add [bx+si],al
000006D4 0000 add [bx+si],al
000006D6 0000 add [bx+si],al
000006D8 0000 add [bx+si],al
000006DA 0000 add [bx+si],al
000006DC 0000 add [bx+si],al
000006DE 0000 add [bx+si],al
000006E0 0000 add [bx+si],al
000006E2 0000 add [bx+si],al
000006E4 0000 add [bx+si],al
000006E6 0000 add [bx+si],al
000006E8 0000 add [bx+si],al
000006EA 0000 add [bx+si],al
000006EC 0000 add [bx+si],al
000006EE 0000 add [bx+si],al
000006F0 0000 add [bx+si],al
000006F2 0000 add [bx+si],al
000006F4 0000 add [bx+si],al
000006F6 0000 add [bx+si],al
000006F8 0000 add [bx+si],al
000006FA 0000 add [bx+si],al
000006FC 0000 add [bx+si],al
000006FE 0000 add [bx+si],al
00000700 0000 add [bx+si],al
00000702 0000 add [bx+si],al
00000704 0000 add [bx+si],al
00000706 0000 add [bx+si],al
00000708 0000 add [bx+si],al
0000070A 0000 add [bx+si],al
0000070C 0000 add [bx+si],al
0000070E 0000 add [bx+si],al
00000710 0000 add [bx+si],al
00000712 0000 add [bx+si],al
00000714 0000 add [bx+si],al
00000716 0000 add [bx+si],al
00000718 0000 add [bx+si],al
0000071A 0000 add [bx+si],al
0000071C 0000 add [bx+si],al
0000071E 0000 add [bx+si],al
00000720 0000 add [bx+si],al
00000722 0000 add [bx+si],al
00000724 0000 add [bx+si],al
00000726 0000 add [bx+si],al
00000728 0000 add [bx+si],al
0000072A 0000 add [bx+si],al
0000072C 0000 add [bx+si],al
0000072E 0000 add [bx+si],al
00000730 0000 add [bx+si],al
00000732 0000 add [bx+si],al
00000734 0000 add [bx+si],al
00000736 0000 add [bx+si],al
00000738 0000 add [bx+si],al
0000073A 0000 add [bx+si],al
0000073C 0000 add [bx+si],al
0000073E 0000 add [bx+si],al
00000740 0000 add [bx+si],al
00000742 0000 add [bx+si],al
00000744 0000 add [bx+si],al
00000746 0000 add [bx+si],al
00000748 0000 add [bx+si],al
0000074A 0000 add [bx+si],al
0000074C 0000 add [bx+si],al
0000074E 0000 add [bx+si],al
00000750 0000 add [bx+si],al
00000752 0000 add [bx+si],al
00000754 0000 add [bx+si],al
00000756 0000 add [bx+si],al
00000758 0000 add [bx+si],al
0000075A 0000 add [bx+si],al
0000075C 0000 add [bx+si],al
0000075E 0000 add [bx+si],al
00000760 0000 add [bx+si],al
00000762 0000 add [bx+si],al
00000764 0000 add [bx+si],al
00000766 0000 add [bx+si],al
00000768 0000 add [bx+si],al
0000076A 0000 add [bx+si],al
0000076C 0000 add [bx+si],al
0000076E 0000 add [bx+si],al
00000770 0000 add [bx+si],al
00000772 0000 add [bx+si],al
00000774 0000 add [bx+si],al
00000776 0000 add [bx+si],al
00000778 0000 add [bx+si],al
0000077A 0000 add [bx+si],al
0000077C 0000 add [bx+si],al
0000077E 0000 add [bx+si],al
00000780 0000 add [bx+si],al
00000782 0000 add [bx+si],al
00000784 0000 add [bx+si],al
00000786 0000 add [bx+si],al
00000788 0000 add [bx+si],al
0000078A 0000 add [bx+si],al
0000078C 0000 add [bx+si],al
0000078E 0000 add [bx+si],al
00000790 0000 add [bx+si],al
00000792 0000 add [bx+si],al
00000794 0000 add [bx+si],al
00000796 0000 add [bx+si],al
00000798 0000 add [bx+si],al
0000079A 0000 add [bx+si],al
0000079C 0000 add [bx+si],al
0000079E 0000 add [bx+si],al
000007A0 0000 add [bx+si],al
000007A2 0000 add [bx+si],al
000007A4 0000 add [bx+si],al
000007A6 0000 add [bx+si],al
000007A8 0000 add [bx+si],al
000007AA 0000 add [bx+si],al
000007AC 0000 add [bx+si],al
000007AE 0000 add [bx+si],al
000007B0 0000 add [bx+si],al
000007B2 0000 add [bx+si],al
000007B4 0000 add [bx+si],al
000007B6 0000 add [bx+si],al
000007B8 0000 add [bx+si],al
000007BA 0000 add [bx+si],al
000007BC 0000 add [bx+si],al
000007BE 0000 add [bx+si],al
000007C0 0000 add [bx+si],al
000007C2 0000 add [bx+si],al
000007C4 0000 add [bx+si],al
000007C6 0000 add [bx+si],al
000007C8 0000 add [bx+si],al
000007CA 0000 add [bx+si],al
000007CC 0000 add [bx+si],al
000007CE 0000 add [bx+si],al
000007D0 0000 add [bx+si],al
000007D2 0000 add [bx+si],al
000007D4 0000 add [bx+si],al
000007D6 0000 add [bx+si],al
000007D8 0000 add [bx+si],al
000007DA 0000 add [bx+si],al
000007DC 0000 add [bx+si],al
000007DE 0000 add [bx+si],al
000007E0 0000 add [bx+si],al
000007E2 0000 add [bx+si],al
000007E4 0000 add [bx+si],al
000007E6 0000 add [bx+si],al
000007E8 0000 add [bx+si],al
000007EA 0000 add [bx+si],al
000007EC 0000 add [bx+si],al
000007EE 0000 add [bx+si],al
000007F0 0000 add [bx+si],al
000007F2 0000 add [bx+si],al
000007F4 0000 add [bx+si],al
000007F6 0000 add [bx+si],al
000007F8 0000 add [bx+si],al
000007FA 0000 add [bx+si],al
000007FC 0000 add [bx+si],al
000007FE 0000 add [bx+si],al
00000800 0000 add [bx+si],al
00000802 0000 add [bx+si],al
00000804 0000 add [bx+si],al
00000806 0000 add [bx+si],al
00000808 0000 add [bx+si],al
0000080A 0000 add [bx+si],al
0000080C 0000 add [bx+si],al
0000080E 0000 add [bx+si],al
00000810 0000 add [bx+si],al
00000812 0000 add [bx+si],al
00000814 0000 add [bx+si],al
00000816 0000 add [bx+si],al
00000818 0000 add [bx+si],al
0000081A 0000 add [bx+si],al
0000081C 0000 add [bx+si],al
0000081E 0000 add [bx+si],al
00000820 0000 add [bx+si],al
00000822 0000 add [bx+si],al
00000824 0000 add [bx+si],al
00000826 0000 add [bx+si],al
00000828 0000 add [bx+si],al
0000082A 0000 add [bx+si],al
0000082C 0000 add [bx+si],al
0000082E 0000 add [bx+si],al
00000830 0000 add [bx+si],al
00000832 0000 add [bx+si],al
00000834 0000 add [bx+si],al
00000836 0000 add [bx+si],al
00000838 0000 add [bx+si],al
0000083A 0000 add [bx+si],al
0000083C 0000 add [bx+si],al
0000083E 0000 add [bx+si],al
00000840 0000 add [bx+si],al
00000842 0000 add [bx+si],al
00000844 0000 add [bx+si],al
00000846 0000 add [bx+si],al
00000848 0000 add [bx+si],al
0000084A 0000 add [bx+si],al
0000084C 0000 add [bx+si],al
0000084E 0000 add [bx+si],al
00000850 0000 add [bx+si],al
00000852 0000 add [bx+si],al
00000854 0000 add [bx+si],al
00000856 0000 add [bx+si],al
00000858 0000 add [bx+si],al
0000085A 0000 add [bx+si],al
0000085C 0000 add [bx+si],al
0000085E 0000 add [bx+si],al
00000860 0000 add [bx+si],al
00000862 0000 add [bx+si],al
00000864 0000 add [bx+si],al
00000866 0000 add [bx+si],al
00000868 0000 add [bx+si],al
0000086A 0000 add [bx+si],al
0000086C 0000 add [bx+si],al
0000086E 0000 add [bx+si],al
00000870 0000 add [bx+si],al
00000872 0000 add [bx+si],al
00000874 0000 add [bx+si],al
00000876 0000 add [bx+si],al
00000878 0000 add [bx+si],al
0000087A 0000 add [bx+si],al
0000087C 0000 add [bx+si],al
0000087E 0000 add [bx+si],al
00000880 0000 add [bx+si],al
00000882 0000 add [bx+si],al
00000884 0000 add [bx+si],al
00000886 0000 add [bx+si],al
00000888 0000 add [bx+si],al
0000088A 0000 add [bx+si],al
0000088C 0000 add [bx+si],al
0000088E 0000 add [bx+si],al
00000890 0000 add [bx+si],al
00000892 0000 add [bx+si],al
00000894 0000 add [bx+si],al
00000896 0000 add [bx+si],al
00000898 0000 add [bx+si],al
0000089A 0000 add [bx+si],al
0000089C 0000 add [bx+si],al
0000089E 0000 add [bx+si],al
000008A0 0000 add [bx+si],al
000008A2 0000 add [bx+si],al
000008A4 0000 add [bx+si],al
000008A6 0000 add [bx+si],al
000008A8 0000 add [bx+si],al
000008AA 0000 add [bx+si],al
000008AC 0000 add [bx+si],al
000008AE 0000 add [bx+si],al
000008B0 0000 add [bx+si],al
000008B2 0000 add [bx+si],al
000008B4 0000 add [bx+si],al
000008B6 0000 add [bx+si],al
000008B8 0000 add [bx+si],al
000008BA 0000 add [bx+si],al
000008BC 0000 add [bx+si],al
000008BE 0000 add [bx+si],al
000008C0 0000 add [bx+si],al
000008C2 0000 add [bx+si],al
000008C4 0000 add [bx+si],al
000008C6 0000 add [bx+si],al
000008C8 0000 add [bx+si],al
000008CA 0000 add [bx+si],al
000008CC 0000 add [bx+si],al
000008CE 0000 add [bx+si],al
000008D0 0000 add [bx+si],al
000008D2 0000 add [bx+si],al
000008D4 0000 add [bx+si],al
000008D6 0000 add [bx+si],al
000008D8 0000 add [bx+si],al
000008DA 0000 add [bx+si],al
000008DC 0000 add [bx+si],al
000008DE 0000 add [bx+si],al
000008E0 0000 add [bx+si],al
000008E2 0000 add [bx+si],al
000008E4 0000 add [bx+si],al
000008E6 0000 add [bx+si],al
000008E8 0000 add [bx+si],al
000008EA 0000 add [bx+si],al
000008EC 0000 add [bx+si],al
000008EE 0000 add [bx+si],al
000008F0 0000 add [bx+si],al
000008F2 0000 add [bx+si],al
000008F4 0000 add [bx+si],al
000008F6 0000 add [bx+si],al
000008F8 0000 add [bx+si],al
000008FA 0000 add [bx+si],al
000008FC 0000 add [bx+si],al
000008FE 0000 add [bx+si],al
00000900 0000 add [bx+si],al
00000902 0000 add [bx+si],al
00000904 0000 add [bx+si],al
00000906 0000 add [bx+si],al
00000908 0000 add [bx+si],al
0000090A 0000 add [bx+si],al
0000090C 0000 add [bx+si],al
0000090E 0000 add [bx+si],al
00000910 0000 add [bx+si],al
00000912 0000 add [bx+si],al
00000914 0000 add [bx+si],al
00000916 0000 add [bx+si],al
00000918 0000 add [bx+si],al
0000091A 0000 add [bx+si],al
0000091C 0000 add [bx+si],al
0000091E 0000 add [bx+si],al
00000920 0000 add [bx+si],al
00000922 0000 add [bx+si],al
00000924 0000 add [bx+si],al
00000926 0000 add [bx+si],al
00000928 0000 add [bx+si],al
0000092A 0000 add [bx+si],al
0000092C 0000 add [bx+si],al
0000092E 0000 add [bx+si],al
00000930 0000 add [bx+si],al
00000932 0000 add [bx+si],al
00000934 0000 add [bx+si],al
00000936 0000 add [bx+si],al
00000938 0000 add [bx+si],al
0000093A 0000 add [bx+si],al
0000093C 0000 add [bx+si],al
0000093E 0000 add [bx+si],al
00000940 0000 add [bx+si],al
00000942 0000 add [bx+si],al
00000944 0000 add [bx+si],al
00000946 0000 add [bx+si],al
00000948 0000 add [bx+si],al
0000094A 0000 add [bx+si],al
0000094C 0000 add [bx+si],al
0000094E 0000 add [bx+si],al
00000950 0000 add [bx+si],al
00000952 0000 add [bx+si],al
00000954 0000 add [bx+si],al
00000956 0000 add [bx+si],al
00000958 0000 add [bx+si],al
0000095A 0000 add [bx+si],al
0000095C 0000 add [bx+si],al
0000095E 0000 add [bx+si],al
00000960 0000 add [bx+si],al
00000962 0000 add [bx+si],al
00000964 0000 add [bx+si],al
00000966 0000 add [bx+si],al
00000968 0000 add [bx+si],al
0000096A 0000 add [bx+si],al
0000096C 0000 add [bx+si],al
0000096E 0000 add [bx+si],al
00000970 0000 add [bx+si],al
00000972 0000 add [bx+si],al
00000974 0000 add [bx+si],al
00000976 0000 add [bx+si],al
00000978 0000 add [bx+si],al
0000097A 0000 add [bx+si],al
0000097C 0000 add [bx+si],al
0000097E 0000 add [bx+si],al
00000980 0000 add [bx+si],al
00000982 0000 add [bx+si],al
00000984 0000 add [bx+si],al
00000986 0000 add [bx+si],al
00000988 0000 add [bx+si],al
0000098A 0000 add [bx+si],al
0000098C 0000 add [bx+si],al
0000098E 0000 add [bx+si],al
00000990 0000 add [bx+si],al
00000992 0000 add [bx+si],al
00000994 0000 add [bx+si],al
00000996 0000 add [bx+si],al
00000998 0000 add [bx+si],al
0000099A 0000 add [bx+si],al
0000099C 0000 add [bx+si],al
0000099E 0000 add [bx+si],al
000009A0 0000 add [bx+si],al
000009A2 0000 add [bx+si],al
000009A4 0000 add [bx+si],al
000009A6 0000 add [bx+si],al
000009A8 0000 add [bx+si],al
000009AA 0000 add [bx+si],al
000009AC 0000 add [bx+si],al
000009AE 0000 add [bx+si],al
000009B0 0000 add [bx+si],al
000009B2 0000 add [bx+si],al
000009B4 0000 add [bx+si],al
000009B6 0000 add [bx+si],al
000009B8 0000 add [bx+si],al
000009BA 0000 add [bx+si],al
000009BC 0000 add [bx+si],al
000009BE 0000 add [bx+si],al
000009C0 0000 add [bx+si],al
000009C2 0000 add [bx+si],al
000009C4 0000 add [bx+si],al
000009C6 0000 add [bx+si],al
000009C8 0000 add [bx+si],al
000009CA 0000 add [bx+si],al
000009CC 0000 add [bx+si],al
000009CE 0000 add [bx+si],al
000009D0 0000 add [bx+si],al
000009D2 0000 add [bx+si],al
000009D4 0000 add [bx+si],al
000009D6 0000 add [bx+si],al
000009D8 0000 add [bx+si],al
000009DA 0000 add [bx+si],al
000009DC 0000 add [bx+si],al
000009DE 0000 add [bx+si],al
000009E0 0000 add [bx+si],al
000009E2 0000 add [bx+si],al
000009E4 0000 add [bx+si],al
000009E6 0000 add [bx+si],al
000009E8 0000 add [bx+si],al
000009EA 0000 add [bx+si],al
000009EC 0000 add [bx+si],al
000009EE 0000 add [bx+si],al
000009F0 0000 add [bx+si],al
000009F2 0000 add [bx+si],al
000009F4 0000 add [bx+si],al
000009F6 0000 add [bx+si],al
000009F8 0000 add [bx+si],al
000009FA 0000 add [bx+si],al
000009FC 0000 add [bx+si],al
000009FE 0000 add [bx+si],al
00000A00 0000 add [bx+si],al
00000A02 0000 add [bx+si],al
00000A04 0000 add [bx+si],al
00000A06 0000 add [bx+si],al
00000A08 0000 add [bx+si],al
00000A0A 0000 add [bx+si],al
00000A0C 0000 add [bx+si],al
00000A0E 0000 add [bx+si],al
00000A10 0000 add [bx+si],al
00000A12 0000 add [bx+si],al
00000A14 0000 add [bx+si],al
00000A16 0000 add [bx+si],al
00000A18 0000 add [bx+si],al
00000A1A 0000 add [bx+si],al
00000A1C 0000 add [bx+si],al
00000A1E 0000 add [bx+si],al
00000A20 0000 add [bx+si],al
00000A22 0000 add [bx+si],al
00000A24 0000 add [bx+si],al
00000A26 0000 add [bx+si],al
00000A28 0000 add [bx+si],al
00000A2A 0000 add [bx+si],al
00000A2C 0000 add [bx+si],al
00000A2E 0000 add [bx+si],al
00000A30 0000 add [bx+si],al
00000A32 0000 add [bx+si],al
00000A34 0000 add [bx+si],al
00000A36 0000 add [bx+si],al
00000A38 0000 add [bx+si],al
00000A3A 0000 add [bx+si],al
00000A3C 0000 add [bx+si],al
00000A3E 0000 add [bx+si],al
00000A40 0000 add [bx+si],al
00000A42 0000 add [bx+si],al
00000A44 0000 add [bx+si],al
00000A46 0000 add [bx+si],al
00000A48 0000 add [bx+si],al
00000A4A 0000 add [bx+si],al
00000A4C 0000 add [bx+si],al
00000A4E 0000 add [bx+si],al
00000A50 0000 add [bx+si],al
00000A52 0000 add [bx+si],al
00000A54 0000 add [bx+si],al
00000A56 0000 add [bx+si],al
00000A58 0000 add [bx+si],al
00000A5A 0000 add [bx+si],al
00000A5C 0000 add [bx+si],al
00000A5E 0000 add [bx+si],al
00000A60 0000 add [bx+si],al
00000A62 0000 add [bx+si],al
00000A64 0000 add [bx+si],al
00000A66 0000 add [bx+si],al
00000A68 0000 add [bx+si],al
00000A6A 0000 add [bx+si],al
00000A6C 0000 add [bx+si],al
00000A6E 0000 add [bx+si],al
00000A70 0000 add [bx+si],al
00000A72 0000 add [bx+si],al
00000A74 0000 add [bx+si],al
00000A76 0000 add [bx+si],al
00000A78 0000 add [bx+si],al
00000A7A 0000 add [bx+si],al
00000A7C 0000 add [bx+si],al
00000A7E 0000 add [bx+si],al
00000A80 0000 add [bx+si],al
00000A82 0000 add [bx+si],al
00000A84 0000 add [bx+si],al
00000A86 0000 add [bx+si],al
00000A88 0000 add [bx+si],al
00000A8A 0000 add [bx+si],al
00000A8C 0000 add [bx+si],al
00000A8E 0000 add [bx+si],al
00000A90 0000 add [bx+si],al
00000A92 0000 add [bx+si],al
00000A94 0000 add [bx+si],al
00000A96 0000 add [bx+si],al
00000A98 0000 add [bx+si],al
00000A9A 0000 add [bx+si],al
00000A9C 0000 add [bx+si],al
00000A9E 0000 add [bx+si],al
00000AA0 0000 add [bx+si],al
00000AA2 0000 add [bx+si],al
00000AA4 0000 add [bx+si],al
00000AA6 0000 add [bx+si],al
00000AA8 0000 add [bx+si],al
00000AAA 0000 add [bx+si],al
00000AAC 0000 add [bx+si],al
00000AAE 0000 add [bx+si],al
00000AB0 0000 add [bx+si],al
00000AB2 0000 add [bx+si],al
00000AB4 0000 add [bx+si],al
00000AB6 0000 add [bx+si],al
00000AB8 0000 add [bx+si],al
00000ABA 0000 add [bx+si],al
00000ABC 0000 add [bx+si],al
00000ABE 0000 add [bx+si],al
00000AC0 0000 add [bx+si],al
00000AC2 0000 add [bx+si],al
00000AC4 0000 add [bx+si],al
00000AC6 0000 add [bx+si],al
00000AC8 0000 add [bx+si],al
00000ACA 0000 add [bx+si],al
00000ACC 0000 add [bx+si],al
00000ACE 0000 add [bx+si],al
00000AD0 0000 add [bx+si],al
00000AD2 0000 add [bx+si],al
00000AD4 0000 add [bx+si],al
00000AD6 0000 add [bx+si],al
00000AD8 0000 add [bx+si],al
00000ADA 0000 add [bx+si],al
00000ADC 0000 add [bx+si],al
00000ADE 0000 add [bx+si],al
00000AE0 0000 add [bx+si],al
00000AE2 0000 add [bx+si],al
00000AE4 0000 add [bx+si],al
00000AE6 0000 add [bx+si],al
00000AE8 0000 add [bx+si],al
00000AEA 0000 add [bx+si],al
00000AEC 0000 add [bx+si],al
00000AEE 0000 add [bx+si],al
00000AF0 0000 add [bx+si],al
00000AF2 0000 add [bx+si],al
00000AF4 0000 add [bx+si],al
00000AF6 0000 add [bx+si],al
00000AF8 0000 add [bx+si],al
00000AFA 0000 add [bx+si],al
00000AFC 0000 add [bx+si],al
00000AFE 0000 add [bx+si],al
00000B00 0000 add [bx+si],al
00000B02 0000 add [bx+si],al
00000B04 0000 add [bx+si],al
00000B06 0000 add [bx+si],al
00000B08 0000 add [bx+si],al
00000B0A 0000 add [bx+si],al
00000B0C 0000 add [bx+si],al
00000B0E 0000 add [bx+si],al
00000B10 0000 add [bx+si],al
00000B12 0000 add [bx+si],al
00000B14 0000 add [bx+si],al
00000B16 0000 add [bx+si],al
00000B18 0000 add [bx+si],al
00000B1A 0000 add [bx+si],al
00000B1C 0000 add [bx+si],al
00000B1E 0000 add [bx+si],al
00000B20 0000 add [bx+si],al
00000B22 0000 add [bx+si],al
00000B24 0000 add [bx+si],al
00000B26 0000 add [bx+si],al
00000B28 0000 add [bx+si],al
00000B2A 0000 add [bx+si],al
00000B2C 0000 add [bx+si],al
00000B2E 0000 add [bx+si],al
00000B30 0000 add [bx+si],al
00000B32 0000 add [bx+si],al
00000B34 0000 add [bx+si],al
00000B36 0000 add [bx+si],al
00000B38 0000 add [bx+si],al
00000B3A 0000 add [bx+si],al
00000B3C 0000 add [bx+si],al
00000B3E 0000 add [bx+si],al
00000B40 0000 add [bx+si],al
00000B42 0000 add [bx+si],al
00000B44 0000 add [bx+si],al
00000B46 0000 add [bx+si],al
00000B48 0000 add [bx+si],al
00000B4A 0000 add [bx+si],al
00000B4C 0000 add [bx+si],al
00000B4E 0000 add [bx+si],al
00000B50 0000 add [bx+si],al
00000B52 0000 add [bx+si],al
00000B54 0000 add [bx+si],al
00000B56 0000 add [bx+si],al
00000B58 0000 add [bx+si],al
00000B5A 0000 add [bx+si],al
00000B5C 0000 add [bx+si],al
00000B5E 0000 add [bx+si],al
00000B60 0000 add [bx+si],al
00000B62 0000 add [bx+si],al
00000B64 0000 add [bx+si],al
00000B66 0000 add [bx+si],al
00000B68 0000 add [bx+si],al
00000B6A 0000 add [bx+si],al
00000B6C 0000 add [bx+si],al
00000B6E 0000 add [bx+si],al
00000B70 0000 add [bx+si],al
00000B72 0000 add [bx+si],al
00000B74 0000 add [bx+si],al
00000B76 0000 add [bx+si],al
00000B78 0000 add [bx+si],al
00000B7A 0000 add [bx+si],al
00000B7C 0000 add [bx+si],al
00000B7E 0000 add [bx+si],al
00000B80 0000 add [bx+si],al
00000B82 0000 add [bx+si],al
00000B84 0000 add [bx+si],al
00000B86 0000 add [bx+si],al
00000B88 0000 add [bx+si],al
00000B8A 0000 add [bx+si],al
00000B8C 0000 add [bx+si],al
00000B8E 0000 add [bx+si],al
00000B90 0000 add [bx+si],al
00000B92 0000 add [bx+si],al
00000B94 0000 add [bx+si],al
00000B96 0000 add [bx+si],al
00000B98 0000 add [bx+si],al
00000B9A 0000 add [bx+si],al
00000B9C 0000 add [bx+si],al
00000B9E 0000 add [bx+si],al
00000BA0 0000 add [bx+si],al
00000BA2 0000 add [bx+si],al
00000BA4 0000 add [bx+si],al
00000BA6 0000 add [bx+si],al
00000BA8 0000 add [bx+si],al
00000BAA 0000 add [bx+si],al
00000BAC 0000 add [bx+si],al
00000BAE 0000 add [bx+si],al
00000BB0 0000 add [bx+si],al
00000BB2 0000 add [bx+si],al
00000BB4 0000 add [bx+si],al
00000BB6 0000 add [bx+si],al
00000BB8 0000 add [bx+si],al
00000BBA 0000 add [bx+si],al
00000BBC 0000 add [bx+si],al
00000BBE 0000 add [bx+si],al
00000BC0 0000 add [bx+si],al
00000BC2 0000 add [bx+si],al
00000BC4 0000 add [bx+si],al
00000BC6 0000 add [bx+si],al
00000BC8 0000 add [bx+si],al
00000BCA 0000 add [bx+si],al
00000BCC 0000 add [bx+si],al
00000BCE 0000 add [bx+si],al
00000BD0 0000 add [bx+si],al
00000BD2 0000 add [bx+si],al
00000BD4 0000 add [bx+si],al
00000BD6 0000 add [bx+si],al
00000BD8 0000 add [bx+si],al
00000BDA 0000 add [bx+si],al
00000BDC 0
Ten výstup z disassembleru vypadá jako první sektor oddílu
formátovaného FAT32. Část dat jsi ale interpretoval jako instrukce.
Strukturu prvního sektoru pro FAT12, FAT(16) a FAT32 najdeš třeba tady:
http://www.jadro-windows.cz/…load/fat.zip
Je to myslím oficiální popis souborových systémů FAT.
Pokud by tě zajímalo NTFS (včetně struktury prvního sektoru), tak
http://www.jadro-windows.cz/…sdoc-0.5.zip
ale to je neoficiální popis.


Domiy:14.6.2013 15:51
Ale já nechci FAT... Chci
si na disk zapsat tabulku přerušení, 10 ovládacích souborů, hlavní
adresář a dynamické místo pro funkce systému... A v neposlední řadě
BootSector - který propojí BIOS a tento souborový systém a tak přeruší do
kernelu. V kernelu již je správa spouštění, ukládání atd.
Přerušováním do té tabulky přerušení... (Z kernelu používám
systémové funkce.)
Kit:14.6.2013 15:52
Tak tohle jsi disasembloval úplně špatně. To není jedna instrukce, ale dva nulové byty.
První instrukci programu po prvním skoku máš chybně dekódovanou. Pak už se vezeš mimo.
Zapsat tabulku přerušení na disk? Nějak nerozumím, čeho přesně chceš dosáhnout. Tabulka vektorů přerušení se na disk neukládá. Krom toho její umístění (a způsob získání) závisí na režimu procesoru, ve kterém je vykonáván kód.
Boot. sektor (aspoň u Windows) "nepřerušuje" do kernelu. Pouze načte boot loader (soubor bootmgr či ntldr, závisí na verzi Windows) a předá mu řízení. boot loader na konci své činnosti načte kernel (popř. program winload.exe), čímž v podstatě začíná proces inicializace vlastního operačního systému.


Domiy:14.6.2013 21:07
Vždyť píši, že do BIOSu dám most. V Unixu je přerušení 80h. Já chci místo spouštění mnoha funkcí do nich přerušovat - bude to přehlednější. Ale do BIOSu bych je nedostal. Tak si rozšířím tabulku přerušení do toho souborového systému... A rovnou bych to použil ke spuštění kernelu...


Domiy:14.6.2013 21:09
Vím přesně, jak funguje přerušení:
.model tiny
.code
.186
org 100h
start:
jmp short Interrupt.LoadIntoMemory
;*******************************************************************
;;;; our interrupt code and data goes here
.even ; lets align it on the next word boundary
Interrupt.Main:
cli
push ds ; save data seg
push cs ; point ds to cs
pop ds
or ah, ah ; if ah = 0 then service 0
je short Service0
cmp ah, 01 ; if ah = 1 then service 1
je short Service1
cmp ah, 02 ; if ah = 2 then service 2
je short Service2
Interrupt.End:
pop ds ; else just return
sti
iret
Service0:
mov dx, 00h ; do something simple for example
jmp short Interrupt.End
; our service #1 (ah = 01h)
Service1:
mov dx, 01h ; do something simple for example
jmp short Interrupt.End
; our service #2 (ah = 02h)
Service2:
mov dx, 02h ; do something simple for example
jmp short Interrupt.End
OurEnd:
;;;; end of our interrupt code and data
;*******************************************************************
Interrupt.LoadIntoMemory:
mov si, offset initialMessage ; display start up string
call Console.Write
xor bx, bx ; make es:bx point to 0000:00D0h
mov es, bx
mov bx, 00D0h
mov cx, 204 ; 256 interrupts (00-FF)(-34h)
.searchIRET: ; IRET = empty record in interrupts table
mov si, es:[bx] ; get interrupt vector address
inc bx ; offset first (little endian)
inc bx
mov ax, es:[bx] ; segment second (little endian)
inc bx
inc bx
cmp ax, 0F000h ; if segment => F000h then in ROM-BIOS
jae short .notIRERT ; (if in BIOS then skip it)
push es
mov es, ax ; see if IRET
mov dl, es:[si]
pop es
cmp dl, 0CFh ; is it IRET
je short .foundIRET ; if so, then not used
.notIRERT:
inc byte cIntVNum ; inc for next time
loop .searchIRET
mov si, offset noSpaceString ; didn't find one
call Console.Write
jmp short DoneErr
.foundIRET:
mov si, offset stringFoundIRET
call Console.Write
mov ax, bx
sub ax, 04 ; backup to first of vector
call Console.WriteHex
mov si, offset intNumString
call Console.Write
mov al, cIntVNum ; display current int number
call Console.WriteHexs
mov dl, 'h' ; print 'h'
mov ah, 02
int 21h
push cs
pop ds
mov al, cIntVNum ; vector to change
mov ah, 25h
mov dx, offset cs:Interrupt.Main
int 21h
mov ah, 62h ; get and free environment block
int 21h
mov es, bx
mov ax, es:[2Ch]
mov es, ax
mov ah, 49h
int 21h
mov dx, offset cs:OurEnd ; offset of end of our code
shr dx, 04 ; div by 16 (make it a paragraph #)
inc dx ; just in case
add dx, 16 ; The PSP
mov ax, 3100h ; service number and RC = 0
int 21h ; TSR service
DoneErr:
mov ah, 4Ch ; exit to DOS (no TSR)
int 21h
Console.Write proc near uses ax dx si
.writeChar:
mov dl, [si] ; Get character
inc si ; Point to next one
or dl, dl ; End of string?
jz short .writeEnd
mov ah, 02h
int 21h
jmp short .writeChar
.writeEnd:
ret
Console.Write endp
Console.WriteHexs proc near uses ax bx dx cx
mov bx, offset hex
push ax
shr al, 04h
xlatb
mov dl, al
mov ah, 02
int 21h
pop ax
and al, 0Fh
xlatb
mov dl, al
mov ah, 02
int 21h
ret
Console.WriteHexs endp
Console.WriteHex proc near uses ax bx cx dx
mov bx, offset hex
mov cx, 04h
.hexLoop:
push ax
mov al, ah
shr al, 04h
xlatb
mov dl, al
mov ah, 02
int 21h
pop ax
shl ax, 04h
loop .hexLoop
ret
Console.WriteHex endp
cIntVNum db 34h ; starting with int 34h
initialMessage db 13, 10, 'Interrupt installation started', 0
noSpaceString db 13, 10, "Empty space for interrupt not found!"
stringFoundIRET db 13, 10, ' Found an unused interrupt at:0000:', 0
intNumString db 13, 10, ' Interrupt number:', 0
hex db '0123456789ABCDEF'
.end start


Domiy:14.6.2013 21:18
A tabulka se na disk ukládá - nepřišel jsem s tím první. Znám několik OS, co své funkce alespoň v základu řeší přes přerušení. Než bych se doparametrizoval a dovolal ke spuštění každé funkce, kód by s zprasil k nepoznání. Takhle jen udělám:
mov, si, System.FileSystem.ReadSector
int 100h
- parapetrizace té funkce, ale nebudu si to kazit ještě spouštěním, které by samo o sobě potřebovalo parametrizovat... (Nehledě na zbytečnou náročnost - neustálé vyhledávání atd. V tabulce je to jasně dané...)
Mohl bys svůj záměr vysvětlit nějak šířejí (a třeba na příkladu)? Já totiž stále nechápu, čeho přesně chceš dosáhnout.
Jinak myslím, že přerušení 21h není při bootování dostupné, protože se nejedná o přerušení BIOSu, ale DOSu.


Domiy:14.6.2013 21:37
Děláš si srandu? To je pro uložení do prázdného místa v BIOSu. Ne pro
spuštění. A jak jsi mě poučoval... Tohle jednou zapíši do BIOSu a tím končím... Kdyby se muselo
pořád ukládat do BIOSu, jak by asi mohla fungovat ta tabulka?
Co chci jsem napsal jasně - přerušovat do funkcí systému. Místo jejich zbytečného spouštění. Tedy místo zbytečného zdržování se v rámci souborového systému s funkcemi operačního systému. To znamená, že uživatelské soubory budu pak řešit nějakou z těhto funkcí, která bude pracovat s jedním z 10 hlavních souborů souborového systému. V jednom souboru budou třeba jen jména souborů a jejich privilégia. Uživatelksé soubory chci ukládat jen pod adresou počátku a konce. Ale jméno a další data nechám v těch hlavních souborech. Tím ušetřím místo a zbavím se mnohých omezení... To jediné co potřebuji je, abych mohl z BootSectoru přerušit do svého kernelu. A z kernelu přerušovat do funkcí systému. A ty funkce systému mi umožní pracovat s diskem. Číst uživatelské soubory budu jak jsem psal - vezmu adresu začátku souboru a dosadím k ní data z hlavních 10 souborů... Konzistenci budu řešit žurnálováním...
Jako by tu byl nějaký Matěj se mi tak zdá...
vodacek:14.6.2013 22:51
jsem z toho celý přerušen, aneb někdo se naučil slovo přerušení a ted ho cpe všude
No, bohužel stále nerozumíš, co přesně chceš realizovat, resp. v čem máš problém. Hlavně nechápu výraz "přerušit do svého kernelu" a "přerušovat do funkcí systému." Proto jsem se zajímal o nějaký příklad.
Nebo tím "přerušováním do funkcí systému" myslíš přímé použití přerušení 80h? Tohle já navýzám systémovým voláním.
Děláš si srandu? To je pro uložení do prázdného místa v BIOSu. Ne pro
spuštění. A jak jsi mě poučoval... Tohle jednou zapíši do BIOSu a tím
končím... Kdyby se muselo pořád ukládat do BIOSu, jak by asi mohla fungovat
ta tabulka?
A tomuhle také bohužel moc nerozumím. A do BIOSu bych být tebou zapisovat moc nezkoušel, to může být velký průšvih, pokud tam něco zapíšeš špatně, protože už bys nemuse ldostat šanci to opravit.
Ale s tou tabulkou vektorů přerušení to prostě nechápu.
Asi to celé necháme být.


Domiy:15.6.2013 5:49
Přerušení se do BIOSu zapisuje běžně - každý OS má své přerušení - nechci Unixové - chci své... A poslal jsem ti, jaké... 100h
int kernel
Co je na tom k nepochopení?


Domiy:15.6.2013 5:54
Jak bych to mohl zapsat špatně, když nezapisuji já? Zapisuje se přes 21h a 16h... A to do prázdného místa v tabulce přerušení. (Kdyžtak nebude fungovat to jedno přerušení no...) Jediné co potřebuji - aby mi BootSector přerušil do BIOSu a tam by byl sezman adres tabulky přerušení a 10ti souborů onoho souborového systému. Nemusel bych pak nic načítat - použil bych jedno pěkné přerušení...


Domiy:15.6.2013 5:56
Tedy BootSector musím nechat doběhnout - jde mi o vytvoření toho mostu...


Domiy:15.6.2013 8:23
Prostě chci jen zapsat sektory, které pak budu moci číst přerušením...
Jenže dd neumí pracovat se
sektory - jen tupě klonuje... Chci jen zapsat každý z 10ti souborů se
zarovnáním podle velikosti sektoru. To v jakém sektoru začíná každý
soubor a kolik sektorů zabírá bude spravovat kernel. A uživatelská data pak
budou spravována těmito soubory...
Přerušení se do BIOSu zapisuje běžně - každý OS má své přerušení - nechci
Unixové - chci své... A poslal jsem ti, jaké... 100h
Tabulka vektorů přerušení (Interrupt Vector Table, Interrupt Descriptor Table) je datovou strukturou používanou procesorem. Do BIOSu se nezapisuje. Procesor musí znát adresu této struktury, aby byl schopen volat obslužné rutiny jednotlivých přerušení.
V reálném režimu procesoru se tabulka vektorů přerušení nachází na adrese 0x0000:0x0000 (což je fyzická adresa 0). V chráněných režimech procesoru se informace o tabulce nacházejí v registru IDTR, se kterým se pracuje pomocí instrukcí SIDT a LIDT (asi to půjde i v reálném režimu procesoru).
Mluvím o procesorech x86. Jinde to může být (a je) jinak. Procesory x86 AFAIK dovolují definovat obslužné rutiny maximálně pro 256 přerušení, tudíž vektor 100h neexistuje.
Při startu počítače po provedení POST je tabulka vektorů přerušení vyplněna asi inicializačním kódem BIOSu tak, aby vykonáním přerušení bylo možné provést určitou operaci týkajícíc se různých oblastí (obrazovka, klávesnice, disky, disketa...). V chráněném režimu to už udělat takhle jednoduše nelze.
Prostě chci jen zapsat sektory, které pak budu moci číst přerušením...
Jenže dd neumí pracovat se sektory - jen tupě klonuje... Chci jen zapsat
každý z 10ti souborů se zarovnáním podle velikosti sektoru. To v jakém
sektoru začíná každý soubor a kolik sektorů zabírá bude spravovat kernel.
A uživatelská data pak budou spravována těmito soubory...
Pokud ti stačí ty sektory zapsat za běhu operačního systému, tak bych zkusil použít standardní Cčkovské rutiny pro práci se soubory na zařízení daného disku (či diskového oddílu, pokud každý diskový oddíl v Unixu také má zařízení. U fyzického zařízení disku se ještě musí řešit případný MBR/GPT). Přerušením BIOSu se dá číst libovolný sektor disku v případě, že disk podporuje LBA, což dnes asi budou všechny disky. Jinak se přes BIOS dostaneš jen k prvním cca 1023 cylindrům (možná ještě méně).


Domiy:15.6.2013 11:23
Vpodstatě by stačilo nakopírovat všechny systémové soubory v určeném pořadí - a při změně pozice se jen updatují data. Ovšem první věc je zarovnání do velikosti sektoru. Snažím se to spočítat manuálně jako v BootSectoru ($-$$) ovšem tak nějak netuším jak na to... Protože bych to musel jedině nějak dělit, zahodit čárku atd. Takže první věc - zarovnání do celých sektorů a druhá věc - přecijen nějaká správa. BOOT.CAT se mi vytvořil mimo souborový systém - tak netuším, co to je... (Co je tedy v prvním sectoru - když ne BOOT.CAT) Mám to vše v ISO - FLP obraz se soubory a BOOT.CAT A hlavně nevím, jak moc se dá spolehnout na to, že se mi sectory napasují přesně na sebe. Vznikají švy? Chtěl bych se vyvarovat hledání souborů - do BootSectoru bych nadefinoval jaké sectory načíst do RAM a tím by to pro mne zkončilo... Proto mi musí sectory sedět... Uživatelksé soubory bych pak řešil z těch načtených v RAM...
Pomocí tohoto makra můžeš zarovnat velikost dat na nejbližší vyšší násobek čehokoliv.
#define ALIGN_UP(p, alignment) \
(((uintptr_t)(p) + (alignment)-1) & ~((alignment)-1))
Pokud chceš zarovnat třeba velikost souboru, lze to řešit třeba takto:
FileSizeAligned = ALIGN_UP(FileSize, 512);
Zároveň se také dozvíš, kolik bajtů bude v sektoru vyplněných prázdným místem.
EmptyBytes = FileSizeAligned - FileSize;
Otázka samozřejmě je, zda budeš své soubory vytvářet tak, aby jejich velikost již byla zarovnána ne sektory, nebo tento problém budeš řešit při zápisu na disk. Záleží na tom, kdy tam budeš ty soubory zapisovat. Pokud v prostředí operačního systému, dělal bych to tím druhým způsobem.
Mezi sektory žádné švy nejsou. Ani žádné překryvy. Co se týče práce s diskem přes přerušení 13h, tak se lze podívat třeba sem:
http://en.wikipedia.org/wiki/Int_13h#INT_13h_AH.3D42h:_Extended_Read_Sectors_From_Drive
Ale počítám, že tady zdroje máš (a lepší než je v tomto případě Wikipedie).


Domiy:15.6.2013 12:26
Já 13h znám. Dále je nesmyslné zarovnávat každý soubor. Důvod proč chci zarovnat systémové soubory je ten, že se nezdá, že by existoval nástroj na práci se sektory - což je divné... O zaplnění se pak již postará 13h. Tudíž první věc - skutečně neexistuje něco jako fdisk, ale i pro zápis? Abych nastavil velikost sectoru, počet hlav a drah a on podle toho rozdělí vstupní data? Další věc - jak násilím dostat z binární podoby BootLoaderu BootSector BOOT.CAT? Tedy aby zaplnil první sektor té diskety... (Aktuálně vytvořím disketu do které ukládám všehna data a tu pak vložím do ISO a najednou se k ní přidá i BOOT.CAT.) Pokud to, že si ISO vycucne BOOT.CAT nezmění fakt, že je BootLoader v prvním sektoru té diskety, není co řešit...
Koukal jsem po knihovnách a nakonec to tedy hold napíši v C. Blbé je, že to nechci do disku, ale do souboru, který bych případně klonoval. (Nemám volný partition na hrátky.) Zdá se ale, že rozdělení na sektory je imaginární - nijak není vyjádřeno. Pak tedy jak jsem psal - stačí jen zapsat data ve správném pořadí...


Domiy:15.6.2013 12:28
Tvůj kód se mi nezdá jako Assembly - opravdu to tam půjde? Kde jsou
všechny ty proměnné deklarované? A kde se ztratila makra $ $$?
Díky.


Domiy:15.6.2013 12:53
A to mi v Assembly asi moc nepomůže... V C bych si s $-$$ hrál do
alelůja...


Domiy:15.6.2013 13:13
Ha! dd má skip - jen v clusterech - takře vynásobím velikostí sektoru a
asi tedy vše poběží...
(Spočítám si v DASHi, kolik má přeskočit za každým souborem...)
Můj kód není Assembly, nýbrž C. Myslel jsem, že máš problém s tím, jak to zarovnávání řešit algoritmicky a že když sem hodím definici makra ALIGN_UP, tak si ho přepíšeš do Assembleru, pokud to budeš potřebovat.
Nejedná se o přeložitelný kód, ale o pseudokód. Proměnná FileSize udává přesnou velikost souboru, FileSizeAligned velikost souboru zarovnanou na nejbližší vyšší násobek velikosti sektoru.
Jelikož Unixy neznám, tak nevím, co je to BOOT.CAT a nemůžu ti tedy s tímhle poradit. Jediné, co jsem v této oblasti dělal, je úprava Master Boot Recordu na stroji bootujícím konkrétní verzi Windows (http://www.jadro-windows.cz/…ference-2003).
Nevím, zda existuje nějaký nástroj pro zápis sektorů. Když něco takového potřebuju, naprogramuju si to.
Rozdělení na sektory je skryto vrstvami software mezi disekm a tvým programem. V podstatě jediné, co od tebe disk požaduje, když do něj chceš přímo zapisovat, je udávat velikost zapisovaných dat v násobcích sektorů.
Mimochodem, velikost sektoru nemusí být nutně 512 bajtů, u CD/DVD jsem narazil i na 2 KB.


Domiy:15.6.2013 13:27
Nemám zatím velké soubory. Navíc je to docela prasárna - do těch
přebytků bych narval klidně i 7 operačních systémů...
Neuvědomil jsem si, že dd zase nebere různé velikosti souborů - zkusím zapojit ještě cat...


Domiy:15.6.2013 13:29
To ze mě děláš pěkného vola - já to spočítat umím. Ale takové počty v definici times použít nemohu... samozřejmě - budu to muset předpočítat - ovšem do raději vymyslím něco v DASHi...


Domiy:15.6.2013 13:31
Už to mám - spočítám dorovnání v DASHi, zarovnám nulami zařízením
/dev/zero a spojím catem. Takže prasárna, ale jede to!
To ze mě děláš pěkného vola - já to spočítat umím. Ale takové počty v
definici times použít nemohu... samozřejmě - budu to muset předpočítat -
ovšem do raději vymyslím něco v DASHi...
To se omlouvám, vola jsem z tebe dělat nechtěl. Jen jsem z tvého příspěvku dospěl k závěru, že hlavní problém je s tím genericky napsat to zarovnávání. Pokud to chceš v x86 Assembleru, tak by to šlo asi nějak takto (v registru AX je hodnota, kterou ccheme zarovnat):
push bx
mov bx, alignment
dec bx
add ax, bx
not bx
and ax, bx
pop bx


Domiy:15.6.2013 13:57
Jak píši - udělal jsem to v DASHi. Jen mi teď nic nefunguje - tak nemohu potvrdit úspěch. (Musím předělat hodně věcí.)


Domiy:15.6.2013 14:41
Jako docela se modlím - výstup disassembleru se jeví skvěle, ale velikosti vůbec nesedí... (Přitom BootSector splňuje 512 a na kernel používám modulo - oba sami jsou OK, ale spolu...)


Domiy:15.6.2013 15:00
Jo a jak mi operační systém detekuje BootSector? Je to naprosto tutově
vždy prvních 512 byte? (Poběží mi to? ) Nedaří se mi totiž udělat
bootovatelné ISO, když již to není floppy, ale slepenec...
(Vím, že BootSector je prvních 512 byte - jen ujištění...)
BIOS postupuje tak, že postupně hledá zařízení podle toho, jak má nastavené pořadí bootování. Jakmile nějaké zařízení najde, načte jeho první sektor na adresu 0x0000:0x7C00 (fyzická adresa 0x7C000) a předá řízení na jeho první bajt.
Obvykle je prvním sektorem disku MBR (Master Boot Record), který krom bootovacího kódu obsahuje i tabulku s informacemi o diskových oddílech. MBR obvykle najde aktivní diskový oddíl, načte jeho první sektor (opět na adresu 0x0000:0x7C00) a předá řízení na jeho první bajt.
Bootovací kód pro ISO jsem nikdy nepsal, takže nevím, jaké tam jsou zákony. Jestli třeba nejsou sektory velké 2 KB.
Nevím, jak to funguje v případě bootování přes (U)EFI. Tuhle oblast jsem vůbec nestudoval.


BITS 16
jmp short Boot
nop
OEMLabel db "SMA-BOOT" ; Disk label
BytesPerSector dw 512 ; Bytes per sector
SectorsPerCluster db 1 ; Sectors per Cluster
ReservedForBoot dw 1 ; Reserved sectors for boot record
RootDirEntries dw 224 ; Number of entries in root dir
; (224 * 32 = 7168 = 14 sectors to read)
LogicalSectors dw 2880 ; Number of logical sectors
MediumByte db 0F0h ; Medium descriptor byte
SectorsPerTrack dw 18 ; Sectors per track (36/cylinder)
Sides dw 2 ; Number of sides/heads
HiddenSectors dd 0 ; Number of hidden sectors
LargeSectors dd 0 ; Number of LBA sectors
DriveNo dw 0 ; Drive No: 0
Signature db 41 ; Drive signature: 41 for disk
VolumeID dd 00000000h
VolumeLabel db "SMA-OP "
FileSystem db "DSP "
SMA.Load:
mov ah, 02h
mov al, 37
mov ch, 1
mov cl, 2
mov dh, 1
int 13h
ret
Boot:
mov ax, 07C0h ; Set up 4K of stack space above Buffer
add ax, 544 ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
cli ; Disable interrupts while changing stack
mov ss, ax
mov sp, 4096
sti ; Restore interrupts
mov ax, 07C0h ; Set data segment to where we're loaded
mov ds, ax
; NOTE: A few early BIOSes are reported to improperly set DL
cmp dl, 0
je NoChange
mov [BootDev], dl ; Save boot device number
mov ah, 8h ; Get drive parameters
int 13h
jc FatalDiskError
mov cx, 32768
call SMA.Load
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
mov di, 0
pop si
jmp 32768
NoChange:
mov eax, 0
PrintString:
pusha
mov ah, 0Eh
.write:
lodsb
cmp al, 0
je .done
int 10h
jmp short .write
.done:
popa
ret
FatalDiskError:
mov si, DiskError
call PrintString
Reboot:
mov ax, 0
int 16h ; Wait for keystroke
mov ax, 0
int 19h
KernelFname db "SMA BIN"
DiskError db "HDD error! Press any key.", 0
KernelMiss db "Kernel file SMA.BIN missing.", 0
BootDev db 0 ; Boot device number
Cluster dw 0 ; Cluster of the file we want to load
Pointer dw 0 ; Pointer into Buffer, for loading kernel
times 510-($-$$) db 0 ; Pad remainder of boot sector with zeros
dw 0AA55h ; Boot signature (DO NOT CHANGE!)
Buffer: ; Disk Buffer begins (8k after this, stack starts)
Dal jsem to jako první sektor - druhý je kernel. Proto jsem dal cl na 2 a zabírá to 37 sektorů. Tak myslíš, že to pojede?
S MBR i VBR si hraji dnes a denně... Tedy máš pravdu - to znamená - před BootSector mám ještě nacpat MBR? (Ten asi ukradnu FATu.)


Domiy:15.6.2013 16:01
Nee - blbnu... Zde MBR nemám a ani mít nemohu - toto tedy je partition. V prvním sektoru to mám, tak pokud je kód vpořádku, musí to jet...
MBR není nutnou součástí disku. Stačí, když bude začínat rovnou boot sektorem, tedy tím tvým kódem.
U tvého kódu si nejsem moc jistý správností rutiny SMA.Load. Nevím, zda jsi správně specifikoval sektor, hlavu a číslo rozhraní (drive). To musíš vědět sám. Nikde tam ale nevidm, že by jsi specifikoval adresu, kam ty sektory chceš v paměti načíst, což se udává dvojicí registrů ES:BX.


Domiy:15.6.2013 16:36
mov cx, 32768
Mám to už nevím odkud, ale bylo to ve VFAT. Jediné co se změní se změnou souborového systému je vyhledávání souborů - ale načítání by mělo být stejné... Takže jsem jen zahodil vyhledávání a nacvakal pevné údaje. Jak jsem ostatně již psal. Od té doby (co se vše nacvakané v BootSectoru načte) se již ostatní soubory budou zapisovat do načtených...
Ale zdá se, že je to chyba. V kernelu již používám proměnnou DiskBuffer...
Takže:
mov si, 32768
mov bx, si
?
Děkuji.


Domiy:15.6.2013 16:43
Jistý si buď sektorem - ostatním si nejsem jist ani já. Vzal jsem to z
logiky - první dráhu to překročit nemohlo. A jak to je v praxi s halvou...
(Já jen na sebe nalepil
všechny soubory tak, jak bylo třeba - netuším, jak je to na disku. Žádný
nástroj jsem právě nenašel.)


Domiy:15.6.2013 16:47
Disk je přeci tady:
mov [BootDev], dl
mov ah, 8h
int 13h
Později to snad nějak rozvětvím...
Já to s těma CHS adresama také moc neumím. Zkoušel jsem to cca před pěti lety a ani nevím, zda jsem to tehdy naprogramoval dobře, protože pár dní na to díky chybě v synchronizaci zmizela většina souborového systému z disku...
Myslím, že by bylo lepší se problémy s cylindry, hlavami, stopami a sektory vyhnout tím, že pro čtení využiješ funkci 42h (Extended Read) viz http://en.wikipedia.org/wiki/Int_13h#…. Pak se stačí jen zadat číslo sektoru a je hotovo.
U toho tvého kódu ještě nevidím nastavovaní registru ES, který bys mohl třeba vynulovat předtím, než načítáš ty sektory (aby ES:BX ukazovalo na nějaou rozumnou adresu).


Domiy:15.6.2013 17:59
Nevidím tam registr pro parametr sektoru a počtu sektorů k načtení do paměti... Paměť je mi jedno jaká to bude - prostě do ní pak skočím... (Jak sám jistě vidíš...)


Domiy:15.6.2013 18:03
Ale já tu adresu nastavil - ne?
mov si, 32768
mov bx, si
Nebo alespoň to jsem tam měl před změnou souborového systému a běželo to...


Domiy:15.6.2013 18:23
Vyčištěno:
BITS 16
jmp short Boot
nop
OEMLabel db "SMA-BOOT" ; Disk label
BytesPerSector dw 512 ; Bytes per sector
SectorsPerCluster db 1 ; Sectors per Cluster
ReservedForBoot dw 1 ; Reserved sectors for boot record
LogicalSectors dw 2880 ; Number of logical sectors
MediumByte db 0F0h ; Medium descriptor byte
SectorsPerTrack dw 18 ; Sectors per track (36/cylinder)
Sides dw 2 ; Number of sides/heads
HiddenSectors dd 0 ; Number of hidden sectors
LargeSectors dd 0 ; Number of LBA sectors
DriveNo dw 0 ; Drive No: 0
Signature db 41 ; Drive signature: 41 for disk
VolumeID dd 00000000h
VolumeLabel db "SMA-OP "
FileSystem db "DSP "
SMA.Load:
mov ah, 42h
mov al, 37
mov cl, 2
mov si, 32768
mov bx, si
int 13h
ret
Boot:
mov ax, 07C0h ; Set up 4K of stack space above Buffer
add ax, 544 ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
cli ; Disable interrupts while changing stack
mov ss, ax
mov sp, 4096
sti ; Restore interrupts
mov ax, 07C0h ; Set data segment to where we're loaded
mov ds, ax
; NOTE: A few early BIOSes are reported to improperly set DL
cmp dl, 0
je NoChange
mov [bootDev], dl ; Save boot device number
mov ah, 8h ; Get drive parameters
int 13h
jc FataldiskError
NoChange:
mov eax, 0
mov cx, 32768
call SMA.Load
jc FataldiskError
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
mov di, 0
mov si, 0
jmp 32768
PrintString:
pusha
mov ah, 0Eh
.write:
lodsb
cmp al, 0
je .done
int 10h
jmp short .write
.done:
popa
ret
FataldiskError:
mov si, diskError
call PrintString
Reboot:
mov ax, 0
int 16h ; Wait for keystroke
mov ax, 0
int 19h
diskError db "Disk error! Press any key...", 0
bootDev db 0 ; Boot device number
times 510-($-$$) db 0 ; Pad remainder of boot sector with zeros
dw 0AA55h ; Boot signature (DO NOT CHANGE!)
Buffer: ; Disk Buffer begins (8k after this, stack starts)
Jediné čím si nejsem jist - zda se správně nastaví buffer. To se
dozvím později...
Ten buffer pro načtená data je určen registry ES:BX. Nevidím tam nikde, že bys nastavoval registr ES. Ale je možné, že tento registr je ve výchozím nastavení nulový, takže není pořádně co nastavovat.
Ta funkce 42h (Extended Read) funguje jinak - parametry operace se ukládají do paměti, ne do registrů AFAIK.
Tohle je část mého MBR, která načítá originální MBR, který je uložen na sektoru 1 (druhý sektor).
mov ax, 04200h
push ax
mov dx, 80h
mov si, @data
add si, 6000h
push si
int 13h
pop si
jmp nekam_dal
data:
dw 10h ; structure length
dw 1 ; sector count
dw 7c00h ; buffer address (offset)
dw 0 ; buffer address (segment)
dd 1 ; Secntor number (low 32 bits)
dd 0 ; Sector number (high 32 bits)
nekam_dal:


Domiy:15.6.2013 19:02
Nechceš mi poslat kód pro můj případ? (Jsem zničen z toho dorovnání kernelu. Vše je při stavění správně, ale výsledek je větší o 2 sektory - poslední navíc není plný...)


Domiy:15.6.2013 19:38
Je to tam! Ještě to
zobecním pro všechny vstupy a juknu se na toto...


Domiy:16.6.2013 6:46
SMA.Load:
mov ah, 42h
mov si, .SMA.Load.Params
mov dl, bootDev
int 13h
ret
.SMA.Load.Params:
dw 10h ; structure length
dw 38 ; sector count
dw 7c00h ; buffer address (offset)
dw 0 ; buffer address (segment)
dd 1 ; Secntor number (low 32 bits)
dd 0 ; Sector number (high 32 bits)
Skáči tedy na 7c00h, jenže nic se nenačte... První věc - jedná se o
druhý, nebo první sektor? Tedy má myšlenka - když nastavím velikost
sektoru na 1024, tak VBR přeci bude pořád 512 - ne? Takže mám VBR
zahrnovat? Druhá věc - co znamená údaj "structure length"?
Děkuji.
Skáči tedy na 7c00h
Jakým způsobem to spouštíš a ladíš? Na jaké adrese se nachází tento boot. sektor?
První věc - jedná se o druhý, nebo první sektor?
Druhý sektor. U LBA se sektory číslují od nuly.
co znamená údaj "structure length"?
Velikost struktury s parametry služby 42h, předávané v DS:SI. Viz Wikipedie nebo třeba Ralph Brown's Interrupt List (či jiná dokumentace, kde se popisují přerušení BIOSu).


Domiy:16.6.2013 11:36
Pokud se čísluje od 0, tak je to 1. sektor - ne? (0 = BootSector, 1 = Kernel - kernel je hned za VBR) Jde mi o to, že když dám velikost sektoru 1024, VBR bude stejně 512 - ne? A jak by mohl číst 512byte sektor s nastaveným sektorem 1024... Nehádám se - jen si potřebuji udělat jasno. VBR se tedy počítá?
Aktuální stav:
BITS 16
SMA.Load.Params:
dw 10h ; structure length
dw 38 ; sector count
dw 7c00h ; buffer address (offset)
dw 0 ; buffer address (segment)
dd 0 ; Secntor number (low 32 bits)
dd 2 ; Sector number (high 32 bits)
jmp short Boot
nop
OEMLabel db "SMA-BOOT" ; Disk label
BytesPerSector dw 512 ; Bytes per sector
SectorsPerCluster db 1 ; Sectors per Cluster
ReservedForBoot dw 1 ; Reserved sectors for boot record
LogicalSectors dw 2880 ; Number of logical sectors
MediumByte db 0F0h ; Medium descriptor byte
SectorsPerTrack dw 18 ; Sectors per track (36/cylinder)
Sides dw 2 ; Number of sides/heads
HiddenSectors dd 0 ; Number of hidden sectors
LargeSectors dd 0 ; Number of LBA sectors
DriveNo dw 0 ; Drive No: 0
Signature db 41 ; Drive signature: 41 for disk
VolumeID dd 00000000h
VolumeLabel db "SMA-OP "
FileSystem db "DSP "
SMA.Load:
mov ah, 42h
mov si, SMA.Load.Params
mov dl, bootDev
int 13h
ret
Boot:
mov ax, 07C0h ; Set up 4K of stack space above Buffer
add ax, 544 ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
cli ; Disable interrupts while changing stack
mov ss, ax
mov sp, 4096
sti ; Restore interrupts
cmp dl, 0 ; A few early BIOSes are reported to improperly set DL
je NoChange
mov [bootDev], dl ; Save boot device number
mov ah, 8h ; Get drive parameters
int 13h
jc FataldiskError
NoChange:
mov eax, 0
call SMA.Load
jc FataldiskError
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
mov di, 0
mov si, 0
jmp 7c00h
PrintString:
pusha
mov ah, 0Eh
.write:
lodsb
cmp al, 0
je .done
int 10h
jmp short .write
.done:
popa
ret
FataldiskError:
mov si, diskError
call PrintString
Reboot:
mov ax, 0
int 16h ; Wait for keystroke
mov ax, 0
int 19h
diskError db "Disk error! Press any key...", 0xA, 0
bootDev db 0 ; Boot device number
times 510-($-$$) db 0 ; Pad remainder of boot sector with zeros
dw 0AA55h ; Boot signature (DO NOT CHANGE!)
Buffer: ; Disk Buffer begins (8k after this, stack starts)
Jak jsem psal již někde nahoře - chci jen ušetřit zbytečné hledání a přesně vytyčit co z BootSectoru načíst. (Kernel jen pro začátek.) Kernel si pak již přečte načtené atd.
A aktuálně skládám soubory do systému přeložením do binární podoby, dorovnáním do čísla dělitelného 512 a přilepením do fronty... Jak se mi podaří spustit kernel, přidám své vysněné soubory a systémové funkce... (Stejným způsobem.)


Domiy:16.6.2013 11:42
A mám na tebe ještě jeden dotaz. Jak si vezme počítač ty parametry nahoře:
OEMLabel db "SMA-BOOT" ; Disk label
BytesPerSector dw 512 ; Bytes per sector
SectorsPerCluster db 1 ; Sectors per Cluster
ReservedForBoot dw 1 ; Reserved sectors for boot record
LogicalSectors dw 2880 ; Number of logical sectors
MediumByte db 0F0h ; Medium descriptor byte
SectorsPerTrack dw 18 ; Sectors per track (36/cylinder)
Sides dw 2 ; Number of sides/heads
HiddenSectors dd 0 ; Number of hidden sectors
LargeSectors dd 0 ; Number of LBA sectors
DriveNo dw 0 ; Drive No: 0
Signature db 41 ; Drive signature: 41 for disk
VolumeID dd 00000000h
VolumeLabel db "SMA-OP "
FileSystem db "DSP "
Nikde jsem nenašel jak to funguje. Záleží na čem? Na pojmenování? (minimálně case je všude jiné) Myslíš, že mám vše potřebné ke správnému čtení clusterů a hlavně sektorů?
Díky.
A mám na tebe ještě jeden dotaz. Jak si vezme počítač ty parametry nahoře
komponentě zodpovědné za práci se souborovými systémy FAT je srdečně jedno, jak si jednotlivé položky v boot. sektoru pojmenuješ. Klidně si můžeš vzít Erbenova Vodníka a jako názvy jednotlivých položek zvolit jeho úvodní vere. Operační systém názvy nevidí, vidí jen výslednou strukturu boot. sektoru po překladu. Takže pro něj je důležité, aby všechny položky byly na správném místě a aby obsahovaly správná data.
V tom kódu výše jsi předřadil ta data pro 13h Extended Read začátku toho boot. sektoru, takže se v tom FAT driver absolutně nevyzná. Ta data umisti někam do bootovacího kódu. A tak, jak jsi je upravil, tak se bude driver pokoušet načíst sektor s číslem 200000000h (číslováno od nuly), což asi nechceš. x86 je little-endian platforma.
Nechci se tě dotknout, ale doporučoval bych ti si přečíst nějakou knížku o obecných pricnipech, které se v operačních systémech používají (včetně souborových systémů). Docela dobrá knížka je třeba http://www.amazon.com/…p/0131429388. V mojí knize je toho také docela dost platného nejen pro Windows, ale ta cena za to je pro tebe moc vysoká.


Domiy:16.6.2013 13:13
Já si to myslel... (Že to bere jako celek.)
Pozice struktury parametrů jsem se snažil zařadit tak, aby to nevzalo co nemá... Takže:
BITS 16
jmp short Boot
nop
OEMLabel db "SMA-BOOT" ; Disk label
BytesPerSector dw 512 ; Bytes per sector
SectorsPerCluster db 1 ; Sectors per Cluster
ReservedForBoot dw 1 ; Reserved sectors for boot record
NumberOfDSPs db 2 ; Number of copies of the DSP
RootDirEntries dw 224 ; Number of entries in root dir
; (224 * 32 = 7168 = 14 sectors to read)
LogicalSectors dw 2880 ; Number of logical sectors
MediumByte db 0F0h ; Medium descriptor byte
SectorsPerDSP dw 9 ; Sectors per DSP
SectorsPerTrack dw 18 ; Sectors per track (36/cylinder)
Sides dw 2 ; Number of sides/heads
HiddenSectors dd 0 ; Number of hidden sectors
LargeSectors dd 0 ; Number of LBA sectors
DriveNo dw 0 ; Drive No: 0
Signature db 41 ; Drive signature: 41 for disk
VolumeID dd 00000000h
VolumeLabel db "SMA-OP "
FileSystem db "DSP "
SMA.Load:
mov ah, 42h
mov si, .SMA.Load.Params
mov dl, bootDev
int 13h
ret
.SMA.Load.Params:
dw 10h ; structure length
dw 38 ; sector count
dw 7c00h ; buffer address (offset)
dw 0 ; buffer address (segment)
dd 0 ; Secntor number (low 32 bits)
dd 2 ; Sector number (high 32 bits)
Boot:
mov ax, 07C0h ; Set up 4K of stack space above Buffer
add ax, 544 ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
cli ; Disable interrupts while changing stack
mov ss, ax
mov sp, 4096
sti ; Restore interrupts
cmp dl, 0 ; A few early BIOSes are reported to improperly set DL
je NoChange
mov [bootDev], dl ; Save boot device number
mov ah, 8h ; Get drive parameters
int 13h
jc FataldiskError
NoChange:
mov eax, 0
call SMA.Load
jc FataldiskError
mov ax, 0
mov bx, 0
mov cx, 0
mov dx, 0
mov di, 0
mov si, 0
jmp 7c00h
PrintString:
pusha
mov ah, 0Eh
.write:
lodsb
cmp al, 0
je .done
int 10h
jmp short .write
.done:
popa
ret
FataldiskError:
mov si, diskError
call PrintString
Reboot:
mov ax, 0
int 16h ; Wait for keystroke
mov ax, 0
int 19h
diskError db "Disk error! Press any key...", 0xA, 0
bootDev db 0 ; Boot device number
times 510-($-$$) db 0 ; Pad remainder of boot sector with zeros
dw 0AA55h ; Boot signature (DO NOT CHANGE!)
Buffer: ; Disk Buffer begins (8k after this, stack starts)
?
dw 10h ; structure length
dw 38 ; sector count
dw 7c00h ; buffer address (offset)
dw 0 ; buffer address (segment)
dd 0 ; Secntor number (low 32 bits)
dd 2
bych upravil na
dw 10h ; structure length
dw 38 ; sector count
dw 7c00h ; buffer address (offset)
dw 0 ; buffer address (segment)
dd 2 ; Secntor number (low 32 bits)
dd 0
pokud chceš načíst sektor s číslem 2 (který předcházejí sektory s číslem 0 a 1).


Domiy:17.6.2013 15:28
Už mi pomohl ten kamarád, co mi opravil disk. Sector a Secntor je jako AX a AL.
.SMA.Load.Params:
dw 10h ; structure length
dw 38 ; sector count
dw 7c00h ; buffer address (offset)
dw 0 ; buffer address (segment)
dd 1 ; Secntor number (low 32 bits)
dd 0 ; Sector number (high 32 bits)
Nejde. Kernel je hned za VBR a má 38 sektorů. (disk s VBR 39) Chci načíst
ten kernel. Tak jak? (zoufale)
Díky.
Jakým způsobem to spouštíš? Ono by to asi chtělo si rozchodit nějaké ladící prostředí pro tyto účely (nevím, zda bude stačit zkompilovat Bochs v debug módu).


Domiy:17.6.2013 16:52
Vždyť tu vše je - načtu to do adresy, na kterou pak skočím... Vše je napsané v Assembly - takže kernel překládám do binárního souboru. Když to bylo ve VFATu, vše jelo. Změnil jsem pouze to, že již nehledám hlavní adresář a kernel.
Vždyť tu vše je
Já se jen snažím naznačit, že je někdy dobré si ten kód odkrokovat, aby člověk věděl, co se opravdu děje. Zvláště v těchto případech. A to zastáncem používání debuggermu nejsem.
Napadá mě ještě pár věcí:
- na jaké adrese tvůj bootsektor předpokládá, že poběží? Na 0x7C00?
- Pe takovým způsobem opravdu kompilován (tzn. absolutní adresy jsou překládány na 7Cxxh? Zvláště u SMA.Load.Params)?
- Pokud je tvůj bootsector na adrese 0x7c00 a kernel načítáš také na adresu 0x7c00, nepřepíšeš si tím kód tvého bootsektoru, takže do kernelu nikdy neskočíš (když si třeba disassembluješ MBR, tak ten se hned během prvních několika instrukcí kopíruje (relokuje) z 0x7c00 na 0x600)?
- Není chybně nastavován zásobník (registry SS:SP)? Provádíš to kódem:
mov ax, 07C0h ; Set up 4K of stack space above Buffer
add ax, 544 ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
cli ; Disable interrupts while changing stack
mov ss, ax
mov sp, 4096
sti
což znamená, že vrchol zásobníku je na 0x9e0:0x1000 = 0xAE00 (pokud dobře počítám). Přijde mi, že pokud má kernel 38 sektorů a jeho začátek je načten na 0x7c00, tak přepíše všechno až do adresy 0xC800, tedy i tvůj zásobník. Navíc případné pokusy o ukládání na zásobník přepisují kód kernelu.
Programování (zvláště v případech, kdy se těžko ladí) je podle mého názoru hodně o pokoře a o tom, že se snažíš nepředpokládat, že nejaká část tvého kódu je dobře, dokud to opravdu neověříš. Emoce sem nepatří.


Domiy:17.6.2013 17:44
Já jsem sem nepřivedl 7c00h. Ve VFAT verzi mám tu adresu 2000h. Kde píši, že je jaký kus kódu vpořádku? Copak se naopak neustále neptám, zda je to OK? Kde vidíš mé emoce?
I když ti já řeknu, že je to OK, tak to nic neznamená, protože jsem si ten kód nedal do VBR a nespustil. Což dělat nebudu, protože tu nemám připravené ladící prostředí (když jsem psal MBR, tak jsem to zkoušel bez ladění; stálo to více času, ale nakonec se to podařilo).
V poslední verzi tvého kódu jsem objevil ty věci, které jsem psal v minulém příspěvku. Pokud jsi je opravil a stále to nefunguje, je asi čas si to zkusit prokrokovat. Což není legrace, protože nainstalovat nějaké prostředí, ve kterém to půjde, asi nebude snadné.


Domiy:18.6.2013 7:16
Vzal jsem vše potřebné z VFAT a stejně k ničemu...
BITS 16
jmp short Boot
nop
db "SMA-BOOT" ; Disk label
dw 512 ; Bytes per sector
db 1 ; Sectors per Cluster
dw 1 ; Reserved sectors for boot record
db 2 ; Number of copies of the DSP
dw 0 ; Number of root directory entires
dw 39 ; Number of logical sectors
db 0F0h ; Medium descriptor byte
dw 0 ; Sectors per FAT
dw 63 ; Sectors per track
dw 2 ; Number of sides/heads
dd 0 ; Number of hidden sectors
dd 0 ; Number of LBA sectors
dw 0 ; Drive No: 0
db 41 ; Drive signature: 41 for disk
dd 00000000h ; Volume ID
db "SMA-OP " ; Volume label
db "DSP " ; File System
Boot:
mov ax, 07C0h ; Set up 4K of stack space above Buffer
add ax, 544 ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
cli ; Disable interrupts while changing stack
mov ss, ax
mov sp, 4096
sti ; Restore interrupts
cmp dl, 0 ; A few early BIOSes are reported to improperly set DL
je NoChange
mov ah, 8h ; Get drive parameters
int 13h
jc FataldiskError
NoChange:
mov eax, 0 ; Prepare to enter loop
call SMA.Load
jc FataldiskError
jmp 2000h:0000h
PrintString:
pusha
mov ah, 0Eh
.write:
lodsb
cmp al, 0
je .done
int 10h
jmp short .write
.done:
popa
ret
SMA.Load:
mov ah, 42h
mov si, .SMA.Load.Params
int 13h
ret
.SMA.Load.Params:
dw 10h ; structure length
dw 38 ; sector count
dw Buffer ; buffer address (offset)
dw 2000h ; buffer address (segment)
dd 1 ; Secntor number (low 32 bits)
dd 0 ; Sector number (high 32 bits)
FataldiskError:
mov si, diskError
call PrintString
Reboot:
mov ax, 0
int 16h ; Wait for keystroke
mov ax, 0
int 19h
diskError db "Disk error! Press any key...", 0
times 510-($-$$) db 0 ; Pad remainder of boot sector with zeros
dw 0AA55h ; Boot signature (DO NOT CHANGE!)
Buffer: ; Disk Buffer begins (8k after this, stack starts)
BITS 16
jmp short Boot
nop
OEMLabel db "SMA-BOOT" ; Disk label
BytesPerSector dw 512 ; Bytes per sector
SectorsPerCluster db 1 ; Sectors per Cluster
ReservedForBoot dw 1 ; Reserved sectors for boot record
NumberOfFATs db 2 ; Number of copies of the FAT
RootDirEntries dw 224 ; Number of entries in root dir
; (224 * 32 = 7168 = 14 sectors to read)
LogicalSectors dw 2880 ; Number of logical sectors
MediumByte db 0F0h ; Medium descriptor byte
SectorsPerFAT dw 9 ; Sectors per FAT
SectorsPerTrack dw 18 ; Sectors per track (36/cylinder)
Sides dw 2 ; Number of sides/heads
HiddenSectors dd 0 ; Number of hidden sectors
LargeSectors dd 0 ; Number of LBA sectors
DriveNo dw 0 ; Drive No: 0
Signature db 41 ; Drive signature: 41 for disk
VolumeID dd 00000000h ; Volume ID: any number
VolumeLabel db "SMA-OP " ; Volume Label: any 11 chars
FileSystem db "FAT12 " ; File system type: don't change!
Boot:
mov ax, 07C0h ; Set up 4K of stack space above Buffer
add ax, 544 ; 8k Buffer = 512 paragraphs + 32 paragraphs (loader)
cli ; Disable interrupts while changing stack
mov ss, ax
mov sp, 4096
sti ; Restore interrupts
mov ax, 07C0h ; Set data segment to where we're loaded
mov ds, ax
; NOTE: A few early BIOSes are reported to improperly set DL
cmp dl, 0
je NoChange
mov [BootDev], dl ; Save boot device number
mov ah, 8 ; Get drive parameters
int 13h
jc FatalDiskError
and cx, 3Fh ; Maximum sector number
mov [SectorsPerTrack], cx ; Sector numbers start at 1
movzx dx, dh ; Maximum head number
add dx, 1 ; Head numbers start at 0 - add 1 for total
mov [Sides], dx
NoChange:
mov eax, 0 ; Needed for some older BIOSes
; First, we need to load the root directory from the disk. Technical details:
; Start of root = ReservedForBoot + NumberOfFATs * SectorsPerFAT = logical 19
; Number of root = RootDirEntries * 32 bytes/entry / 512 bytes/sector = 14
; Start of user data = (start of root) + (number of root) = logical 33
DiskOK: ; Ready to read first block of data
mov ax, 19 ; Root dir starts at logical sector 19
call l2hts
mov si, Buffer ; Set ES:BX to point to our Buffer (see End of code)
mov bx, ds
mov es, bx
mov bx, si
mov ah, 2 ; Params for int 13h: read disk sectors
mov al, 14 ; And read 14 of them
pusha ; Prepare to enter loop
ReadRootDir:
popa ; In case registers are altered by int 13h
pusha
stc ; A few BIOSes do not set properly on error
int 13h ; Read sectors using BIOS
jnc SearchDir ; If read went OK, skip ahead
call ResetDisk ; Otherwise, reset disk controller and try again
jnc ReadRootDir ; Floppy reset OK?
jmp Reboot ; If not, Fatal double error
SearchDir:
popa
mov ax, ds ; Root dir is now in [Buffer]
mov es, ax ; Set DI to this info
mov di, Buffer
mov cx, word [RootDirEntries] ; Search all (224) entries
mov ax, 0 ; Searching at offset 0
NextRootEntry:
xchg cx, dx ; We use CX in the inner loop...
mov si, KernelFname ; Start searching for kernel filename
mov cx, 11
rep cmpsb
je FoundFileToLoad ; Pointer DI will be at offset 11
add ax, 32 ; Bump searched entries by 1 (32 bytes per entry)
mov di, Buffer ; Point to next entry
add di, ax
xchg dx, cx ; Get the original CX back
loop NextRootEntry
mov si, KernelMiss ; If kernel is not found, bail out
call PrintString
jmp Reboot
FoundFileToLoad: ; Fetch Cluster and load FAT into RAM
mov ax, word [es:di+0Fh] ; Offset 11 + 15 = 26, contains 1st Cluster
mov word [Cluster], ax
mov ax, 1 ; Sector 1 = first sector of first FAT
call l2hts
mov di, Buffer ; ES:BX points to our Buffer
mov bx, di
mov ah, 2 ; int 13h params: read (FAT) sectors
mov al, 9 ; All 9 sectors of 1st FAT
pusha ; Prepare to enter loop
ReadFAT:
popa ; In case registers are altered by int 13h
pusha
stc
int 13h ; Read sectors using the BIOS
jnc ReadFAT_OK ; If read went OK, skip ahead
call ResetDisk ; Otherwise, reset disk controller and try again
jnc ReadFAT ; Floppy reset OK?
FatalDiskError:
mov si, DiskError ; If not, print error message and Reboot
call PrintString
jmp Reboot ; Fatal double error
ReadFAT_OK:
popa
mov ax, 2000h ; Segment where we'll load the kernel
mov es, ax
mov bx, 0
mov ah, 2 ; int 13h disk read params
mov al, 1
push ax ; Save in case we (or int calls) lose it
; Now we must load the FAT from the disk. Here's how we find out where it starts:
; FAT Cluster 0 = media descriptor = 0F0h
; FAT Cluster 1 = filler Cluster = 0FFh
; Cluster start = ((Cluster number) - 2) * SectorsPerCluster + (start of user)
; = (Cluster number) + 31
LoadFileSector:
mov ax, word [Cluster] ; Convert sector to logical
add ax, 31
call l2hts ; Make appropriate params for int 13h
mov ax, 2000h
mov es, ax
mov bx, word [Pointer]
pop ax
push ax
stc
int 13h
jnc CalculateNextCluster
call ResetDisk
jmp LoadFileSector
CalculateNextCluster:
mov ax, [Cluster]
mov dx, 0
mov bx, 3
mul bx
mov bx, 2
div bx ; DX = [Cluster] mod 2
mov si, Buffer
add si, ax ; AX = word in FAT for the 12 bit entry
mov ax, word [ds:si]
or dx, dx ; If DX = 0 [Cluster] is Even; if DX = 1 then it's Odd
jz Even ; If [Cluster] is Even, drop last 4 bits of word
; with next Cluster; if Odd, drop first 4 bits
Odd:
shr ax, 4 ; Shift out first 4 bits (they belong to another entry)
jmp short NextClusterCont
Even:
and ax, 0FFFh ; Mask out final 4 bits
NextClusterCont:
mov word [Cluster], ax ; Store Cluster
cmp ax, 0FF8h ; FF8h = End of file marker in FAT12
jae End
add word [Pointer], 512 ; Increase Buffer Pointer 1 sector length
jmp LoadFileSector
End: ; We've got the file to load!
pop ax ; Clean up the stack (AX was pushed earlier)
mov dl, byte [BootDev] ; Provide kernel with boot device info
jmp 2000h:0000h ; Jump to entry point of loaded kernel!
Reboot:
mov ax, 0
int 16h ; Wait for keystroke
mov ax, 0
int 19h ; Reboot the system
PrintString:
pusha
mov ah, 0Eh
.write:
lodsb
cmp al, 0
je .done
int 10h
jmp short .write
.done:
popa
ret
ResetDisk:
push ax
push dx
mov ax, 0
mov dl, byte [BootDev]
stc
int 13h
pop dx
pop ax
ret
l2hts: ; Calculate head, track and sector settings for int 13h
; IN: logical sector in AX, OUT: correct registers for int 13h
push bx
push ax
mov bx, ax ; Save logical sector
mov dx, 0 ; First the sector
div word [SectorsPerTrack]
add dl, 01h ; Physical sectors start at 1
mov cl, dl ; Sectors belong in CL for int 13h
mov ax, bx
mov dx, 0 ; Now calculate the head
div word [SectorsPerTrack]
mov dx, 0
div word [Sides]
mov dh, dl ; Head/side
mov ch, al ; Track
pop ax
pop bx
mov dl, byte [BootDev] ; Set correct device
ret
KernelFname db "SMA BIN"
DiskError db "HDD error! Press any key.", 0
KernelMiss db "Kernel file SMA.BIN missing.", 0
BootDev db 0 ; Boot device number
Cluster dw 0 ; Cluster of the file we want to load
Pointer dw 0 ; Pointer into Buffer, for loading kernel
times 510-($-$$) db 0 ; Pad remainder of boot sector with zeros
dw 0AA55h ; Boot signature (DO NOT CHANGE!)
Buffer: ; Disk Buffer begins (8k after this, stack starts)
První nejde, druhé ano - kde je rozdíl?
Podle mě načítáš data kernelu na 0x2000:0x0200, ne na 0x2000:0x0000, kam skáčeš.


Domiy:18.6.2013 15:23
Nic. Tedy obě verze způsobí vypsání písmene S do TTY, ale netuším, co
si o tom mám myslet...


Domiy:18.6.2013 15:31
Kernel:
BITS 16
%define InterpreterBAS.Version '6.0'
%define APIVersion 16
; This is the location in RAM for kernel disk operations, 24K
; after the point where the kernel has loaded; it's 8K in size,
; because external programs load after it at the 32K point:
DiskBuffer equ 24576
; The comments show exact locations of instructions in this section,
; and are used in programs/smadev.inc so that an external program can
; use a SMA-OP system call without having to know its exact position
; in the kernel source code...
OsCallVectors:
jmp Main
jmp InterpreterBAS.Run ; 0003h
jmp InterpreterBAS.Pause ; 0006h
jmp InterpreterBAS.FatalError ; 0009h
jmp System.ApiVersion ; 000Ch
jmp Console.WaitForKey ; 000Fh
jmp Console.WriteHline ; 0012h
jmp Console.PrintRegs ; 0015h
jmp Console.NewLine ; 0018h
jmp Console.ReadLine ; 001Bh
jmp Console.NibbleAL ; 001Eh
jmp Console.ReadKey ; 0021h
jmp Console.DigitAX ; 0024h
jmp Console.PrintAL ; 0027h
jmp Console.PrintAX ; 002Ah
jmp Console.Space ; 002Dh
jmp Console.Write ; 0030h
jmp Console.Clear ; 0033h
jmp Cursor.Location ; 0036h
jmp Cursor.Move ; 0039h
jmp Cursor.Show ; 003Ch
jmp Cursor.Hide ; 003Fh
jmp String.Join ; 0042h
jmp String.Strip ; 0045h
jmp String.Time ; 0048h
jmp String.Date ; 004Bh
jmp String.Parse ; 004Eh
jmp String.Copy ; 0051h
jmp String.Dump ; 0054h
jmp String.Upper ; 0057h
jmp String.Lower ; 005Ah
jmp String.Length ; 005Dh
jmp String.Chomp ; 0060h
jmp String.Reverse ; 0063h
jmp String.IndexOf ; 0066h
jmp String.TimeFmt ; 0069h
jmp String.DateFmt ; 006Ch
jmp String.Truncate ; 006Fh
jmp String.Tokenize ; 0072h
jmp String.Compare ; 0075h
jmp String.ReplaceChar ; 0078h
jmp String.SubCompare ; 007Bh
jmp Int.Parse ; 007Eh
jmp Int.ToString ; 0081h
jmp SInt.ToString ; 0084h
jmp LInt.ToString ; 0087h
jmp DialogBox.File ; 008Ah
jmp DialogBox.List ; 008Dh
jmp DialogBox.Plain ; 0090h
jmp DialogBox.Input ; 0093h
jmp DialogBox.DrawBlock ; 0096h
jmp Math.Random ; 0099h
jmp Math.BcdToInt ; 009Ch
jmp Math.LIntNegate ; 009Fh
jmp File.Size ; 00A2h
jmp File.Load ; 00A5h
jmp File.Save ; 00A8h
jmp File.Exists ; 00ABh
jmp File.Create ; 00AEh
jmp File.Remove ; 00B1h
jmp File.Rename ; 00B4h
jmp Disk.FileList ; 00B7h
jmp Port.SendByte ; 00BAh
jmp Port.SpeakerOn ; 00BDh
jmp Port.SpeakerOff ; 00C0h
jmp Port.ReceiveByte ; 00C3h
jmp Port.GetViaSerial ; 00C6h
jmp Port.SendViaSerial ; 00C9h
jmp Port.SerialPort.Enable ; 00CCh
jmp Gshell.DrawBack ; 00CFh
Main:
cli ; Clear interrupts
mov ax, 0
mov ss, ax ; Set stack segment and pointer
mov sp, 0FFFFh
sti ; Restore interrupts
cld ; The default direction for string operations will be 'up' - incrementing address in RAM
mov ax, 2000h ; Set all segments to match where kernel is loaded
mov ds, ax ; After this, we don't need to bother with
mov es, ax ; segments ever again, as SMA-OP and its programs
mov fs, ax ; live entirely in 64K
mov gs, ax
cmp dl, 0
je .NoChange
mov [bootdev], dl ; Save boot device number
push es
mov ah, 8 ; Get drive parameters
int 13h
pop es
and cx, 3Fh ; Maximum sector number
mov [SecsPerTrack], cx ; Sector numbers start at 1
movzx dx, dh ; Maximum head number
add dx, 1 ; Head numbers start at 0 - add 1 for total
mov [Sides], dx
.NoChange:
mov ax, 1003h ; Set text output with certain attributes
mov bx, 0 ; to be bright, and not blinking
int 10h
call Console.Clear
call Iterp
Fmt1224 db 0 ; Non-zero = 24-hr format
FmtDate db 0, '/' ; 0, 1, 2 = M/D/Y, D/M/Y or Y/M/D
; Bit 7 = use name for months
; If bit 7 = 0, second byte = separator character
%include "features/Iterp.asm"
%include "features/System.asm"
%include "features/InterpreterBAS.asm"
%include "features/Gshell.asm"
%include "features/Console.asm"
%include "features/Cursor.asm"
%include "features/DialogBox.asm"
%include "features/Disk.asm"
%include "features/File.asm"
%include "features/Int.asm"
%include "features/Math.asm"
%include "features/Port.asm"
%include "features/String.asm"
Zobrazeno 76 zpráv z 76.