; SOJ - zadanie c.1
; Martin Cernicka, kruzok 16
; po zadani textu vypise pocet slov, zmeneny text a povodne jednotlive slova
; vdaka W. A. Mozartovi za sprievodnu hudbu ;-)

MODEL SMALL
JUMPS

CR      equ     0Ah, 0Dh
END_STR equ     0Dh                     ; znak konca retazca

DATA    SEGMENT
Prompt  DB      "Zadajte retazec: $"
Pocet   DB      0
Medzera DB      1
        DB      CR
Slova   DW      ?
        DB      CR, "$"
Buffer  DB      257 DUP (?)
Buffer2 DB      257 DUP (?)
DATA    ENDS

CODE   SEGMENT
ASSUME CS:CODE, DS:DATA
start: mov      AX, seg DATA
       mov      DS, AX
       mov      ES, AX
       mov      DI, offset Buffer
       mov      SI, offset Buffer2
       cld

       mov      AH, 9                   ; vypis
       mov      DX, offset Prompt
       int      21h

citaj: mov      AH, 1                   ; getch
       int      21h                     ; vrati znak v AL
       mov      [SI], AX                ; skopiruje znak aj do druheho buffera
       inc      SI

       cmp      AL, 'a'                 ; zmena velkosti
       jl       velke
       cmp      AL, 'z'
       jg       slovo
       xor      AL, 20h
       jmp      slovo
velke: cmp      AL, 'A'
       jl       slovo
       cmp      AL, 'Z'
       jg       slovo
       xor      AL, 20h

slovo: stosb
       cmp      AL, ' '                 ; test na oddelovac slov
       je       dalej
       cmp      AL, 9
       je       dalej
       cmp      AL, END_STR             ; znak konca retazca
       je       koniec

       cmp      [Medzera], 1            ; zaciatok noveho slova
       jne      citaj
       mov      [Medzera], 0
       inc      [Pocet]
       jmp      citaj

dalej: mov      [Medzera], 1
       jmp      citaj

koniec:mov      AL, '$'                 ; ukoncenie buffera
       stosb
       mov      AL, [Pocet]             ; konverzia cisla 0-99 na text
       mov      BL, 10d
       mov      AH, 0
       div      BL
       add      AX, 3030h               ; prevod na ascii
       mov      [Slova], AX
       mov      AH, 9
       mov      DX, offset Slova-2
       int      21h

       mov      AH, 2                   ; vypis buffera
       mov      SI, offset Buffer
pis:   lodsb
       cmp      AL, END_STR
       je       dal
       mov      DL, AL
       int      21h
       jmp      pis

dal:   mov      AH, 9                   ; novy riadok
       mov      DX, offset Buffer-3
       int      21h

       mov      [Medzera], 1
       mov      SI, offset Buffer2
vypis: lodsb
       cmp      AL, ' '
       je       nove
       cmp      AL, 9
       je       nove
       cmp      AL, END_STR
       je       skonci

       mov      [Medzera], 0
       mov      AH, 2
       mov      DL, AL
       int      21h
       jmp      vypis

nove:  cmp      [Medzera], 1
       je       vypis
nastav:mov      [Medzera], 1
       mov      AH, 9                   ; novy riadok
       mov      DX, offset Buffer-3
       int      21h
       jmp      vypis

skonci:mov      AX, 4C00h               ; uff, konecne
       int      21h

CODE    ENDS
END     start
