From 21f4b645319848112fd62b0bb5019d98f8e4a741 Mon Sep 17 00:00:00 2001 From: lantw44 Date: Sat, 19 Jan 2013 14:46:39 +0800 Subject: Update to the latest version! --- Makefile | 27 +- kernel.s | 1076 ++++++++++++++++++++++++++++++++++++++++++++++++---- reader.c | 38 ++ while1.c | 39 ++ yotlibc/bccfunc.s | 91 ++++- yotlibc/str_in.c | 1 + yotlibc/strbasic.c | 2 + yotlibc/yotlibc.h | 6 - yotsh.c | 196 +++++++++- 9 files changed, 1379 insertions(+), 97 deletions(-) create mode 100644 reader.c create mode 100644 while1.c diff --git a/Makefile b/Makefile index c6b5d43..c0f9b70 100644 --- a/Makefile +++ b/Makefile @@ -1,26 +1,34 @@ .PHONY: all clean run +.SUFFIXES: .c.o .s.o all: floppy.img -floppy.img: 55aa bootsect kernel yotsh +floppy.img: 55aa bootsect kernel yotsh reader while1 dd if=/dev/zero of=$@ bs=512 count=2880 dd if=55aa of=$@ bs=1 count=2 seek=510 conv=notrunc dd if=bootsect of=$@ conv=notrunc - dd if=kernel of=$@ bs=512 seek=1 conv=notrunc - dd if=yotsh of=$@ bs=512 seek=9 conv=notrunc + dd if=kernel of=$@ bs=512 seek=1 conv=notrunc + dd if=yotsh of=$@ bs=512 seek=32 conv=notrunc + dd if=while1 of=$@ bs=512 seek=72 conv=notrunc + dd if=reader of=$@ bs=512 seek=73 conv=notrunc + +.c.o: + bcc -ansi -Mc -Iyotlibc -c $< -o $@ +.s.o: + nasm -f as86 $< -o $@ bootsect: bootsect.s basic.s nasm -f bin $< -o $@ kernel: kernel.o ld86 -T 0x0000 -d kernel.o -o kernel + yotsh: yotsh.o yotlibc/yotlibc.a ld86 -T 0x0000 -d yotsh.o yotlibc/yotlibc.a -o yotsh - -kernel.o: kernel.s - nasm -f as86 $< -o $@ -yotsh.o: yotsh.c - bcc -ansi -Mc -Iyotlibc -c $< -o $@ +reader: reader.o yotlibc/yotlibc.a + ld86 -T 0x0000 -d reader.o yotlibc/yotlibc.a -o reader +while1: while1.o yotlibc/yotlibc.a + ld86 -T 0x0000 -d while1.o yotlibc/yotlibc.a -o while1 55aa: echo "0000000: 55aa" | xxd -r > $@ @@ -32,4 +40,5 @@ run: floppy.img qemu-kvm -fda floppy.img $(QARG) clean: - rm -f bootsect kernel kernel.o 55aa yotsh yotsh.o floppy.img + rm -f bootsect kernel kernel.o reader.o while1.o \ + 55aa yotsh yotsh.o floppy.img diff --git a/kernel.s b/kernel.s index da018d1..57b708c 100644 --- a/kernel.s +++ b/kernel.s @@ -1,7 +1,9 @@ global _main _main: - mov sp, 0x3ffe + mov sp, 0x7ffe + mov word [local_var_size],local_var_end + sub word [local_var_size],local_var_start ;-------------------------------------------------- set_environment: xor ax, ax @@ -37,18 +39,49 @@ do_memory_control: do_memory_control_end: pop es ;-------------------------------------------------- -set_keyboard: +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, 0x0F + 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 - nop - nop - nop - nop - nop - nop - nop - nop db 0xE8 add al, [bx+si] db 0xEB @@ -58,76 +91,549 @@ set_keyboard: 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 + jmp near set_keyboard_end_break + int 0xC9 + iret + +set_keyboard_end_break: + 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 + cli +; pusha +; mov ah, 0x0E +; mov al, '!' +; mov bx, 0x0007 +; int 0x10 +; popa + cmp word [cs:break_imm],0x00 + + je update_timer + + cmp word [cs:scancode_processing], 0x00 + jne update_timer + + mov word [cs:scancode_processing], 0x01 + mov ax, [cs:sector_to_load_ax]; + cmp word [cs:sector_to_load], 0x3021 ; + jne not_shell_load_break + mov ax, 0xFFFF + jmp shell_load_break +not_shell_load_break: + mov word [cs:sector_to_load], 0x3021 + sti + popf + jmp program_exit_no_to_save +shell_load_break: + sti + popf + jmp program_exit +update_timer: + inc word [cs:view_step_now] +; push ax +; mov ax, 123 +; call putint +; pop ax +view_screen_timer: + cmp word [cs:view_length], 0x00 + je timer_ret + cli + push ax +; mov ax, 123 +; call putint + push cx + mov ax, [cs:view_step_now] + and ax, [cs:view_delaycnt] + cmp ax, [cs:view_original] + jne not_need_update_view + push es + mov ax, 0xB800 + mov es, ax + mov ax, word [cs:view_screenbuffer] + mov cx, word [cs:view_screenbuffer+0x02] + mov word [es:0x009C], ax + mov word [es:0x009E], cx + mov word [cs:view_length], 0x00 + pop es +not_need_update_view: + pop cx + pop ax + sti +timer_ret: + sti + popf + iret + +set_timer_end: + 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 +;---------------------------------- + +;---------------------------------- + mov [cs:scancode_int_buf], al + push ax push bx + push cx + push dx push es - mov ax, 0x40 - mov es, ax - mov bx, 0x0007 - mov ah, 0x0E - mov al, '[' - int 0x10 + mov ah, [cs:scancode_int_buf] + + mov dx, cs + mov es, dx + + mov dx, [es:scancodebuf-0x0C] + mov [es:scancodebuf-0x0E], dx - mov bx, 0x0007 - mov ah, 0x0E - mov ax, [es:0x1A] - call putint + 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], 0x57 + je f11_savescreen + + lea bx, [es:scancodebufp+0x0F] + cmp byte [es:bx], 0x44 + je f10_loadscreen + + lea bx, [es:scancodebufp+0x0F] + cmp byte [es:bx], 0x43 + je f9_showinfo + + 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: + cmp word [cs:scancode_processing], 0x00 + jne not_ctrl_break + 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 mov bx, 0x0007 mov ah, 0x0E - mov al, ',' + mov al, ' ' int 0x10 - mov ax, [es:0x1C] - mov dx, ax - call putint - - 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:sector_to_load_ax], ax ; + jmp not_ctrl_break + + +f11_savescreen: + + push ds + mov ax, 0xb800 + mov ds, ax + mov ax, 0x9850 + mov es, ax + ;ds:si => es:di + + xor si, si + xor di, di + mov cx, 1000; 80*25*2 + rep movsd + pop ds + jmp not_ctrl_break + +f10_loadscreen: + push ds + mov ax, 0xb800 + mov es, ax + mov ax, 0x9850 + mov ds, ax + ;ds:si => es:di + + xor si, si + xor di, di + mov cx, 1000; 80*25*2 + rep movsd + + + ;mov byte [es:0x0000],'H' + ;mov byte [es:0x0001],0x07 + + pop ds + jmp not_ctrl_break + + +f9_showinfo: + mov ax, [cs:view_step_now] +; call putint + 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 + +not_ctrl_break: +normal_keyboard_break: pop es + pop dx + pop cx pop bx pop ax - int 0xC9 +end_for_scancode: + popf + int 0xD5 iret set_keyboard_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: ; 0x53 + 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_bin_from_floppy: +load_envbuf: ; 0x54 xor ax, ax - mov ax, 0x0050 + 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 +;-------------------------------------------------- +load_shell_from_floppy: +; xor ax, ax +; xor ah, ah +; xor dl, dl +; int 0x13 + 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 + mov word [cs:scancode_processing], 0x00 +;continue_get_key_buf: + ;xor ax, ax + ;inc ax + push ax + push es + mov ax, 0x40 + mov es, ax + mov ax, 0x30 + mov [es:0x1A], ax + mov [es:0x1C], ax + ;mov ax, [es:0x1A] + ;call putint + ;mov ax, [es:0x1C] + ;call putint + pop es + pop ax + + ;mov ah, 0x01 + ;int 16h + ;jz continue_get_key_buf + + mov ax, [shell_seg] mov es, ax - mov bx, 0x0000 + ; start loading - mov si, cx - mov ah, 0x02 ; function: read disk sectors - mov al, 8 ; sector count - mov dh, 0 ; head - mov dl, 0 ; drive number - mov ch, 0 ; track - mov cl, 10 ; sector offset + ; mov si, cx + + mov ax, [sector_to_load] ; sector offset ; 10 + dec ax + mov dx, ax + and ax, 0xFFF + shr dx, 0x0C + inc dx + shl dx, 0x03 + + call convchs + cmp ax, 0xFEFE; 0xFEFE & 0xFFF - 1 + je load_nothing_img + +; pusha +; call putint +; mov ax, bx +; call putint +; mov ax, cx +; call putint +; mov ax, dx +; call putint +; mov ax, es +; call putint +; mov ax, 9999 +; call putint +; popa + + ;pusha + ;call putint + ;popa + + call convchsformat + xor bx, bx + ;mov bx, 0x0000 ; es:bx + ;mov al, 16 + ;mov bx, 0x0000 + ;mov ah, 0x02 ; function: read disk sectors + ;mov al, 16 ; sector count + ;xor dx, dx + ;mov cx, [sector_to_load] ; sector offset ; 10 + +; pusha +; call putint +; mov ax, bx +; call putint +; mov ax, cx +; call putint +; mov ax, dx +; call putint +; mov ax, es +; call putint +; popa + + +; cmp cx, 0xF +; jne load_nothing_img + + int 0x13 - jc load_bin_failed + jc load_shell_failed + + +; pusha +; call putint +; mov ax, cx +; call putint +; mov ax, dx +; call putint +; popa + + ;mov ah, 0x02 ; function: read disk sectors + ;mov al, 16 ; sector count + ;mov dh, 0 ; head + ;mov dl, 0 ; drive number + ;xor dx, dx + ;mov ch, 0 ; track ;0 + ;mov cl, [sector_to_load] ; sector offset ; 10 + + int 0x13 + jc load_shell_failed + jmp load_disk_ok + +load_nothing_img: + jmp load_shell_failed +; mov byte [es:bx] , 0x33 +; mov byte [es:bx+1],0xC0 +; mov byte [es:bx+2],0xC3 ;RET +; xor ax, ax +; mov ax, 0x8050 +; mov es, ax +; mov bx, 0x1200 +; mov ah, 0x02 ; function: read disk sectors +; mov al, 7 ; sector count +; mov dh, 0 ; head +; mov dl, 0 ; drive number +; mov ch, 1 ; track +; mov cl, 1 ; sector offset + +; int 0x13 +; jc load_shell_failed ;-------------------------------------------------- +load_disk_ok: view_loader_message: mov ah, 0x0e - mov al, ':' + ;mov al, ':' mov bx, 0x0007 - int 0x10 + ;int 0x10 mov al, 0x0d int 0x10 mov al, 0x0a @@ -150,34 +656,200 @@ real_loader: jmp near very_very_far_func jmp program_exit ;-------------------------------------------------- -load_bin_failed: - mov dx, 0 - mov ds, dx - mov es, dx - xor ah, al +load_shell_failed: + 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 - jmp _main + 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 +; mov al, 0x0D +; int 0x10 +; mov al, 0x0A +; 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 +;-------------------------------------------------- +program_exit_no_to_save: + mov word [cs:scancode_processing], 0x01 + mov sp, [cs:0x7FFE] + mov bx, cs + mov ds, bx + mov es, bx + mov ss, bx + + ;cli + ;mov si, 0x7FFE + + ;sti + 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 al, ' ' +; int 0x10 + mov ax, dx + call putint + + mov word [sector_to_load], 0x3021 + jmp load_shell_from_floppy ;-------------------------------------------------- program_exit: +; mov al, 'E' +; mov ah, 0x0E +; int 0x10 +; mov ax, cs +; call putint + mov word [cs:scancode_processing], 0x01 + mov sp, [cs:0x7FFE] mov bx, cs mov ds, bx mov es, bx mov ss, bx - mov si, 0x3FFE - mov sp, [si] + ;mov si, 0x7FFE + ;mov sp, [si] mov dx, ax ; pop dx ; call char_vga_setbios +; mov bx, 0x0007 +; mov ah, 0x0E +; mov al, 0x0D +; int 0x10 +; mov al, 0x0A +; int 0x10 + 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, 0x0D + mov al, 'C' int 0x10 - mov al, 0x0A + 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' @@ -203,16 +875,37 @@ program_exit: mov ax, dx call putint + ;mov bx, 0x0007 + ;mov ah, 0x0E + ;mov al, 'E' + ;int 0x10 + ;mov ax, sp + ;call putint + ;int 0x10 + ;db 0xEB, 0xFE + ;jmp _main + ;jmp view_loader_message +not_to_need_show_exitcode: -; mov ax, dx -; call putint - -; mov ax, dx -; call putint - - int 0x10 - db 0xEB, 0xFE - jmp _main + + 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 @@ -237,17 +930,25 @@ putint: ; ax=argument int 0x10 cmp di, 0 ja putint_print - + + ;mov ah, 0x0e + ;mov bx, 0x0007 + ;mov al, ',' + ;int 0x10 + popa ret ;-------------------------------------------------- very_very_far_func: ; call char_vga_savebios ; push dx - mov si, 0x3FFE +; call load_env_buf + + mov si, 0x7FFE mov [si], sp - mov bx, 0x0050 + mov bx, [shell_seg] + cli mov ds, bx mov es, bx mov ss, bx @@ -256,7 +957,7 @@ very_very_far_func: mov dx, 0xFFF8 mov sp, dx mov bp, dx - + sti mov [si-0x0001], cs add ax, 0x0A mov [si-0x0003], ax @@ -266,8 +967,11 @@ very_very_far_func: mov [si-0x0005], dl mov dl, 0xCB mov [si-0x0004], dl - - jmp 0x0050:0x0000 + db 0xEA + dw 0x0000 +shell_seg: + dw 0x8050 + ;jmp 0x8050:0x0000 ;-------------------------------------------------- char_vga_setbios: mov cx, bx ; preserve bx @@ -286,5 +990,241 @@ char_vga_savebios: int 0x10 mov bx, cx ; restore bx 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 + +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 ax, cs;[ds:0xFFFE] + ;mov ds, ax + 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 + ;pusha + ;call putint + ;popa + mov di, [cs:yotshell_ptrofenv] + mov si, yotshell_env_buf + 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 + 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 + rep movsb + popf + pop si + pop ax + pop cx + pop es + pop di + ret + +convchs: ; LBA=AX; CHS = CBA + pushf +; call putint + 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 +; mov ax, 9; 0x3021 +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 + ;mov [convchsformat_buf_c], cx + ;mov [convchsformat_buf_h], bx + ;mov [convchsformat_buf_s], ax + ;mov [convchsformat_buf_num], dx + + xchg ch, cl + shl cl, 0x06 + add cl, al + mov al, dl + mov ah, 0x02 + xor dl, dl + mov dh, bl + + ;mov ah, [convchsformat_buf_num] + ret + +;convchsformat_buf_c: dw 0x0 +;convchsformat_buf_h: dw 0x0 +;convchsformat_buf_s: dw 0x0 +;convchsformat_buf_num: dw 0x0 + +;global var 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 16 dw 0 +view_length: dw 0 +now_screenid: dw 0x1 +scancode_processing: dw 0x1 ; disable + +local_var_start: +;-----------------------------------: +;local_var +sector_to_load: dw 0x3021 +sector_to_load_ax: dw 0xAAAA +yotshell_sizeofenv: dw 0xBAAD ; BAAD => unset +yotshell_ptrofenv: dw 0xBAAD +yotshell_envseted: db 0x00 +yotshell_env_buf: times 512 dw 0 +;------------------------------------- +local_var_end: +local_var_size: dw 0 + +;multiprocess_position: dw 0x8050 + diff --git a/reader.c b/reader.c new file mode 100644 index 0000000..3d3b735 --- /dev/null +++ b/reader.c @@ -0,0 +1,38 @@ +#include +/* +short rval = 8; +short abc[100];*/ +int main() +{ + putstr("i am reader.c"); + return 0xF00D; +/* XYCOORD xys; + short k; + extern int char_vga_cursor_x; + extern int char_vga_cursor_y; + int i; + + chv_init_cursor(); + chv_memwrite(5,4); + xys.y = 23; + xys.x = 4; + chv_set_cursor(&xys); + putint(char_vga_cursor_y); + for(i=0; i<9; i++){ + chv_putchar('F'); + } + chv_sync_cursor(); + yotrl(abc,"",99); + putstr(abc); + chv_putchar(' '); + + while(1){ + int a = getch(); + a = GETCH_SCANCODE(a); + putcharhex(a); + } + putint(getstr(abc,10)); + putstr(abc); + + return 0xF00D;*/ +} diff --git a/while1.c b/while1.c new file mode 100644 index 0000000..d9524e2 --- /dev/null +++ b/while1.c @@ -0,0 +1,39 @@ +#include +/* +short rval = 8; +short abc[100];*/ +int main() +{ + putstr("i am stupid"); + while(1); + return 0xF00D; +/* XYCOORD xys; + short k; + extern int char_vga_cursor_x; + extern int char_vga_cursor_y; + int i; + + chv_init_cursor(); + chv_memwrite(5,4); + xys.y = 23; + xys.x = 4; + chv_set_cursor(&xys); + putint(char_vga_cursor_y); + for(i=0; i<9; i++){ + chv_putchar('F'); + } + chv_sync_cursor(); + yotrl(abc,"",99); + putstr(abc); + chv_putchar(' '); + + while(1){ + int a = getch(); + a = GETCH_SCANCODE(a); + putcharhex(a); + } + putint(getstr(abc,10)); + putstr(abc); + + return 0xF00D;*/ +} diff --git a/yotlibc/bccfunc.s b/yotlibc/bccfunc.s index 3060428..7aedaac 100644 --- a/yotlibc/bccfunc.s +++ b/yotlibc/bccfunc.s @@ -1,9 +1,90 @@ ; 專門給 bcc 用的,我不知道為什麼它會缺基本功能 - +global _env_load +global _env_save +global _env_def +global isru +global isr +global isl +global islu +global imul_ +global imul_u +global imodu +global idiv_u global imod +global imodu + +idiv_: + cwd + idiv bx + ret + + +idiv_u: + xor dx,dx + div bx + ret + imod: - cwd - idiv bx - mov ax,dx - ret + cwd + idiv bx + mov ax,dx + ret + + +imodu: + xor dx,dx + div bx + mov ax,dx + ret + + +imul_: +imul_u: + imul bx + ret + + +isl: +islu: + mov cl,bl + shl ax,cl + ret + + +isr: + mov cl,bl + sar ax,cl + ret + + +isru: + mov cl,bl + shr ax,cl + ret + + +_env_def: + push bp + mov bp, sp + push cx + push si + mov cx, [bp+6] + mov si, [bp+4] + int 0x52 + pop si + pop cx + mov sp, bp + pop bp + ret + + +_env_save: + int 0x53 + ret + + +_env_load: + int 0x54 + ret + diff --git a/yotlibc/str_in.c b/yotlibc/str_in.c index 6f71791..77b4c21 100644 --- a/yotlibc/str_in.c +++ b/yotlibc/str_in.c @@ -122,6 +122,7 @@ int yotrl(dest, init, maxlen, color) }else{ switch(cscan){ case KEYDOWN_SCANCODE_ENTER: + chv_move_cursor(nowlen - pos); dest[nowlen++] = '\0'; if(++char_vga_cursor_y >= CHAR_VGA_SCREENY){ char_vga_cursor_y--; diff --git a/yotlibc/strbasic.c b/yotlibc/strbasic.c index c73757a..686b667 100644 --- a/yotlibc/strbasic.c +++ b/yotlibc/strbasic.c @@ -62,6 +62,8 @@ int strtos(str, store) }else{ return 0; } + }else if(*str == ' ' || *str == '\t' || *str == '\n'){ + break; }else{ return 0; /* Failed */ } diff --git a/yotlibc/yotlibc.h b/yotlibc/yotlibc.h index 4a1e6a3..fd458c0 100644 --- a/yotlibc/yotlibc.h +++ b/yotlibc/yotlibc.h @@ -21,12 +21,6 @@ #define false 0 #endif -#define exit(globalvar) \ - asm "mov sp, bp"; \ - asm "mov ax, [_" #globalvar "]" ; \ - asm "pop bp"; \ - asm "retf" - /* str_out.s */ void putint(unsigned short); /* 以 10 進位顯示一個 word (unsigned) */ void putcharhex(char); /* 以 16 進位顯示一個 byte */ diff --git a/yotsh.c b/yotsh.c index c9807c6..f0f180d 100644 --- a/yotsh.c +++ b/yotsh.c @@ -4,25 +4,30 @@ #define YOTSH_ENABLED(n) ((ctrlflag)&(n)) #define YOTSH_AUTOCOPY 0x0001 #define YOTSH_COUNTER 0x0002 - -int main(void){ +#define YOTSH_VERBOSE 0x0004 +int main(){ + /*---------------------*/ int cmdcount; int ctrlflag; + /*---------------------*/ + char cmdline[CMDMAX]; char argcopy[CMDMAX]; char *cp1, *cp2; bool end; - unsigned out; + unsigned out, loadaddr; extern int char_vga_cursor_x; extern int char_vga_cursor_y; XYCOORD screenxy; - + /*env_def(&ENV_END-sizeof(int),&ENV_START-&ENV_END-sizeof(int));*/ + env_def(&ctrlflag, 2*2); + if(!env_load()){ + ctrlflag = YOTSH_COUNTER; + cmdcount = 0; + putstr("YOT OS shell [Real mode]\r\n\r\n"); + } cmdline[0] = '\0'; - ctrlflag = YOTSH_COUNTER; - - putstr("\r\nYOT OS shell [Real mode]\r\n\r\n"); - - for(cmdcount=1; ; cmdcount++){ + while(++cmdcount){ if(YOTSH_ENABLED(YOTSH_COUNTER)){ putint(cmdcount); putstr(":"); @@ -40,11 +45,18 @@ int main(void){ CHV_COLORPAIR(CHV_COLOR_LIGHT_RED, CHV_COLOR_BLACK)); } + if(YOTSH_ENABLED(YOTSH_VERBOSE)){ + putstr("+ "); + putstr(cmdline); + putstr("\r\n"); + } + for(cp1=cmdline, cp2=argcopy; *cp1 != ' '&& *cp1 != '\0'; cp1++, cp2++){ *cp2 = *cp1; } end = ((*cp1 == '\0') ? true : false); + *cp2 = '\0'; if(!strcmp(argcopy, "set")){ @@ -52,33 +64,42 @@ int main(void){ if(!end){ cp2++; } + for(; *cp2 == ' '; cp2++); if((*cp2 == '\0' || *cp2 == '?') || !strcmp(cp2, "help")){ putstr("YOTSH function list:" "\r\n autocopy " "Automatically copy last command to input buffer" "\r\n counter " "Enable counter in command prompt" + "\r\n verbose " + "Print the input line as they are read" "\r\n"); }else if(!strcmp(cp2, "autocopy")){ ctrlflag |= YOTSH_AUTOCOPY; }else if(!strcmp(cp2, "counter")){ ctrlflag |= YOTSH_COUNTER; + }else if(!strcmp(cp2, "verbose")){ + ctrlflag |= YOTSH_VERBOSE; }else{ putstr("yotsh: set: invalid function name `"); putstr(cp2); putstr("\'\r\n"); + putstr("Type `set help\' for more information.\r\n"); } }else if(!strcmp(argcopy, "unset")){ cp2 = cmdline + 5; if(!end){ cp2++; } + for(; *cp2 == ' '; cp2++); if((*cp2 == '\0' || *cp2 == '?') || !strcmp(cp2, "help")){ putstr("Please type `set help\' to get function list\r\n"); }else if(!strcmp(cp2, "autocopy")){ ctrlflag &= ~(YOTSH_AUTOCOPY); }else if(!strcmp(cp2, "counter")){ ctrlflag &= ~(YOTSH_COUNTER); + }else if(!strcmp(cp2, "verbose")){ + ctrlflag &= ~(YOTSH_VERBOSE); }else{ putstr("yotsh: unset: invalid function name `"); putstr(cp2); @@ -89,6 +110,11 @@ int main(void){ if(!end){ cp2++; } + if(*cp2 == '\0'){ + putstr("yotsh: read: too few argument\r\n"); + continue; + } + for(; *cp2 == ' '; cp2++); if(strtos(cp2, &out)){ cp1 = out; out = *cp1 & 0x00ff; @@ -102,6 +128,70 @@ int main(void){ putstr(cp2); putstr("\'\r\n"); } + }else if(!strcmp(argcopy, "tinyload") || + !strcmp(argcopy, "easyload")){ + cp2 = cmdline + 8; + if(!end){ + cp2++; + } + for(; *cp2 == ' '; cp2++); + if(*cp2 == '\0'){ + putstr("yotsh: tinyload: too few argument\r\n"); + continue; + } + if(strtos(cp2, &out)){ + out &= 0x0fff; + out |= 0x1000; + return out; + }else{ + putstr("yotsh: read: invalid address `"); + putstr(cp2); + putstr("\'\r\n"); + } + }else if(!strcmp(argcopy, "load")){ + cp2 = cmdline + 4; + if(!end){ + cp2++; + } + for(; *cp2 == ' '; cp2++); + if(*cp2 == '\0'){ + putstr("yotsh: load: two argument required\r\n"); + continue; + } + loadaddr = 0; + for(cp1=cp2; *cp1 != ' ' && *cp1 != '\0'; cp1++); + for(; *cp1 == ' '; cp1++); + + if(*cp1 == '\0'){ + putstr("yotsh: load: two argument required\r\n"); + continue; + } + for(; *cp1 == ' '; cp1++); + *(cp1 - 1) = '\0'; + if(strtos(cp2, &out)){ + out &= 0x0fff; + loadaddr |= out; + }else{ + putstr("yotsh: load: invalid address `"); + putstr(cp2); + putstr("\'\r\n"); + continue; + } + if(strtos(cp1, &out)){ + if(out & 0x0003){ + out = (out >> 2) + 1; + }else{ + out = (out >> 2); + } + loadaddr |= (out << 12); + *(cp1 - 1) = ' '; + return loadaddr; + }else{ + putstr("yotsh: load: invalid number `"); + putstr(cp1); + putstr("\'\r\n"); + continue; + } }else if(!strcmp(argcopy, "halt") || !strcmp(argcopy, "poweroff") || !strcmp(argcopy, "shutdown")){ @@ -109,10 +199,98 @@ int main(void){ }else if(!strcmp(argcopy, "reboot")){ cp1 = 0; asm "int 0x51"; + }else if(!strcmp(argcopy, "reload")){ + cp1=0; + return 0; + }else if(!strcmp(argcopy, "loadgarbage")){ + cp1=0; + return 74; + }else if(!strcmp(argcopy, "loadnull")){ + cp1=0; + return 57920; + }else if(!strcmp(argcopy, "loadstupid")){ + cp1=0; + return 73; + }else if(!strcmp(argcopy, "reload2")){ + cp1=0; + /*envsave(env,sizeof(env));*/ + return 0; + }else if(!strcmp(argcopy, "clear") || + !strcmp(argcopy, "cls")){ + chv_clear(); + chv_reset_cursor(); + char_vga_tobios(); + }else if(!strcmp(argcopy, "help") || + argcopy[0] == '?'){ + cp2 = cmdline + 4; + if(!end){ + cp2++; + } + for(; *cp2 == ' '; cp2++); + if(!strcmp(cp2, "set")){ + putstr("Syntax: set [option]\r\n" + "Type `set help\' to display option list.\r\n"); + }else if(!strcmp(cp2, "unset")){ + putstr("Syntax: unset [option]\r\n" + "Type `set help\' to display option list.\r\n"); + }else if(!strcmp(cp2, "read")){ + putstr("Syntax: read MEM_ADDR\r\n"); + }else if(!strcmp(cp2, "tinyload")){ + putstr("Syntax: tinyload SECTOR_OFFSET\r\n"); + }else if(!strcmp(cp2, "load")){ + putstr("Syntax: load SECTOR_OFFSET SIZE_KB\r\n"); + }else if(!strcmp(cp2, "clear")){ + putstr("Syntax: clear\r\n"); + }else if(!strcmp(cp2, "halt")){ + putstr("Syntax: halt\r\n"); + }else if(!strcmp(cp2, "reboot")){ + putstr("Syntax: reboot\r\n"); + }else if(!strcmp(cp2, "reload")){ + putstr("Syntax: reload\r\n"); + }else if(!strcmp(cp2, "loadgarbage") || + !strcmp(cp2, "loadstupid") || + !strcmp(cp2, "loadnull")){ + putstr(" You can try to guess it!\r\n" + " YYYYY\r\n" + " OOOOO\r\n" + " TTTTT\r\n" + " SSSSS\r\n" + " HHHHH\r\n" + " \r\n"); + }else{ + putstr("YOTSH command list:" + "\r\n set " + "Enable shell function" + "\r\n unset " + "Disable shell function" + "\r\n read " + "Load a byte from memory and display it" + "\r\n tinyload " + "Load a tiny program from disk (< 4KiB)" + "\r\n load " + "Load a program" + "\r\n clear " + "Clear the screen" + "\r\n halt " + "Shutdown the computer" + "\r\n reboot " + "Reboot the computer" + "\r\n reload " + "Reload ??" + "\r\n loadgarbage " + "Display some garbage to screen" + "\r\n loadstupid " + "Infinite loop" + "\r\n loadnull " + "Load a non-existent program" + "\r\n" + "You can press F12 to terminate a running program.\r\n"); + } }else if(*argcopy != '\0'){ putstr("yotsh: invalid command `"); putstr(argcopy); putstr("\'\r\n"); + putstr("Type `help\' for more information.\r\n"); }else{ cmdcount--; } -- cgit v1.2.3