Ввод строки символов с клавиатуры

Материал из SpeccyWiki
Перейти к: навигация, поиск

Ввод строки символов с клавиатуры - процедура опроса клавиатуры при вводе пользователем символьной ASCII-строки и вывод строки на экран. Символ курсора - нижнее подчеркивание. Реализовано также удаление последнего введенного символа клавишей BackSpace. При выводе символов строки на экран использована процедура вывода 64 символа в строке.

; чтение строки символов, введенных с клавиатуры
; вход: нет
; выход: (string_temp)=строка

read_key_string			ld	e,1
				ld	d,95
				ld	(string_temp),de

				ld	hl,string_temp
				ld	de,string_temp+1

				ld	bc,(col_screen)
				ld	(col_screen_temp),bc
				ld	a,(half_tile_screen)
				ld	(half_tile_screen_temp),a

				push	hl
				push	de
				call	print64
				pop	de
				pop	hl

read_key_string_01		xor	a
				ld	(23560),a

read_key_string_02		ld	a,(23560)
				and	a
				jp	z,read_key_string_02

				ld	b,a

				cp	13
				jp	z,read_key_string_06

				cp	12
				jp	nz,read_key_string_04
				ld	a,(hl)
				cp	1
				jp	z,read_key_string_01

				ld	a,32
				ld	(de),a
				ld	bc,(col_screen_temp)
				ld	(col_screen),bc
				ld	a,(half_tile_screen_temp)
				ld	(half_tile_screen),a
				push	hl
				push	de
				call	print64
				pop	de
				pop	hl

				dec	(hl)
				ld	a,95
				dec	de
				ld	(de),a
				jp	read_key_string_05

read_key_string_04		cp	32
				jp	c,read_key_string_01

				ld	a,(hl)
				cp	254
				jp	nc,read_key_string_01
				ld	a,b

				cp	97
				jp	c,read_key_string_03
				sub	a,32

read_key_string_03		ld	(de),a
				inc	de
				ld	a,95
				ld	(de),a
				inc	(hl)

read_key_string_05		ld	bc,(col_screen_temp)
				ld	(col_screen),bc
				ld	a,(half_tile_screen_temp)
				ld	(half_tile_screen),a
				push	hl
				push	de
				call	print64
				pop	de
				pop	hl

				jp	read_key_string_01

read_key_string_06		ld	a,32
				ld	(de),a
				ld	bc,(col_screen_temp)
				ld	(col_screen),bc
				ld	a,(half_tile_screen_temp)
				ld	(half_tile_screen),a
				push	hl
				call	print64
				pop	hl

				dec	(hl)

				ret

string_temp			defb	0					; промежуточная переменная-строка (первый байт - длина строки, 255 байт - коды символов строки)
				dup	255
				defb	32
				edup

col_screen			defb	0					; столбец экрана
row_screen			defb	0					; строка экрана
half_tile_screen		defb	0					; полузнакоместо (0=первое/1=второе)
attr_screen			defb	56					; атрибуты экрана

col_screen_temp			defw	0					; временные координаты на экране
half_tile_screen_temp		defb	0					; временное полузнакоместо