Fixed some bugs with inputs
This commit is contained in:
@@ -1,18 +1,19 @@
|
||||
; Planned commands:
|
||||
; i insert
|
||||
; a append
|
||||
; d delete
|
||||
; l prints lines
|
||||
; w save to disk
|
||||
; q quit
|
||||
ed:
|
||||
pusha
|
||||
mov si, ed_welcome
|
||||
call os_print_string
|
||||
call .determine_line_count
|
||||
.main_loop:
|
||||
mov ax, ed_prompt
|
||||
mov bx, 40
|
||||
call keyboard_display_input ; AX = string location, BX = max prompt length
|
||||
mov si, ed_prompt
|
||||
mov bx, 0 ; Keeps track of whether comma has passed
|
||||
jmp .get_token
|
||||
|
||||
; Types of tokens:
|
||||
@@ -20,16 +21,138 @@ ed:
|
||||
; Doller (refers to the last line) $
|
||||
; Comma ,
|
||||
; Command: eg i
|
||||
; 123
|
||||
; eg 123,127i
|
||||
.get_token:
|
||||
xor ax,ax
|
||||
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
|
||||
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_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