From 209234c1e607ee307cfa9b776d487df40e1d0290 Mon Sep 17 00:00:00 2001 From: LAN-TW Date: Wed, 4 Dec 2013 21:32:57 +0800 Subject: =?UTF-8?q?=E5=B0=87=E6=89=80=E6=9C=89=20CRLF=20=E6=9B=BF=E6=8F=9B?= =?UTF-8?q?=E6=88=90=20LF=20(Unix=20=E6=96=87=E5=AD=97=E6=AA=94=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basic.s | 48 +- bootsect.s | 108 +- kernel.s | 4296 ++++++++++++++++++++++++++++++------------------------------ reader.c | 12 +- while1.c | 14 +- 5 files changed, 2239 insertions(+), 2239 deletions(-) diff --git a/basic.s b/basic.s index 5f14ecb..8b20628 100644 --- a/basic.s +++ b/basic.s @@ -1,24 +1,24 @@ -putcharhex: ; bl=argument - pusha - mov ah, 0x0e - mov al, bl - and al, 0xf0 - shr al, 4 - call fourbit2hex - int 0x10 - mov al, bl - and al, 0x0f - call fourbit2hex - int 0x10 - popa - ret -fourbit2hex: ; al=argument=result - cmp al, 10 - jae fourbit2hex_alpha - add al, '0' - ret -fourbit2hex_alpha: - add al, 'A' - sub al, 10 - ret - +putcharhex: ; bl=argument + pusha + mov ah, 0x0e + mov al, bl + and al, 0xf0 + shr al, 4 + call fourbit2hex + int 0x10 + mov al, bl + and al, 0x0f + call fourbit2hex + int 0x10 + popa + ret +fourbit2hex: ; al=argument=result + cmp al, 10 + jae fourbit2hex_alpha + add al, '0' + ret +fourbit2hex_alpha: + add al, 'A' + sub al, 10 + ret + diff --git a/bootsect.s b/bootsect.s index 6d6e744..e2c05f2 100644 --- a/bootsect.s +++ b/bootsect.s @@ -1,54 +1,54 @@ - org 0x7c00 ; boot sector - -entry: - ; now loading from disk - mov cx, 3 ; retry count - mov ax, 0x0000 - mov ds, ax - mov ax, 0x9050 - mov es, ax ; set es, the destination - mov bx, 0 -loaddisk: - mov si, cx - mov ah, 0x02 ; function: read disk sectors - mov al, 16 ; sector count - mov dh, 0 ; head - mov dl, 0 ; drive number - mov ch, 0 ; track - mov cl, 2 ; sector offset - int 0x13 - jnc loadok - mov bl, al - call putcharhex - mov cx, si - loop loaddisk - - ; load failed - mov ah, 0x0e - mov al, 'X' - int 0x10 - jmp $ - - ; load OK -loadok: - mov ah, 0x0e - mov al, 'P' - int 0x10 - mov al, 'R' - int 0x10 - mov al, 'E' - int 0x10 - mov al, 'Y' - int 0x10 - mov al, 'O' - int 0x10 - mov al, 'T' - int 0x10 - mov ax, 0x9050 - mov ds, ax - mov es, ax - mov ss, ax - db 0xEA - dd 0x90500000 - -%include "basic.s" + org 0x7c00 ; boot sector + +entry: + ; now loading from disk + mov cx, 3 ; retry count + mov ax, 0x0000 + mov ds, ax + mov ax, 0x9050 + mov es, ax ; set es, the destination + mov bx, 0 +loaddisk: + mov si, cx + mov ah, 0x02 ; function: read disk sectors + mov al, 16 ; sector count + mov dh, 0 ; head + mov dl, 0 ; drive number + mov ch, 0 ; track + mov cl, 2 ; sector offset + int 0x13 + jnc loadok + mov bl, al + call putcharhex + mov cx, si + loop loaddisk + + ; load failed + mov ah, 0x0e + mov al, 'X' + int 0x10 + jmp $ + + ; load OK +loadok: + mov ah, 0x0e + mov al, 'P' + int 0x10 + mov al, 'R' + int 0x10 + mov al, 'E' + int 0x10 + mov al, 'Y' + int 0x10 + mov al, 'O' + int 0x10 + mov al, 'T' + int 0x10 + mov ax, 0x9050 + mov ds, ax + mov es, ax + mov ss, ax + db 0xEA + dd 0x90500000 + +%include "basic.s" diff --git a/kernel.s b/kernel.s index ca59973..5375691 100644 --- a/kernel.s +++ b/kernel.s @@ -1,2148 +1,2148 @@ - 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: + 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: diff --git a/reader.c b/reader.c index cf1eeb8..7aa8506 100644 --- a/reader.c +++ b/reader.c @@ -1,6 +1,6 @@ -#include -int main() -{ - putstr("i am reader.c"); - return 0xF00D; -} +#include +int main() +{ + putstr("i am reader.c"); + return 0xF00D; +} diff --git a/while1.c b/while1.c index dd94328..69c704f 100644 --- a/while1.c +++ b/while1.c @@ -1,7 +1,7 @@ -#include -int main() -{ - putstr("i am stupid"); - while(1); - return 0xF00D; -} +#include +int main() +{ + putstr("i am stupid"); + while(1); + return 0xF00D; +} -- cgit v1.2.3