Fixed some bugs with inputs

This commit is contained in:
deadvey
2026-03-08 22:07:21 +00:00
parent 7a9b82d57c
commit 88716c0b64
10 changed files with 199 additions and 32 deletions

View File

@@ -1,2 +1,5 @@
PRINT "Hello World" PRINT "Hello, what is your name?"
INPUT $1
PRINT "Hello " ;
PRINT $1
END END

View File

@@ -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

View File

@@ -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
; ----------------------------------------------------------- ; -----------------------------------------------------------

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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