Fixed some bugs with inputs
This commit is contained in:
@@ -1,2 +1,5 @@
|
|||||||
PRINT "Hello World"
|
PRINT "Hello, what is your name?"
|
||||||
|
INPUT $1
|
||||||
|
PRINT "Hello " ;
|
||||||
|
PRINT $1
|
||||||
END
|
END
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ ebr_system_id: db 'FAT12 ' ; must be 8 bytes
|
|||||||
fat12_file_name: db ' ' ; 11 free bytes to store a filename in
|
fat12_file_name: db ' ' ; 11 free bytes to store a filename in
|
||||||
boot_message: db 'OK] Kernel successfully loaded!\n"HELP" to see a list of available commands\n', 0
|
boot_message: db 'OK] Kernel successfully loaded!\n"HELP" to see a list of available commands\n', 0
|
||||||
user_input: times 20 db 0
|
user_input: times 20 db 0
|
||||||
prompt_length: db 20
|
prompt_length: dw 20
|
||||||
prompt: db 'sh > ', 0
|
prompt: db 'sh > ', 0
|
||||||
help_string: db 'HELP', 0
|
help_string: db 'HELP', 0
|
||||||
clear_string: db 'CLEAR', 0
|
clear_string: db 'CLEAR', 0
|
||||||
@@ -35,7 +35,7 @@ basic_string: db 'BAS', 0
|
|||||||
cat_string: db 'CAT', 0
|
cat_string: db 'CAT', 0
|
||||||
ls_string: db 'LS', 0
|
ls_string: db 'LS', 0
|
||||||
ed_string: db 'ED', 0
|
ed_string: db 'ED', 0
|
||||||
help_text: db 'This is for Cowards:\n"LS" to list the directory,\n"CAT" to output the contents of a file,\n"BAS" to run a basic script,\n"HELP" for this helpful text,\n"CLEAR" to clear the screen,\n"REBOOT" or esc to reboot\n', 0
|
help_text: db 'This is for Cowards:\n"LS" to list the directory,\n"CAT <filename>" to output the contents of a file,\n"BAS <filename>" to run a basic script,\n"HELP" for this helpful text,\n"CLEAR" to clear the screen,\n"REBOOT" or esc to reboot\n', 0
|
||||||
basic_text: db 'BASIC PROGRAM BEGUN:\n', 0
|
basic_text: db 'BASIC PROGRAM BEGUN:\n', 0
|
||||||
command_result_text: db 'You typed: ', 0
|
command_result_text: db 'You typed: ', 0
|
||||||
unknown_command: db 'Error: Unkown Command..\n ', 0
|
unknown_command: db 'Error: Unkown Command..\n ', 0
|
||||||
@@ -48,12 +48,6 @@ file_not_found: db 'File not found\n', 0
|
|||||||
too_long_filename: db 'Filename too long for Fat12\n', 0
|
too_long_filename: db 'Filename too long for Fat12\n', 0
|
||||||
file_found: db 'File found\n', 0
|
file_found: db 'File found\n', 0
|
||||||
loading_root: db 'Loading root diretory\n', 0
|
loading_root: db 'Loading root diretory\n', 0
|
||||||
read_only: db 'Read Only', 0 ; 1
|
|
||||||
hidden: db ' Hidden ', 0 ; 2
|
|
||||||
system: db ' System ', 0 ; 4
|
|
||||||
volume: db ' Volume ', 0 ; 8
|
|
||||||
directory: db 'Directory', 0 ; 10
|
|
||||||
archive: db ' Archive ', 0 ; 20
|
|
||||||
file_name_length: db 0
|
file_name_length: db 0
|
||||||
file_cluster: dw 0
|
file_cluster: dw 0
|
||||||
file_length: dd 0
|
file_length: dd 0
|
||||||
|
|||||||
@@ -1950,8 +1950,9 @@ do_input:
|
|||||||
|
|
||||||
.number_var:
|
.number_var:
|
||||||
mov ax, .tmpstring ; Get input from the user
|
mov ax, .tmpstring ; Get input from the user
|
||||||
mov bx, 6
|
mov bx, 20
|
||||||
call keyboard_display_input
|
call keyboard_display_input
|
||||||
|
jc .end
|
||||||
|
|
||||||
mov ax, .tmpstring
|
mov ax, .tmpstring
|
||||||
call string_length
|
call string_length
|
||||||
@@ -1973,8 +1974,6 @@ do_input:
|
|||||||
call os_print_newline
|
call os_print_newline
|
||||||
|
|
||||||
jmp mainloop
|
jmp mainloop
|
||||||
|
|
||||||
|
|
||||||
.string_var:
|
.string_var:
|
||||||
mov ax, 128
|
mov ax, 128
|
||||||
mul bx
|
mul bx
|
||||||
@@ -1987,8 +1986,9 @@ do_input:
|
|||||||
|
|
||||||
jmp mainloop
|
jmp mainloop
|
||||||
|
|
||||||
|
.tmpstring times 20 db 0
|
||||||
.tmpstring times 6 db 0
|
.end
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
; -----------------------------------------------------------
|
; -----------------------------------------------------------
|
||||||
|
|||||||
29
source/kernel/features/check.asm
Normal file
29
source/kernel/features/check.asm
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
check_is_number:
|
||||||
|
cmp al, 48
|
||||||
|
jl .not_number
|
||||||
|
cmp al, 57
|
||||||
|
jg .not_number
|
||||||
|
stc
|
||||||
|
ret
|
||||||
|
.not_number:
|
||||||
|
clc
|
||||||
|
ret
|
||||||
|
|
||||||
|
check_is_letter:
|
||||||
|
cmp al, 65
|
||||||
|
jl .not_letter
|
||||||
|
cmp al, 122
|
||||||
|
jg .not_letter
|
||||||
|
cmp al, 90
|
||||||
|
jg .maybe_not_letter
|
||||||
|
stc
|
||||||
|
ret
|
||||||
|
.maybe_not_letter:
|
||||||
|
cmp al, 97
|
||||||
|
jl .not_letter
|
||||||
|
stc
|
||||||
|
ret
|
||||||
|
.not_letter:
|
||||||
|
clc
|
||||||
|
ret
|
||||||
|
|
||||||
@@ -11,6 +11,7 @@ os_start_cli:
|
|||||||
mov ax, user_input
|
mov ax, user_input
|
||||||
|
|
||||||
call keyboard_display_input
|
call keyboard_display_input
|
||||||
|
jc power_reboot
|
||||||
jmp os_read_cli
|
jmp os_read_cli
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -171,6 +171,7 @@ disk_clear_output_buffer:
|
|||||||
; OUT
|
; OUT
|
||||||
; data_buffer: file contents
|
; data_buffer: file contents
|
||||||
; TODO use predefined data for calculations
|
; TODO use predefined data for calculations
|
||||||
|
; carry flag: set if failed to load file
|
||||||
disk_load_file:
|
disk_load_file:
|
||||||
pusha
|
pusha
|
||||||
call string_length ; cl = string length
|
call string_length ; cl = string length
|
||||||
@@ -227,11 +228,15 @@ disk_load_file:
|
|||||||
.file_not_found:
|
.file_not_found:
|
||||||
mov si, file_not_found
|
mov si, file_not_found
|
||||||
call os_print_string
|
call os_print_string
|
||||||
jmp .done
|
jmp .done_fail
|
||||||
.filename_too_long:
|
.filename_too_long:
|
||||||
mov si, too_long_filename
|
mov si, too_long_filename
|
||||||
call os_print_string
|
call os_print_string
|
||||||
jmp .done
|
jmp .done_fail
|
||||||
|
.done_fail:
|
||||||
|
popa
|
||||||
|
stc
|
||||||
|
ret
|
||||||
.done:
|
.done:
|
||||||
popa
|
popa
|
||||||
ret
|
ret
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ os_read_input:
|
|||||||
|
|
||||||
; AX = key pressed
|
; AX = key pressed
|
||||||
; Returns straight away
|
; Returns straight away
|
||||||
|
; carry flag is set when escape is pressed and data is returned straight away
|
||||||
keyboard_check_key:
|
keyboard_check_key:
|
||||||
xor ax,ax
|
xor ax,ax
|
||||||
mov ah, 11h ; BIOS call to check for key
|
mov ah, 11h ; BIOS call to check for key
|
||||||
@@ -27,11 +28,11 @@ keyboard_check_key:
|
|||||||
; IN:
|
; IN:
|
||||||
; AX = output address
|
; AX = output address
|
||||||
; BX = max length
|
; BX = max length
|
||||||
|
|
||||||
keyboard_display_input:
|
keyboard_display_input:
|
||||||
pusha
|
pusha
|
||||||
mov di, ax
|
mov di, ax
|
||||||
mov ax, bx
|
xor ax,ax
|
||||||
|
mov [prompt_length], bx
|
||||||
|
|
||||||
.check_key_pressed:
|
.check_key_pressed:
|
||||||
call os_read_input
|
call os_read_input
|
||||||
@@ -54,7 +55,9 @@ keyboard_display_input:
|
|||||||
jmp .check_key_pressed
|
jmp .check_key_pressed
|
||||||
|
|
||||||
.esc_key:
|
.esc_key:
|
||||||
call power_reboot
|
stc
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
.enter_key:
|
.enter_key:
|
||||||
mov al, 0
|
mov al, 0
|
||||||
@@ -63,7 +66,7 @@ keyboard_display_input:
|
|||||||
ret ; Return to the parent function (whatever that may be)
|
ret ; Return to the parent function (whatever that may be)
|
||||||
|
|
||||||
.backspace:
|
.backspace:
|
||||||
cmp bx, 20 ; Cannot backspace if the cursor is at the start
|
cmp bx, [prompt_length] ; Cannot backspace if the cursor is at the start
|
||||||
jb .move_cursor_back ; then .move_cursor_back
|
jb .move_cursor_back ; then .move_cursor_back
|
||||||
jmp .check_key_pressed ; Else check the next key
|
jmp .check_key_pressed ; Else check the next key
|
||||||
|
|
||||||
@@ -86,6 +89,7 @@ keyboard_display_input:
|
|||||||
mov ah, 0Eh
|
mov ah, 0Eh
|
||||||
int 10h
|
int 10h
|
||||||
jmp .check_key_pressed
|
jmp .check_key_pressed
|
||||||
|
.input_length db 0
|
||||||
|
|
||||||
keyboard_get_cursor_pos:
|
keyboard_get_cursor_pos:
|
||||||
ret
|
ret
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ string_join:
|
|||||||
|
|
||||||
; ------------------------------------------------------------------------
|
; ------------------------------------------------------------------------
|
||||||
; TODO
|
; TODO
|
||||||
; Converts a null terminated string to an integer
|
; Converts a string to an integer
|
||||||
; IN: SI = string location (max 5 chars, up to '65536')
|
; IN: SI = string location (max 5 chars, up to '65536')
|
||||||
; OUT: AX = number
|
; OUT: AX = number
|
||||||
string_cast_to_int:
|
string_cast_to_int:
|
||||||
@@ -116,8 +116,12 @@ string_cast_to_int:
|
|||||||
.loop:
|
.loop:
|
||||||
xor ax,ax
|
xor ax,ax
|
||||||
lodsb
|
lodsb
|
||||||
cmp al, 0
|
|
||||||
je .finish
|
cmp al, 30h
|
||||||
|
jl .finish
|
||||||
|
cmp al, 39h
|
||||||
|
jg .finish
|
||||||
|
|
||||||
sub al, 30h
|
sub al, 30h
|
||||||
mov bx, ax
|
mov bx, ax
|
||||||
mov ax, 10
|
mov ax, 10
|
||||||
|
|||||||
@@ -7,10 +7,12 @@ util_cat:
|
|||||||
add si, 4 ; Move si to after 'CAT'
|
add si, 4 ; Move si to after 'CAT'
|
||||||
|
|
||||||
call disk_load_file
|
call disk_load_file
|
||||||
|
jc .done ; if file failed to load, just quit
|
||||||
|
|
||||||
mov si, file_buffer
|
mov si, file_buffer
|
||||||
mov cx, [file_length]
|
mov cx, [file_length]
|
||||||
call text_print_raw
|
call text_print_raw
|
||||||
|
.done
|
||||||
popa
|
popa
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@@ -34,6 +36,7 @@ util_basic:
|
|||||||
; TODO make this more consistent to account for double spaces
|
; TODO make this more consistent to account for double spaces
|
||||||
;add si, 3 ; Move si to after 'BAS'
|
;add si, 3 ; Move si to after 'BAS'
|
||||||
call disk_load_file
|
call disk_load_file
|
||||||
|
jc .done
|
||||||
|
|
||||||
mov si, file_buffer
|
mov si, file_buffer
|
||||||
|
|
||||||
@@ -41,6 +44,7 @@ util_basic:
|
|||||||
mov si, 0
|
mov si, 0
|
||||||
call basic_run_basic
|
call basic_run_basic
|
||||||
|
|
||||||
|
.done
|
||||||
popa
|
popa
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
; Planned commands:
|
; Planned commands:
|
||||||
; i insert
|
; i insert
|
||||||
; a append
|
; a append
|
||||||
|
; d delete
|
||||||
; l prints lines
|
; l prints lines
|
||||||
; w save to disk
|
; w save to disk
|
||||||
; q quit
|
; q quit
|
||||||
ed:
|
ed:
|
||||||
pusha
|
pusha
|
||||||
mov si, ed_welcome
|
call .determine_line_count
|
||||||
call os_print_string
|
|
||||||
.main_loop:
|
.main_loop:
|
||||||
mov ax, ed_prompt
|
mov ax, ed_prompt
|
||||||
mov bx, 40
|
mov bx, 40
|
||||||
call keyboard_display_input ; AX = string location, BX = max prompt length
|
call keyboard_display_input ; AX = string location, BX = max prompt length
|
||||||
mov si, ed_prompt
|
mov si, ed_prompt
|
||||||
|
mov bx, 0 ; Keeps track of whether comma has passed
|
||||||
jmp .get_token
|
jmp .get_token
|
||||||
|
|
||||||
; Types of tokens:
|
; Types of tokens:
|
||||||
@@ -20,16 +21,138 @@ ed:
|
|||||||
; Doller (refers to the last line) $
|
; Doller (refers to the last line) $
|
||||||
; Comma ,
|
; Comma ,
|
||||||
; Command: eg i
|
; Command: eg i
|
||||||
; 123
|
; eg 123,127i
|
||||||
.get_token:
|
.get_token:
|
||||||
xor ax,ax
|
|
||||||
lodsb
|
lodsb
|
||||||
call check_is_number
|
|
||||||
jmp .exit
|
|
||||||
|
|
||||||
.exit:
|
; COMMA
|
||||||
|
cmp al, ','
|
||||||
|
je .comma
|
||||||
|
|
||||||
|
; NUMBER
|
||||||
|
call check_is_number
|
||||||
|
jc .get_number_token
|
||||||
|
|
||||||
|
; COMMAND
|
||||||
|
call check_is_letter
|
||||||
|
jc .get_letter_token
|
||||||
|
|
||||||
|
.error: ; Output ?
|
||||||
|
mov ah, 0Eh
|
||||||
|
|
||||||
|
mov al, '?'
|
||||||
|
int 10h
|
||||||
|
mov al, 0Ah
|
||||||
|
int 10h
|
||||||
|
mov al, 0Dh
|
||||||
|
int 10h
|
||||||
|
|
||||||
|
jmp .main_loop
|
||||||
|
|
||||||
|
; Assign a number to either the start or end int (start,end)
|
||||||
|
.get_number_token:
|
||||||
|
push si
|
||||||
|
dec si
|
||||||
|
call string_cast_to_int ; AX = integer
|
||||||
|
cmp bx, 0
|
||||||
|
je .assign_start_int
|
||||||
|
jg .assign_end_int
|
||||||
|
.assign_start_int:
|
||||||
|
mov [ed_start_int], ax
|
||||||
|
jmp .after_int_assign
|
||||||
|
.assign_end_int:
|
||||||
|
mov [ed_end_int], ax
|
||||||
|
.after_int_assign:
|
||||||
|
pop si
|
||||||
|
jmp .get_token
|
||||||
|
|
||||||
|
; Determines a command
|
||||||
|
.get_letter_token:
|
||||||
|
cmp al, 'd'
|
||||||
|
je .delete
|
||||||
|
cmp al, 'q'
|
||||||
|
je .quit
|
||||||
|
jmp .get_token
|
||||||
|
|
||||||
|
; Changes the value from start int to end int
|
||||||
|
.comma:
|
||||||
|
mov bx, 1
|
||||||
|
jmp .get_token
|
||||||
|
|
||||||
|
.determine_line_count:
|
||||||
|
mov si, file_buffer
|
||||||
|
mov dx, file_length ; STORES THE LENGTH OF THE FILE IN BYTES
|
||||||
|
xor cx,cx
|
||||||
|
.line_count_loop:
|
||||||
|
lodsb
|
||||||
|
cmp al, 0Ah
|
||||||
|
je .increment_line_count
|
||||||
|
dec dx
|
||||||
|
cmp dx, 0
|
||||||
|
jg .line_count_loop
|
||||||
|
mov [ed_line_count], cx
|
||||||
|
jmp .main_loop
|
||||||
|
.increment_line_count:
|
||||||
|
inc cx
|
||||||
|
jmp .line_count_loop
|
||||||
|
|
||||||
|
; COMMANDS
|
||||||
|
.delete:
|
||||||
|
; set up registers to shift data left
|
||||||
|
mov bx, ed_end_int
|
||||||
|
inc bx
|
||||||
|
call get_byte_of_line ; CX = byte of start of new line (relative to file buffer)
|
||||||
|
mov [ed_shift_from], cx
|
||||||
|
|
||||||
|
mov bx, ed_start_int
|
||||||
|
call get_byte_of_line
|
||||||
|
mov ax, ed_start_int
|
||||||
|
sub ax, cx
|
||||||
|
mov [ed_shift_by], ax
|
||||||
|
|
||||||
|
.quit:
|
||||||
popa
|
popa
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
shift_data_left:
|
||||||
|
mov si, ed_shift_from
|
||||||
|
mov cx, ed_shift_by
|
||||||
|
mov di, ed_shift_from
|
||||||
|
sub di, cx
|
||||||
|
mov dx, file_length ; STORES THE LENGTH OF THE FILE IN BYTES
|
||||||
|
.shift_left_loop:
|
||||||
|
lodsb
|
||||||
|
stosb
|
||||||
|
cmp al, 0
|
||||||
|
jne .shift_left_loop
|
||||||
|
jmp ed.main_loop
|
||||||
|
|
||||||
|
; BX = target line
|
||||||
|
get_byte_of_line:
|
||||||
|
push dx
|
||||||
|
mov si, file_buffer
|
||||||
|
xor dx,dx
|
||||||
|
xor cx,cx
|
||||||
|
jmp .increment_line_count
|
||||||
|
.line_loop:
|
||||||
|
lodsb
|
||||||
|
inc cx
|
||||||
|
cmp al, 0Ah
|
||||||
|
je .increment_line_count
|
||||||
|
.increment_line_count:
|
||||||
|
inc dx
|
||||||
|
cmp dx, bx
|
||||||
|
jne .line_loop
|
||||||
|
inc cx
|
||||||
|
pop dx
|
||||||
|
ret
|
||||||
|
|
||||||
|
ed_data_start: db "ED IS COOL"
|
||||||
ed_prompt: times 40 db 0
|
ed_prompt: times 40 db 0
|
||||||
ed_welcome: db "This is ED\n", 0
|
ed_start_int: dw 0
|
||||||
|
ed_end_int: dw 0
|
||||||
|
|
||||||
|
ed_line_count: dw 0
|
||||||
|
|
||||||
|
ed_shift_from: dw 0
|
||||||
|
ed_shift_by: dw 0
|
||||||
|
|||||||
Reference in New Issue
Block a user