global _main _main: mov ax, [now_screenid] mov cx, 0x1000 mul cx sub ax, 0x1000 add ax, 0x0050 mov [cs:shell_seg], ax mov sp, 0xF6F6 mov word [local_var_size],local_var_end sub word [local_var_size],local_var_start mov ax, word [local_var_size] cmp ax, 6144 je show_6144 call putint show_6144: set_environment: xor ax, ax push es mov es, ax db 0xE8 add al, [bx+si] db 0xEB db 0x05 pop ax sub sp, 2 ret ;-------------------------------------------------- do_memory_control: add ax, 0x17 cli mov [es:0x140], ax mov [es:0x142], cs sti jmp do_memory_control_end mov ax, 0x5301 xor bx, bx int 0x15 mov ax, 0x530E xor bx, bx mov cx, 0x0102 int 0x15 mov ax, 0x5307 mov bx, 0x0001 mov cx, 0x0003 int 0x15 iret do_memory_control_end: pop es ;-------------------------------------------------- reboot_int: xor ax, ax push es mov es, ax db 0xE8 add al, [bx+si] db 0xEB db 0x05 pop ax sub sp, 2 ret add ax, 0x17 cli mov [es:0x144], ax mov [es:0x146], cs sti jmp short reboot_int_end mov al, 0x0E mov dx, 0xCF9 out dx, al mov al, 0x06 out dx, al mov al, 0xFE out 0x64, al mov ax,0x0040 push ax pop ds xor ax, ax mov es, ax mov word [es:0x0027], 0x1234 mov ax, 0xFFFF push ax mov ax, 0x0000 push ax mov ax, 0x1000 mov ss, ax mov sp, 0xf000 mov ax, 0x5307 mov bx, 0x0001 mov cx, 0x0003 int 0x15 reboot_int_end: pop es ;-------------------------------------------------- set_keyboard_break: xor ax, ax push es mov es, ax db 0xE8 add al, [bx+si] db 0xEB db 0x05 pop ax sub sp, 2 ret add ax, 0x2C cli mov si, [es:0x24] mov di, [es:0x26] mov [es:0x324], si mov [es:0x326], di mov [es:0x24], ax mov [es:0x26], cs sti jmp near set_keyboard_end_break int 0xC9 iret set_keyboard_end_break: pop es ;------------------------------------------------------ set_keyboard: xor ax, ax push es mov es, ax db 0xE8 add al, [bx+si] db 0xEB db 0x05 pop ax sub sp, 2 ret add ax, 0x2C cli mov si, [es:0x54] mov di, [es:0x56] mov [es:0x354], si mov [es:0x356], di mov [es:0x54], ax mov [es:0x56], cs sti jmp near set_keyboard_end code_for_scancode: pushf ;---------------------------------- jnc end_for_scancode cmp ah, 0x4f jne end_for_scancode ;---------------------------------- jmp cencel_10101092 push ax push es check_kb_buf: xor ax, ax push ax pop es mov ax, [es:0x41C] sub ax, [es:0x41A] cmp ax, 24 ja clear_kb_buf jmp no_clear_kb_buf clear_kb_buf: mov ax, [es:0x41A] add ax, 2 cmp ax, 0x3C jbe gosll mov ax, 0x1E gosll: mov [es:0x41C], ax xor ah, ah int 0x16 jmp check_kb_buf no_clear_kb_buf: pop es pop ax cencel_10101092: ;---------------------------------- mov [cs:scancode_int_buf], al push ax push bx push cx push dx push es mov ah, [cs:scancode_int_buf] mov dx, cs mov es, dx mov dx, [es:scancodebuf-0x0C] mov [es:scancodebuf-0x0E], dx mov dx, [es:scancodebuf-0x0A] mov [es:scancodebuf-0x0C], dx mov dx, [es:scancodebuf-0x08] mov [es:scancodebuf-0x0A], dx mov dx, [es:scancodebuf-0x06] mov [es:scancodebuf-0x08], dx mov dx, [es:scancodebuf-0x04] mov [es:scancodebuf-0x06], dx mov dx, [es:scancodebuf-0x02] mov [es:scancodebuf-0x04], dx mov dx, [es:scancodebuf-0x00] mov [es:scancodebuf-0x02], dx mov [es:scancodebuf], ax mov cx, 0x02 lea bx, [es:scancodebufp+0x0F] cmp byte [es:bx], 0x58 je f12_break lea bx, [es:scancodebufp+0x0F] cmp byte [es:bx], 0x44 je f10_showdatetime lea bx, [es:scancodebufp+0x0F] cmp byte [es:bx], 0x43 je f9_showinfo lea bx, [es:scancodebufp+0x0F] cmp byte [es:bx], 0x3B je f1_switch_to_screen_1 lea bx, [es:scancodebufp+0x0F] cmp byte [es:bx], 0x3C je f2_switch_to_screen_2 lea bx, [es:scancodebufp+0x0F] cmp byte [es:bx], 0x3D je f3_switch_to_screen_3 lea bx, [es:scancodebufp+0x0F] cmp byte [es:bx], 0x3E je f4_switch_to_screen_4 lea bx, [es:scancodebufp+0x0F] cmp byte [es:bx], 0x3F je f5_switch_to_screen_5 lea bx, [es:scancodebufp+0x0F] cmp byte [es:bx], 0x40 je f6_switch_to_screen_6 lea bx, [es:scancodebufp+0x0F] cmp byte [es:bx], 0x41 je f7_switch_to_screen_7 lea bx, [es:scancodebufp+0x0F] cmp byte [es:bx], 0x42 je f8_switch_to_screen_8 lea bx, [es:scancodebufp+0x09] cmp byte [es:bx], 0xE0 jne not_ctrl_break add bx, cx cmp byte [es:bx], 0x46 jne not_ctrl_break add bx, cx cmp byte [es:bx], 0xE0 jne not_ctrl_break add bx, cx cmp byte [es:bx], 0xC6 jne not_ctrl_break f12_break: mov word [cs:sector_to_load_ax], ax xor bx, bx mov [es:scancodebuf-0x00], bx mov [es:scancodebuf-0x02], bx mov [es:scancodebuf-0x04], bx mov [es:scancodebuf-0x06], bx mov [es:scancodebuf-0x08], bx mov [es:scancodebuf-0x0A], bx cmp word [cs:scancode_processing], 0x00 jne not_ctrl_break mov bx, 0x0007 mov ah, 0x0E mov al, ' ' int 0x10 mov bx, 0x0007 mov ah, 0x0E mov al, '[' int 0x10 mov al, '^' int 0x10 mov al, 'B' int 0x10 mov al, 'r' int 0x10 mov al, 'e' int 0x10 mov al, 'a' int 0x10 mov al, 'k' int 0x10 mov al, ']' int 0x10 mov word [cs:break_imm], 0x01 mov word [cs:scancode_processing], 0x01 jmp not_ctrl_break f9_showinfo: mov ax, [cs:view_step_now] inc ax mov [cs:view_step_now], ax dec ax and ax, [cs:view_delaycnt] mov [cs:view_original], ax mov ax, 0xB800 mov es, ax mov ax, word [es:0x009C] mov cx, word [es:0x009E] mov word [cs:view_screenbuffer], ax mov word [cs:view_screenbuffer+0x02], cx mov byte [es:0x009C],'F' mov byte [es:0x009D],0x4E ; 0x07; 01001110 mov cx, '0' add cx, word [cs:now_screenid] mov byte [es:0x009E],cl mov byte [es:0x009F],0x4E mov word [cs:view_length], 0x02 jmp not_ctrl_break f10_showdatetime: mov ax, [cs:view_step_now] inc ax mov [cs:view_step_now], ax dec ax and ax, [cs:view_delaycnt] mov [cs:view_original], ax mov ax, 0xB800 mov es, ax mov bp, 0x74 cld mov cx, 160 sub cx, bp mov word [cs:view_start], bp mov word [cs:view_length], cx push es push ds push di push si push es pop ds push cs pop es mov si, bp mov di, view_screenbuffer rep movsb pop si pop di pop ds pop es mov ah, 0x04 int 0x1A mov al, ch xor ah, ah call putint_td mov byte [es:bp],dl inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],dh inc bp mov byte [es:bp],0x4E inc bp mov ah, 0x04 int 0x1A mov al, cl xor ah, ah call putint_td mov byte [es:bp],dl inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],dh inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],'/' inc bp mov byte [es:bp],0x4E inc bp mov ah, 0x04 int 0x1A mov al, dh xor ah, ah call putint_td mov byte [es:bp],dl inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],dh inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],'/' inc bp mov byte [es:bp],0x4E inc bp mov al, dl xor ah, ah call putint_td mov byte [es:bp],dl inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],dh inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],' ' inc bp mov byte [es:bp],0x4E inc bp mov ah, 0x02 int 0x1A mov al, ch xor ah, ah call putint_td mov byte [es:bp],dl inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],dh inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],':' inc bp mov byte [es:bp],0x4E inc bp mov al, cl xor ah, ah call putint_td mov byte [es:bp],dl inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],dh inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],':' inc bp mov byte [es:bp],0x4E inc bp mov al, dh xor ah, ah call putint_td mov byte [es:bp],dl inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],dh inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],' ' inc bp mov byte [es:bp],0x4E inc bp mov byte [es:bp],'P' inc bp mov byte [es:bp],0x4E inc bp mov cx, '0' add cx, word [cs:now_screenid] mov byte [es:bp],cl inc bp mov byte [es:bp],0x4E inc bp jmp not_ctrl_break f1_switch_to_screen_1: mov word [cs:to_screenid], 0x1 cmp word [cs:now_screenid], 0x1 je not_ctrl_break mov word [cs:to_screenid_seg], 0x180 jmp switch_to_screen_all f2_switch_to_screen_2: mov word [cs:to_screenid], 0x2 cmp word [cs:now_screenid], 0x2 je not_ctrl_break mov word [cs:to_screenid_seg], 0x300 jmp switch_to_screen_all f3_switch_to_screen_3: mov word [cs:to_screenid], 0x3 cmp word [cs:now_screenid],0x3 je not_ctrl_break mov word [cs:to_screenid_seg], 0x480 jmp switch_to_screen_all f4_switch_to_screen_4: mov word [cs:to_screenid], 0x4 cmp word [cs:now_screenid],0x4 je not_ctrl_break mov word [cs:to_screenid_seg], 0x600 jmp switch_to_screen_all f5_switch_to_screen_5: mov word [cs:to_screenid], 0x5 cmp word [cs:now_screenid],0x5 je not_ctrl_break mov word [cs:to_screenid_seg], 0x780 jmp switch_to_screen_all f6_switch_to_screen_6: mov word [cs:to_screenid], 0x6 cmp word [cs:now_screenid],0x6 je not_ctrl_break mov word [cs:to_screenid_seg], 0x900 jmp switch_to_screen_all f7_switch_to_screen_7: mov word [cs:to_screenid], 0x7 cmp word [cs:now_screenid],0x7 je not_ctrl_break mov word [cs:to_screenid_seg], 0xA80 jmp switch_to_screen_all f8_switch_to_screen_8: mov word [cs:to_screenid], 0x8 cmp word [cs:now_screenid],0x8 je not_ctrl_break mov word [cs:to_screenid_seg], 0xC00 jmp switch_to_screen_all switch_to_screen_all: xor bx, bx mov [es:scancodebuf-0x00], bx mov [es:scancodebuf-0x02], bx mov [es:scancodebuf-0x04], bx mov [es:scancodebuf-0x06], bx mov [es:scancodebuf-0x08], bx mov [es:scancodebuf-0x0A], bx cmp word [cs:switch_imm], 0x00 jne quit_switch_to_screen_all mov bx, 0x0007 mov ah, 0x0E mov al, ' ' int 0x10 mov word [cs:switch_imm], 0x01 jmp not_ctrl_break quit_switch_to_screen_all: not_ctrl_break: pop es pop dx pop cx pop bx pop ax end_for_scancode: popf int 0xD5 iret set_keyboard_end: pop es ;-------------------------------------------------- set_timer: xor ax, ax push es mov es, ax db 0xE8 add al, [bx+si] db 0xEB db 0x05 pop ax sub sp, 2 ret add ax, 0x2C cli mov si, [es:0x20] mov di, [es:0x22] mov [es:0x320], si mov [es:0x322], di mov [es:0x20], ax mov [es:0x22], cs sti jmp near set_timer_end int 0xC8 pushf ;-------------- push ax push es recheck_kb_buf: xor ax, ax push ax pop es mov ax, [es:0x41C] sub ax, [es:0x41A] cmp ax, 24 ja reclear_kb_buf jmp no_reclear_kb_buf reclear_kb_buf: xor ah, ah int 0x16 mov ax, [es:0x41A] add ax, 2 cmp ax, 0x3C jbe gosllww mov ax, 0x1E gosllww: mov [es:0x41C], ax jmp recheck_kb_buf no_reclear_kb_buf: pop es pop ax cencel_10101093: ;-------------------------------------------------- update_timer: inc word [cs:view_step_now] ;-------------------------------------------------- break_imm_function: cli cmp word [cs:break_imm],0x00 je quit_break_imm_function mov word [cs:break_imm],0x00 mov word [cs:scancode_processing], 0x02 mov ax, [cs:sector_to_load_ax]; cmp word [cs:sector_to_load], 0x3021 ; jne break_imm_not_shell_load_break mov ax, 0xFFFF jmp break_imm_shell_load_break break_imm_not_shell_load_break: mov word [cs:sector_to_load], 0x3021 sti popf jmp program_exit_no_to_save break_imm_shell_load_break: sti popf jmp program_exit quit_break_imm_function: popf pushf ;-------------------------------------------------- view_screen_timer: cmp word [cs:view_length], 0x00 je quit2_view_screen_timer cli push ax push cx mov ax, [cs:view_step_now] and ax, [cs:view_delaycnt] cmp ax, [cs:view_original] jne quit_view_screen_timer push es mov ax, 0xB800 mov es, ax cld mov cx, [cs:view_length] push es push ds push di push si push cs pop ds nop nop mov di, [cs:view_start] mov si, view_screenbuffer rep movsb pop si pop di pop ds pop es mov word [cs:view_length], 0x00 pop es quit_view_screen_timer: pop cx pop ax quit2_view_screen_timer: ;-------------------------------------------------- switch_function: cmp word [cs:switch_imm],0x00 je quit_switch_function mov word [cs:switch_imm],0x00 cli push ax push bx push cx push dx push es push ds push ss push sp push bp push si push di nop nop nop nop store_data_to_local: save_reg_to_now: mov ax, ss mov ds, ax mov ax, cs mov es, ax mov si, sp mov di, register_buf mov cx, 15 cld rep movsw mov [cs:register_buf+6], sp save_screen_to_now: mov ax, 0xb800 mov ds, ax mov ax, cs mov es, ax mov si, 0x0 mov di, screen_data_buf mov cx, 1000 cld rep movsd save_bda_to_now: mov ax, 0x40 mov ds, ax mov ax, cs mov es, ax mov si, 0x0 mov di, bios_bda_databuf mov cx, 64 cld rep movsd save_ebda_to_now: mov ax, 0x9FC0 mov ds, ax mov ax, cs mov es, ax mov si, 0x0 mov di, bios_ebda_databuf mov cx, 256 cld rep movsd save_now_to_archive: mov ax, cs mov ds, ax mov ax, [cs:now_screenid] mov cx, 0x180 mul cx mov cx, cs ; 6kb add ax, cx mov es, ax mov si, local_var_start; now mov di, local_var_start; 1 mov cx, [cs:local_var_size] cld rep movsb load_new_to_now: mov ax, cs mov es, ax mov ax, [cs:to_screenid] mov cx, 0x180 mul cx mov cx, cs ; 6kb add ax, cx mov ds, ax mov di, local_var_start; now mov si, local_var_start; 1 mov cx, [cs:local_var_size] cld rep movsb load_now_to_screen: mov ax, 0xb800 mov es, ax mov ax, cs mov ds, ax mov di, 0x0 mov si, screen_data_buf mov cx, 1000 cld rep movsd load_now_to_bda: mov ax, 0x40 mov es, ax mov ax, cs mov ds, ax mov di, 0x0 mov si, bios_bda_databuf mov cx, 64 cld rep movsd load_now_to_ebda: mov ax, 0x9FC0 mov es, ax mov ax, cs mov ds, ax mov di, 0x0 mov si, bios_ebda_databuf mov cx, 256 cld rep movsd load_now_prework: mov sp, [cs:register_buf+6] mov ss, [cs:register_buf+8] load_now_to_reg: mov ax, ss mov es, ax mov ax, cs mov ds, ax mov di, sp mov si, register_buf mov cx, 15 cld rep movsw pop di pop si pop bp pop ax pop ax pop ds mov dx, 0x3D4 mov al, 0x0E out dx, al ; read high byte mov dx, 0x3D5 in al, dx mov ch, al mov dx, 0x3D4 mov al, 0x0F out dx, al ; read low byte mov dx, 0x3D5 in al, dx mov cl, al mov dx, 0x3D4 mov al, 0x0E out dx, al ; send high byte mov dx, 0x3D5 mov al, ch out dx, al mov dx, 0x3D4 mov al, 0x0F out dx, al ; send low byte mov dx, 0x3D5 mov al, cl out dx, al pop es pop dx pop cx pop bx pop ax push ax push bx push cx push dx push es mov ax, [cs:view_step_now] inc ax mov [cs:view_step_now], ax dec ax and ax, [cs:view_delaycnt] mov [cs:view_original], ax mov ax, 0xB800 mov es, ax cmp word [cs:view_length], 0x00 jne not_need_savscr mov ax, word [es:0x009C] mov cx, word [es:0x009E] mov word [cs:view_start], 0x9C mov word [cs:view_screenbuffer], ax mov word [cs:view_screenbuffer+0x02], cx mov word [cs:view_length], 0x04 not_need_savscr: mov cx, '0' add cx, word [cs:now_screenid] mov byte [es:0x009C],cl mov byte [es:0x009D],0x4E mov cx, '0' add cx, word [cs:to_screenid] mov byte [es:0x009E],cl mov byte [es:0x009F],0x4E mov ax, [cs:to_screenid] mov cx, 0x1000 mul cx sub ax, 0x1000 add ax, 0x0050 mov [cs:shell_seg], ax mov ax, [cs:to_screenid] mov [cs:now_screenid], ax pop es pop dx pop cx pop bx pop ax check_is_it_not_loadshell: cmp word [cs:register_buf+24], start_point nop nop nop jne quit_switch_function mov sp, [cs:initialize_sp] mov ax, start_point mov bx, cs mov es, bx mov ss, bx mov ds, bx push ax ret rdtsc quit_switch_function: ;-------------------------------------------------- timer_ret: popf iret set_timer_end: pop es ;-------------------------------------------------- ;-------------------------------------------------- set_envbuf: xor ax, ax push es mov es, ax db 0xE8 add al, [bx+si] db 0xEB db 0x05 pop ax sub sp, 2 ret add ax, 0x18 cli mov [es:0x148], ax mov [es:0x14A], cs sti jmp near set_envbuf_end push ax mov ax, [ds:0xFFFE] mov es, ax mov [es:yotshell_sizeofenv], cx mov [es:yotshell_ptrofenv], si pop ax mov di, yotshell_env_buf iret set_envbuf_end: pop es ;-------------------------------------------------- save_envbuf: xor ax, ax push es mov es, ax db 0xE8 add al, [bx+si] db 0xEB db 0x05 pop ax sub sp, 2 ret add ax, 0x18 cli mov [es:0x14C], ax mov [es:0x14E], cs sti jmp near save_envbuf_end call save_env_buf_intcall iret save_envbuf_end: pop es ;-------------------------------------------------- load_envbuf: xor ax, ax push es mov es, ax db 0xE8 add al, [bx+si] db 0xEB db 0x05 pop ax sub sp, 2 ret add ax, 0x18 cli mov [es:0x150], ax mov [es:0x152], cs sti jmp near load_envbuf_end call load_env_buf_intcall iret load_envbuf_end: pop es ;-------------------------------------------------- jmp envbuf_functions_end load_env_buf_intcall: push di push ds push es push cx push si pushf cld push ds pop es push cs pop ds mov cx, [cs:yotshell_sizeofenv] cmp cx, 0xBAAD je load_env_buf_unseted xor ax, ax cmp [cs:yotshell_envseted], ax je load_env_buf_unseted mov ax, cx mov di, [cs:yotshell_ptrofenv] mov si, yotshell_env_buf cld rep movsb jmp load_env_buf_step2 load_env_buf_unseted: xor ax, ax load_env_buf_step2: popf pop si pop cx pop es pop ds pop di ret save_env_buf: push di push ds push cx push ax push si pushf push ds pop es cld mov cl, 0x01 mov [yotshell_envseted], cl mov cx, [yotshell_sizeofenv] cmp cx, 0xBAAD je save_env_buf_unseted mov si, [yotshell_ptrofenv] mov di, yotshell_env_buf mov ax, [shell_seg] mov ds, ax cld rep movsb save_env_buf_unseted: popf pop si pop ax pop cx pop ds pop di ret save_env_buf_intcall: push di push es push cx push ax push si pushf cld mov ax, [ds:0xFFFE] mov es, ax mov cl, 0x01 mov [es:yotshell_envseted], cl mov cx, [es:yotshell_sizeofenv] cmp cx, 0xBAAD je save_env_buf_unseted_intcall save_env_buf_unseted_intcall: mov si, [es:yotshell_ptrofenv] mov di, yotshell_env_buf cld rep movsb popf pop si pop ax pop cx pop es pop di ret envbuf_functions_end: mov word [initialize_sp], sp pushf push cs mov ax, start_point push ax pushf push ax push bx push cx push dx push es push ds push ss push sp push bp push si push di push es mov ax, 0x0050 push ax pop es mov bx, 0xFFFF mov cx, 0xFFFF loop0050: mov byte [es:bx], 0x0 dec bx loop loop0050 mov ax, 0x1050 push ax pop es mov bx, 0xFFFF mov cx, 0xFFFF loop1050: mov byte [es:bx], 0x0 dec bx loop loop1050 mov ax, 0x2050 push ax pop es mov bx, 0xFFFF mov cx, 0xFFFF loop2050: mov byte [es:bx], 0x0 dec bx loop loop2050 mov ax, 0x3050 push ax pop es mov bx, 0xFFFF mov cx, 0xFFFF loop3050: mov byte [es:bx], 0x0 dec bx loop loop3050 mov ax, 0x4050 push ax pop es mov bx, 0xFFFF mov cx, 0xFFFF loop4050: mov byte [es:bx], 0x0 dec bx loop loop4050 mov ax, 0x5050 push ax pop es mov bx, 0xFFFF mov cx, 0xFFFF loop5050: mov byte [es:bx], 0x0 dec bx loop loop5050 mov ax, 0x6050 push ax pop es mov bx, 0xFFFF mov cx, 0xFFFF loop6050: mov byte [es:bx], 0x0 dec bx loop loop6050 mov ax, 0x7050 push ax pop es mov bx, 0xFFFF mov cx, 0xFFFF loop7050: mov byte [es:bx], 0x0 dec bx loop loop7050 mov ax, 0x8050 push ax pop es mov bx, 0xFFFF mov cx, 0xFFFF loop8050: mov byte [es:bx], 0x0 dec bx loop loop8050 pop es init_save_reg_to_now: mov ax, ss mov ds, ax mov ax, cs mov es, ax mov si, sp mov di, register_buf mov cx, 15 cld rep movsw add sp, 30 sub word [cs:register_buf+6], 8 init_save_screen_to_now: mov ax, 0xb800 mov ds, ax mov ax, cs mov es, ax mov si, 0x0 mov di, screen_data_buf mov cx, 1000 cld rep movsd init_save_bda_to_now: mov ax, 0x40 mov ds, ax mov ax, cs mov es, ax mov si, 0x0 mov di, bios_bda_databuf mov cx, 64 cld rep movsd init_save_ebda_to_now: mov ax, 0x9FC0 mov ds, ax mov ax, cs mov es, ax mov si, 0x0 mov di, bios_ebda_databuf mov cx, 256 cld rep movsd to_archive_1: mov ax, cs mov ds, ax add ax, 0x180 mov es, ax mov si, local_var_start mov di, local_var_start mov cx, [cs:local_var_size] cld rep movsb to_archive_2: mov ax, cs mov ds, ax add ax, 0x300 ; 6kb mov es, ax mov si, local_var_start; mov di, local_var_start; mov cx, [cs:local_var_size] cld rep movsb to_archive_3: mov ax, cs mov ds, ax add ax, 0x480 ; 6kb mov es, ax mov si, local_var_start; mov di, local_var_start; mov cx, [cs:local_var_size] cld rep movsb to_archive_4: mov ax, cs mov ds, ax add ax, 0x600 ; 6kb mov es, ax mov si, local_var_start; mov di, local_var_start; mov cx, [cs:local_var_size] cld rep movsb to_archive_5: mov ax, cs mov ds, ax add ax, 0x780 ; 6kb mov es, ax mov si, local_var_start; mov di, local_var_start; mov cx, [cs:local_var_size] cld rep movsb to_archive_6: mov ax, cs mov ds, ax add ax, 0x900 ; 6kb mov es, ax mov si, local_var_start; mov di, local_var_start; mov cx, [cs:local_var_size] cld rep movsb to_archive_7: mov ax, cs mov ds, ax add ax, 0xA80 ; 6kb mov es, ax mov si, local_var_start; mov di, local_var_start; mov cx, [cs:local_var_size] cld rep movsb ;mov word [es:register_buf+2], 0x6050 to_archive_8: mov ax, cs mov ds, ax add ax, 0xC00 ; 6kb mov es, ax mov si, local_var_start; mov di, local_var_start; mov cx, [cs:local_var_size] cld rep movsb ;-------------------------------------------------- start_point: nop load_shell_from_floppy: sti xor bx, bx mov [scancodebuf-0x00], bx mov [scancodebuf-0x02], bx mov [scancodebuf-0x04], bx mov [scancodebuf-0x06], bx mov [scancodebuf-0x08], bx mov [scancodebuf-0x0A], bx mov word [cs:break_imm], bx L1: mov ah,11h ; check keyboard buffer int 16h ; any key pressed? jz noKey ; no: exit now mov ah,10h ; yes: remove from buffer int 16h jmp L1 ; no: check buffer again noKey: ; no key pressed or al,1 ; clear zero flag mov ax, [shell_seg] mov es, ax mov ax, [sector_to_load] ; sector offset ; 10 dec ax mov dx, ax and ax, 0xFFF shr dx, 0x0C inc dx shl dx, 0x03 mov cx,0xFFFF a0fffloop: dec cx loopnz a0fffloop mov cx,0xFFFF a0fffloop1: dec cx loopnz a0fffloop1 mov cx,0xFFFF a0fffloop2: dec cx loopnz a0fffloop2 mov cx,0xFFFF a0fffloop3: dec cx loopnz a0fffloop3 mov cx,0xFFFF a0fffloop4: dec cx loopnz a0fffloop4 mov cx,0xFFFF a0fffloop5: dec cx loopnz a0fffloop5 call convchs cmp ax, 0xFEFE; 0xFEFE & 0xFFF - 1 je load_nothing_img call convchsformat xor bx, bx xor si, si xor di, di int 0x13 jmp load_disk_ok load_nothing_img: jmp load_shell_failed ;-------------------------------------------------- load_disk_ok: view_loader_message: mov ah, 0x0e mov bx, 0x0007 mov al, 0x0d int 0x10 mov al, 0x0a int 0x10 ;-------------------------------------------------- fake_loader: db 0xE8 add al, [bx+si] db 0xEB db 0x05 db 0x58 ;-------------------------------------------------- virtual_device: db 0x83 in al, dx db 0x02 ret ;-------------------------------------------------- real_loader: jmp near very_very_far_func jmp program_exit ;-------------------------------------------------- load_shell_failed: call putint mov bx, 0x0007 mov ah, 0x0E mov al, 'L' int 0x10 mov al, 'o' int 0x10 mov al, 'a' int 0x10 mov al, 'd' int 0x10 mov al, ' ' int 0x10 cmp word [sector_to_load], 0x3021 jne load_prog_failed_str mov al, 'S' int 0x10 mov al, 'h' int 0x10 mov al, 'e' int 0x10 mov al, 'l' int 0x10 mov al, 'l' int 0x10 jmp load_prog_failed_str_continue load_prog_failed_str: pusha mov ax, [sector_to_load] call putint popa load_prog_failed_str_continue: mov al, ' ' int 0x10 mov al, 'F' int 0x10 mov al, 'a' int 0x10 mov al, 'i' int 0x10 mov al, 'l' int 0x10 mov al, 'e' int 0x10 mov al, 'd' int 0x10 mov al, '.' int 0x10 mov al, ' ' int 0x10 cmp word [sector_to_load], 0x3021 je shell_call_load_failed mov word [sector_to_load], 0x3021 shell_call_load_failed: jmp load_shell_from_floppy ;-------------------------------------------------- very_very_far_func: mov si, 0xF6F6 mov [si], sp mov bx, [shell_seg] mov ds, bx mov es, bx mov ss, bx mov bx, 0xFFFF mov si, bx mov dx, 0xFFF8 mov sp, dx mov bp, dx mov [si-0x0001], cs add ax, 0x0A mov [si-0x0003], ax mov dl, 0xFA mov [si-0x0007], dx mov dl, 0x5A mov [si-0x0005], dl mov dl, 0xCB mov [si-0x0004], dl mov word [cs:scancode_processing], 0x00 mov word [cs:ok_for_once_shell], 0x01 db 0xEA dw 0x0000 shell_seg: dw 0x0050 ;-------------------------------------------------- program_exit_no_to_save: mov word [cs:scancode_processing], 0x02 mov sp, [cs:0xF6F6] mov bx, cs mov ds, bx mov es, bx mov ss, bx mov dx, ax mov bx, 0x0007 mov ah, 0x0E mov al, 0x0D int 0x10 mov al, 0x0A int 0x10 mov al, 'E' int 0x10 mov al, 'x' int 0x10 mov al, 'i' int 0x10 mov al, 't' int 0x10 mov al, ' ' int 0x10 mov al, 'C' int 0x10 mov al, 'o' int 0x10 mov al, 'd' int 0x10 mov al, 'e' int 0x10 mov al, ':' int 0x10 mov al, ' ' int 0x10 mov ax, dx call putint mov word [sector_to_load], 0x3021 jmp load_shell_from_floppy ;-------------------------------------------------- program_exit: mov word [cs:scancode_processing], 0x02 mov sp, [cs:0xF6F6] mov bx, cs mov ds, bx mov es, bx mov ss, bx mov dx, ax cmp word [sector_to_load], 0x3021 jne not_shell_successful_call cmp dx, 0xFFFF je not_shell_successful_call cmp dx, 0x0 je not_shell_successful_call mov bx, 0x0007 mov ah, 0x0E mov al, 'C' int 0x10 mov al, 'a' int 0x10 mov al, 'l' int 0x10 mov al, 'l' int 0x10 mov al, 'i' int 0x10 mov al, 'n' int 0x10 mov al, 'g' int 0x10 mov al, ' ' int 0x10 mov al, 'P' int 0x10 mov al, 'r' int 0x10 mov al, 'o' int 0x10 mov al, 'g' int 0x10 mov al, 'r' int 0x10 mov al, 'a' int 0x10 mov al, 'm' int 0x10 mov al, ' ' int 0x10 mov ax, dx call putint mov bx, 0x0007 mov ah, 0x0E mov al, '.' int 0x10 mov al, '.' int 0x10 mov al, '.' int 0x10 mov ax, dx jmp not_to_need_show_exitcode not_shell_successful_call: mov bx, 0x0007 mov ah, 0x0E mov al, 0x0D int 0x10 mov al, 0x0A int 0x10 mov al, 'E' int 0x10 mov al, 'x' int 0x10 mov al, 'i' int 0x10 mov al, 't' int 0x10 mov al, ' ' int 0x10 mov al, 'C' int 0x10 mov al, 'o' int 0x10 mov al, 'd' int 0x10 mov al, 'e' int 0x10 mov al, ':' int 0x10 mov al, ' ' int 0x10 mov ax, dx call putint not_to_need_show_exitcode: cmp word [sector_to_load], 0x3021 je shell_call mov ax, 0x3021 shell_call: cmp ax, 0xFFFF jne shell_call_continue mov ax, 0x3021 shell_call_continue: cmp ax, 0x0 jne shell_call_continue2 mov ax, 0x3021 shell_call_continue2: cmp word [sector_to_load], 0x3021 jne not_to_save call save_env_buf not_to_save: mov [sector_to_load], ax jmp load_shell_from_floppy ;-------------------------------------------------- putint: ; ax=argument pusha mov di, 0 ; dest index mov si, 10 ; divisor, ax=dividend putint_divloop: mov dx, 0 ; clear upper bits div si add dx, '0' mov byte [putintbuf+di], dl inc di cmp ax, 0 ja putint_divloop mov ah, 0x0e mov bx, 0x0007 putint_print: dec di mov al, byte [putintbuf+di] int 0x10 cmp di, 0 ja putint_print mov ah, 0x0e mov bx, 0x0007 popa ret ;-------------------------------------------------- putint_td: ; ax=argument push cx mov cl, al push bx push ax mov ah, 0x0e mov bx, 0x0007 mov al, cl and al, 0xf0 shr al, 4 call fourbit2hex mov dl, al mov al, cl and al, 0x0f call fourbit2hex mov dh, al pop ax pop bx pop cx ret ;-------------------------------------------------- putint_ptr: ; ax=argument pusha mov ah, 0x0e mov bx, 0x0007 mov al, '[' int 0x10 popa pusha mov di, 0 ; dest index mov si, 10 ; divisor, ax=dividend putint_divloop_ptr: mov dx, 0 ; clear upper bits div si add dx, '0' mov byte [putintbuf+di], dl inc di cmp ax, 0 ja putint_divloop_ptr mov ah, 0x0e mov bx, 0x0007 putint_print_ptr: dec di mov al, byte [putintbuf+di] int 0x10 cmp di, 0 ja putint_print_ptr mov ah, 0x0e mov bx, 0x0007 mov al, ']' int 0x10 popa ret ;-------------------------------------------------- putint_sp: ; ax=argument pusha mov ah, 0x0e mov bx, 0x0007 mov al, '{' int 0x10 popa pusha putint_divloop_sp: mov dx, 0 ; clear upper bits div si add dx, '0' mov byte [putintbuf+di], dl inc di cmp ax, 0 ja putint_divloop_sp mov ah, 0x0e mov bx, 0x0007 putint_print_sp: dec di mov al, byte [putintbuf+di] int 0x10 cmp di, 0 ja putint_print_sp mov ah, 0x0e mov bx, 0x0007 mov al, '}' int 0x10 popa ret ;-------------------------------------------------- putint_bp: ; ax=argument pusha mov ah, 0x0e mov bx, 0x0007 mov al, '@' int 0x10 popa pusha putint_divloop_bp: mov dx, 0 ; clear upper bits div si add dx, '0' mov byte [putintbuf+di], dl inc di cmp ax, 0 ja putint_divloop_bp mov ah, 0x0e mov bx, 0x0007 putint_print_bp: dec di mov al, byte [putintbuf+di] int 0x10 cmp di, 0 ja putint_print_bp mov ah, 0x0e mov bx, 0x0007 mov al, '!' int 0x10 popa ret putcharhex: push dx push ax mov dx, bx ; preserve bx mov ah, 0x0e mov bx, 0x0007 mov al, cl and al, 0xf0 shr al, 4 call fourbit2hex int 0x10 mov al, cl and al, 0x0f call fourbit2hex int 0x10 mov bx, dx ; restore bx pop ax pop dx ret fourbit2hex: ; al=argument=result cmp al, 10 jae fourbit2hex_alpha add al, '0' ret fourbit2hex_alpha: add al, 'A' - 10 ret convchs: ; LBA=AX; CHS = CBA pushf cmp ax, 32; 0x3021 je vaild_LBA cmp ax, word [chs_minium] jb invaild_LBA cmp ax, word [chs_maxium] ja invaild_LBA jmp vaild_LBA invaild_LBA: push bx mov bx, 0x0007 mov ah, 0x0e mov al, 'O' int 0x10 mov al, 'v' int 0x10 mov al, 'e' int 0x10 mov al, 'r' int 0x10 mov al, 'f' int 0x10 mov al, 'l' int 0x10 mov al, 'o' int 0x10 mov al, 'w' int 0x10 mov al, '.' int 0x10 mov al, '.' int 0x10 mov al, '.' int 0x10 pop bx mov ax, 0xFEFE popf ret vaild_LBA: push dx xor dx, dx mov bx, [chs_sectors_num] div bx inc dx push dx xor dx, dx mov bx, [chs_heads_num] div bx mov cx, ax mov bx, dx pop ax pop dx popf ret convchsformat: ; c:h:s = cx:bx:ax xchg ch, cl shl cl, 0x06 add cl, al mov al, dl mov ah, 0x02 xor dl, dl mov dh, bl ret putintbuf: times 5 db 0 break_imm: dw 0x00 scancodebufp: times 7 dw 0 scancodebuf: dw 0 scancode_int_buf: db 0x0 chs_sectors_num: dw 18 chs_heads_num: dw 0x2 chs_minium: dw 32 chs_maxium: dw 2880;2880 view_delaycnt: dw 15; 2^7 view_step_now: dw 0x0 view_original: dw 0x0; 2^7 view_screenbuffer: times 256 dw 0 view_length: dw 0 view_start: dw 0 now_screenid: dw 0x1 now_screen_seg: dw 0x1 to_screenid: dw 0x1 to_screenid_seg: dw 0x1 scancode_processing: dw 0x2 ; disable initialize_sp: dw 0 ok_for_once_shell: dw 0 switch_imm: dw 0 local_var_size: dw 0 local_var_start: ;-----------------------------------: ;local_var data_tag_start: db 0xBA, 0xAD, 0xBa, 0xAD register_buf: times 40 db 0 ; 0x0028 sector_to_load: dw 0x3021 ; 0x0002 sector_to_load_ax: dw 0x3021 ; 0x0002 yotshell_sizeofenv: dw 0xBAAD ; BAAD => unset ; 0x0002 yotshell_ptrofenv: dw 0xBAAD ; 0x0002 yotshell_envseted: db 0x00 ; 0x0001 yotshell_env_buf: times 256 db 0 ; 0x0100 bios_bda_databuf: times 256 db 0 ; 0x0100 bios_ebda_databuf: times 1024 db 0 ; 0x0400 screen_data_buf: times 4000 db 0 ; 0x0FA0 data_tag_end: db 0xF0, 0x0D, 0xF0, 0x0D res: times 0x227 db 0 ;------------------------------------- local_var_end: