Dobrý den,
snažím se vypsat inteligentně text - tedy wrapovat v mezerách. Postupuji tak, že si vložím si do záslobníku, načítám byte per byte slovo dokud nenajdu mezeru, či vynucení nového řádku - pro což jsem si vyčlenil \$. Pokud najdu mezeru, podívám se, zda se toto slovo vejde do řádku - jehož velikost je uchována v cl (používám lodsb, který char ukládá do al). Pokud ne, či pokud došlo na vynucení řádku - \$, zavolá se .newLine - který jen posune kurzor o řádek dolů a anuluje počítanou velikost řádku. Nyní vypíše slovo do teletextu byte per byte, dokud nenajde mezeru, či vynucení - tentokrát se ale vrací na "zčeknutí" dalšího slova.
OsPrintString:
line db 0
pusha
mov ah, 0Eh ; int 10h teletype function
.loadWord:
push si
jmp .chaining
.summary:
pop si
cmp [line], cl
jg .newLine
jmp .writeWord
.chaining:
lodsb
cmp al, 0
je .summary
cmp al, 92
je .chanTestEsc
cmp al, 32
je .summary
inc byte [line]
jmp .chaining
.chanTestEsc:
lodsb
cmp al, 36
je .newLine
inc byte [line]
cmp al, 92
je .chanTestEsc
inc byte [line]
jmp .chaining
.writeWord:
lodsb ; Get char from string
cmp al, 0
je .done ; If char is zero, end of string
cmp al, 92 ; Is escape letter?
je .testEsc
int 10h ; Otherwise, print it
cmp al, 32
je .loadWord
jmp .writeWord
.testEsc:
lodsb
cmp al, 36
je .loadWord
mov bl, al
mov al, 92
int 10h
mov al, bl
cmp al, 92
je .testEsc
int 10h
jmp .writeWord
.newLine:
inc dh
mov byte [line], 0
call OsMoveCursor
jmp .writeWord
Něco je však na mé logice špatně... :) (Něco se přecijen vypíše - ale vidím jen horní konce delších písmen - těsně pod obrazovkou.)
Děkuji.