
рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдПрдХ
рдмреВрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдлреНрд▓реЙрдкреА рдбрд┐рд╕реНрдХ рдФрд░ рдПрдХ рд░реЗрдЯреНрд░реЛ рдЧреЗрдо рдмрдирд╛рдпрд╛ рдЬреЛ рдПрдХ рдЯреНрд╡реАрдЯ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддрд╛ рд╣реИред рддрдм рд╕реЗ, рдЯреНрд╡рд┐рдЯрд░ рдиреЗ рдЯреНрд╡реАрдЯреНрд╕ рдХреА рд▓рдВрдмрд╛рдИ рджреЛрдЧреБрдиреА рдХрд░ рджреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдмреВрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕реАрдбреА рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рдЯреНрд░реЙрди рдХрд╛ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред
perl -E 'say"A"x46422,"BDRDAwMQFFTCBUT1JJVE8gU1BFQ0lGSUNBVElPTg","A"x54,"Ew","A"x2634,"/0NEMDAxAQ","A"x2721,"BAAAAYQ","A"x30,"SVVVqogAAAAAAAEAF","A"x2676,"LMBaACgB76gfbgTAM0Qv8D4uYAI86qqgcc+AXP45GA8SHIRPFB3DTeYSEhyBSwCa8CwicMB3rSG/sHNFbRFJjAke9rrwQ","A"x2638'|base64 -D>cd.iso
рдЯреНрд╡реАрдЯ рдореЗрдВ рдХреЛрдб рдПрдХ рдмреВрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп CD-ROM рдЫрд╡рд┐ рдмрдирд╛рддрд╛ рд╣реИ:
cd.iso
ред рдЖрдк рдХреЛрдб рдХреЛ рдХреНрдпреВрдореВ рдпрд╛ рдЕрдкрдиреА рдкрд╕рдВрджреАрджрд╛ рдЖрднрд╛рд╕реА рдорд╢реАрди рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдФрд░ рддреАрд░ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВред рддреБрдо рднреА рдПрдХ рдЕрд╕рд▓реА рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕реАрдбреА-рдЖрд░ рдФрд░ рдмреВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдПрд╕рдУ рдЬрд▓рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╕реАрдбреА рдЗрдореЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ
рдЖрдИрдПрд╕рдУ 9660 рдХреА рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рд╕рдордЭ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдИрдПрд╕рдУ рдорд╛рдирдХреЛрдВ рд╡рд╛рд▓реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдЖрдорддреМрд░ рдкрд░ рдорд╣рдВрдЧреЗ рд╣реЛрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдИрдПрд╕рдУ 9660
рдИрд╕реАрдПрдордП 119 рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдореБрдлреНрдд рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
ISO 9660 рдореЗрдВ рдХрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ UDF, El Torito, RockRidge, Joliet, рдЖрджрд┐ред рдмреВрдЯ рдЗрдореЗрдЬ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓
El Torito рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдПрд▓ рдЯреЛрд░рд┐рдЯреЛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЦрд░рд╛рдм рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рд▓рд┐рдХрд╛ 7 рдореЗрдВ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐), рдпрд╣ рднреВрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдорд╛рди рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд╣реИрдВ (
0x
рдЙрдкрд╕рд░реНрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ), рд╕рдВрдЦреНрдпрд╛ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рд╣реИрдВ, рдЖрджрд┐ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реИред
рдмреВрдЯ рдбрд┐рд╕реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо 17 рдЦрд╛рд▓реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд▓рд┐рдЦрдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдмрд╛рдж рд╡реЙрд▓реНрдпреВрдо рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕реЗрдЯ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдХреНрдЯрд░ 2048 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред
рдиреЛрдЯред ISO-9660 рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╡реЙрд▓реНрдпреВрдо рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕реЗрдЯ рд╕реЗрдХреНрдЯрд░ 16 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдПрд▓ рдЯреЛрд░рд┐рдЯреЛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд╕реЗрдХреНрдЯрд░ 17 рдореЗрдВ рдмреВрдЯ рд░рд┐рдХреЙрд░реНрдб рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рд╕реЗрдХреНрдЯрд░ 16 рдореЗрдВ рдПрдХ рдбрдореА рд╡реЙрд▓реНрдпреВрдо рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред
рд╣рдо рдкрд╣рд▓рд╛ рд╡реЙрд▓реНрдпреВрдо рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
0x00 // Type (0 = boot record) 'CD001' // Identifier 0x01 // Version 'EL TORITO SPECIFICATION' // Boot System Identifier 9 x 0x00 // Padding 32 x 0x00 // Unused 0x13 0x00 0x00 0x00 // Boot Catalog address (in absolute sectors) 1973 x 0x00 // Unused
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡реЙрд▓реНрдпреВрдо рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕реЗрдЯ рдЯрд░реНрдорд┐рдиреЗрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
0xff // Type (255 = terminator) 'CD001' // Identifier 0x01 // Version 2041 x 0x00 // Unused
рд╡реЙрд▓реНрдпреВрдо рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдмреВрдЯ рдХреИрдЯрд▓реЙрдЧ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдПрд▓ рдЯреЛрд░рд┐рдЯреЛ рд╡рд┐рднрд┐рдиреНрди рдЙрддреНрд╕рд░реНрдЬрди рдореЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред CD-ROM рдПрдХ рдмреВрдЯ рдбрд┐рд╕реНрдХреЗрдЯ, рдмреВрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп HDD, рдЖрджрд┐ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрдореНрдпреВрд▓реЗрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЕрд░реНрдерд╛рддреН, BIOS рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛ - рдФрд░ рд╣рдорд╛рд░реЗ рдмреВрдЯрд▓реЛрдбрд░ рдХреЛ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред
рдЪреЗрдХрд╕рдо рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рд╕рднреА 16-рдмрд┐рдЯ рдорд╛рди 0 (mod 65536) рдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЬрд╛рдПрдВред
рдмреВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрд╣рд▓реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ (рд╕рддреНрдпрд╛рдкрди рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐):
0x01 // Header ID 0x00 // Platform ID (0 = Intel x86) 0x00 0x00 // Reserved 'a' // ID string 23 x 0x00 // Padding cksum cksum // Checksum (2 bytes) 0x55 0xaa // Key bytes
рджреВрд╕рд░рд╛ рд░рд┐рдХреЙрд░реНрдб (рдбрд┐рдлрд╝реЙрд▓реНрдЯ):
0x88 // Boot Indicator (0x88 = bootable) 0x00 // Boot Media Type (0 = no emulation) 0x00 0x00 // Load segment 0x00 // System Type 0x00 // Unused 0x01 0x00 // Number of sectors to load 0x14 0x00 0x00 0x00 // Virtual disk address (in absolute sectors) 20 x 0x00 // Unused
рдлрд┐рд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЕрдВрдд рддрдХ рд╢реВрдиреНрдп:
1984 x 0x00
рдЕрдЧрд▓рд╛ рд╕реЗрдХреНрдЯрд░ рд╣рдорд╛рд░рд╛ рдмреВрдЯрд▓реЛрдбрд░ рдФрд░ рд░реЗрдЯреНрд░реЛ рдЧреЗрдо рд╣реИ:
; to compile: ; nasm bootloader.asm -o bootloader.img [bits 16] ; Pragma, tells the assembler that we ; are in 16 bit mode (which is the state ; of x86 when booting from a floppy). [org 0x7C00] ; Pragma, tell the assembler where the ; code will be loaded. mov bl, 1 ; Starting direction for the worm. push 0xa000 ; Load address of VRAM into es. pop es restart_game: mov si, 320*100+160 ; worm's starting position, center of ; screen ; Set video mode. Mode 13h is VGA (1 byte per pixel with the actual ; color stored in a palette), 320x200 total size. mov ax, 0x0013 int 0x10 ; Draw borders. We assume the default palette will work for us. ; We also assume that starting at the bottom and drawing 2176 pixels ; wraps around and ends up drawing the top + bottom borders. mov di, 320*199 mov cx, 2176 rep draw_loop: stosb ; draw right border stosb ; draw left border add di, 318 jnc draw_loop ; notice the jump in the middle of the ; rep stosb instruction. game_loop: ; We read the keyboard input from port 0x60. This also reads bytes from ; the mouse, so we need to only handle [up (0x48), left (0x4b), ; right (0x4d), down (0x50)] in al, 0x60 cmp al, 0x48 jb kb_handle_end cmp al, 0x50 ja kb_handle_end ; At the end bx contains offset displacement (+1, -1, +320, -320) ; based on pressed/released keypad key. I bet there are a few bytes ; to shave around here given the bounds check above. aaa cbw dec ax dec ax jc kb_handle sub al, 2 imul ax, ax, byte -0x50 kb_handle: mov bx, ax kb_handle_end: add si, bx ; The original code used set pallete command (10h/0bh) to wait for ; the vertical retrace. Today's computers are however too fast, so ; we use int 15h 86h instead. This also shaves a few bytes. ; Note: you'll have to tweak cx+dx if you are running this on a virtual ; machine vs real hardware. Casual testing seems to show that virtual machines ; wait ~3-4x longer than physical hardware. mov ah, 0x86 inc cl int 0x15 ; Draw worm and check for collision with parity ; (even parity=collision). xor [es:si], ah ; Go back to the main game loop. jpo game_loop ; We hit a wall or the worm. Restart the game. jmp restart_game TIMES 2048 - ($ - $$) db 0 ; Fill the rest of the sector with 0
рдлрд┐рд░ рдореИрдВрдиреЗ рдмреВрдЯрд▓реЛрдбрд░ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ, рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдФрд░ рдПрдХ рдЯреНрд╡реАрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреАред рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рд╕реАрдбреА рдХреЛ рдЬрд▓рд╛ рджрд┐рдпрд╛ рдФрд░ рдЬрд╛рдБрдЪ рдХреА рдХрд┐
рд╕рдм рдХреБрдЫ рдЕрд╕рд▓реА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ред