summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlantw44 <lantw44@gmail.com>2013-01-19 14:46:39 +0800
committerlantw44 <lantw44@gmail.com>2013-01-19 14:46:39 +0800
commit21f4b645319848112fd62b0bb5019d98f8e4a741 (patch)
tree7825680d2f45aaaf8f263cdf4ef7a3bb9d16943b
parentd16cda16bbc5f5d51cce15584014cccafbcf08da (diff)
downloadyotos-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--Makefile27
-rw-r--r--kernel.s1076
-rw-r--r--reader.c38
-rw-r--r--while1.c39
-rw-r--r--yotlibc/bccfunc.s91
-rw-r--r--yotlibc/str_in.c1
-rw-r--r--yotlibc/strbasic.c2
-rw-r--r--yotlibc/yotlibc.h6
-rw-r--r--yotsh.c196
9 files changed, 1379 insertions, 97 deletions
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 <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 */
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"
+ " <!-- 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--;
}