diff options
author | lantw44 <lantw44@gmail.com> | 2013-01-19 14:46:39 +0800 |
---|---|---|
committer | lantw44 <lantw44@gmail.com> | 2013-01-19 14:46:39 +0800 |
commit | 21f4b645319848112fd62b0bb5019d98f8e4a741 (patch) | |
tree | 7825680d2f45aaaf8f263cdf4ef7a3bb9d16943b | |
parent | d16cda16bbc5f5d51cce15584014cccafbcf08da (diff) | |
download | yotos-21f4b645319848112fd62b0bb5019d98f8e4a741.tar yotos-21f4b645319848112fd62b0bb5019d98f8e4a741.tar.gz yotos-21f4b645319848112fd62b0bb5019d98f8e4a741.tar.bz2 yotos-21f4b645319848112fd62b0bb5019d98f8e4a741.tar.lz yotos-21f4b645319848112fd62b0bb5019d98f8e4a741.tar.xz yotos-21f4b645319848112fd62b0bb5019d98f8e4a741.tar.zst yotos-21f4b645319848112fd62b0bb5019d98f8e4a741.zip |
Update to the latest version!
-rw-r--r-- | Makefile | 27 | ||||
-rw-r--r-- | kernel.s | 1076 | ||||
-rw-r--r-- | reader.c | 38 | ||||
-rw-r--r-- | while1.c | 39 | ||||
-rw-r--r-- | yotlibc/bccfunc.s | 91 | ||||
-rw-r--r-- | yotlibc/str_in.c | 1 | ||||
-rw-r--r-- | yotlibc/strbasic.c | 2 | ||||
-rw-r--r-- | yotlibc/yotlibc.h | 6 | ||||
-rw-r--r-- | yotsh.c | 196 |
9 files changed, 1379 insertions, 97 deletions
@@ -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 @@ -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 <yotlibc.h>
+/*
+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 <yotlibc.h>
+/*
+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 */ @@ -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" + " <!-- Unknown special command -->\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--; } |