88 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
| .code16
 | |
| 
 | |
| .section .stage2
 | |
| 
 | |
| # fills command line buffer
 | |
| # NO REGISTERS SAVED
 | |
| .global read_user_command_line
 | |
| read_user_command_line:
 | |
| 	# print initial command line
 | |
| 	movw $command_line_enter_msg, %si
 | |
| 	call puts
 | |
| 	movw $command_line_buffer, %si
 | |
| 	call puts
 | |
| 
 | |
| 	# prepare registers for input
 | |
| 	movw $command_line_enter_msg, %si
 | |
| 	movw $command_line_buffer, %di
 | |
|  .read_user_command_line_goto_end:
 | |
| 	cmpb $0, (%di)
 | |
| 	jz .read_user_command_line_loop
 | |
| 	incw %di
 | |
| 	jmp .read_user_command_line_goto_end
 | |
| 
 | |
|  .read_user_command_line_loop:
 | |
| 	call getc
 | |
| 
 | |
| 	cmpb $'\b', %al
 | |
| 	je .read_user_command_line_backspace
 | |
| 	cmpb $0x7F, %al
 | |
| 	je .read_user_command_line_backspace
 | |
| 
 | |
| 	# Not sure if some BIOSes return '\n' as enter, but check it just in case
 | |
| 	cmpb $'\r', %al
 | |
| 	je .read_user_command_line_done
 | |
| 	cmpb $'\n', %al
 | |
| 	je .read_user_command_line_done
 | |
| 
 | |
| 	pushw %ax
 | |
| 
 | |
| 	call isprint
 | |
| 	testb %al, %al
 | |
| 	jz .read_user_command_line_loop
 | |
| 
 | |
| 	popw %ax
 | |
| 
 | |
| 	# put byte to buffer
 | |
| 	movb %al, (%di)
 | |
| 	incw %di
 | |
| 
 | |
| 	# print byte
 | |
| 	call putc
 | |
| 
 | |
| 	jmp .read_user_command_line_loop
 | |
| 
 | |
|  .read_user_command_line_backspace:
 | |
| 	# don't do anything if at the beginning
 | |
| 	cmpw $command_line_buffer, %di
 | |
| 	je .read_user_command_line_loop
 | |
| 
 | |
| 	# decrement buffer pointer
 | |
| 	decw %di
 | |
| 
 | |
| 	# erase byte in display
 | |
| 	call print_backspace
 | |
| 
 | |
| 	jmp .read_user_command_line_loop
 | |
| 
 | |
|  .read_user_command_line_done:
 | |
| 	# null terminate command line
 | |
| 	movb $0, (%di)
 | |
| 
 | |
| 	call print_newline
 | |
| 
 | |
| 	ret
 | |
| 
 | |
| 
 | |
| .section .data
 | |
| 
 | |
| command_line_enter_msg:
 | |
| 	.asciz "cmdline: "
 | |
| 
 | |
| .global command_line
 | |
| command_line:
 | |
| # 100 character command line
 | |
| command_line_buffer:
 | |
| 	.ascii "root=/dev/sda2"
 | |
| 	.skip 100 - (. - command_line_buffer)
 |