OK, u té funkce 0x0A je v tom bufferu 1 byte určující kapacitu, pak 1 byte určující délku načtených dat, a pak X byte těch dat.
Nevím, jak s touhle funkcí zjistit konec vstupu. Asi ji používáte tak budeš vědět, jak to děláte.
To, že rovnou máš v paměti [delka, data...] se hodí a použil bych to pro uložení všech řádků. Takže nakonec můžeš mít kompletní data ve formátu:
3, 'abc', 6, 'nazdar', 5, 'bazar'
Ty řetězce pak projdeš a před výpisem doprostřed vložíš ten ukončovací '$' pro funkci 0x09.
V pseudokódu celý program může vypadat nějak takhle:
max_line_count equ 600
max_line_len equ 100
segment code
start:
...
read_lines:
if line_count == max_line_count
goto print_lines
; nacteni radku
buffer.used = 0
int21.read(buffer)
; nevim jak s touto funkci detekovat konec vstupu
; dejme tomu, ze to bude zadani <ctrl-z>, <enter>
; tj. v bufferu bude jeden znak s hodnotu 26
if buffer.used == 1 and buffer.data[0] == 26:
goto print_lines
; ulozeni radku. delka + data
copy_src = @buffer.used
copy_dst = save.ptr
copy_len = buffer.used + 1
copy(copy_dst, copy_src, copy_len)
line_count += 1
save.ptr += copy_len
goto read_lines
; vypsat prvni polovinu nactenych radku
; a z kazdeho radku jen prvni polovinu nactenych bajtu
print_lines:
line_count = line_count / 2
save.ptr = @save.data
next_line:
if line_count == 0
goto end
line_count -= 1
line_length = save.ptr[0]
line_data = save.ptr + 1
save.ptr += 1 + line_length
line_length = line_length / 2
if line_length == 0
goto end_line
line_data[line_length] = '$'
int21.print(line_data)
end_line:
int21.print(crlf)
goto next_line
end:
int21.exit(0)
segment data
line_count dw 0
crlf db 13, 10, '$'
buffer:
.max db max_line_len + 1
.used db 0
.data resb max_line_len + 1
save:
.data resb (1 + max_line_len + 1) * max_line_count
.ptr dw save.data