[org     100h]
[segment .text]
                mov     AX, 0A000h              ; nastaveni adressy rezimu
                mov     ES, AX
                mov     AH, 0Fh                 ; zjistime mod
                int     10h
	        mov	[rezim], AL	        ; ulozeni modu
                mov     AX, 13h                 ; inicializuju grafickej rezim 320x200x256
                int     10h
                mov     CX, 255                 ; mame 256 barev
paleta:         cmp     CL, 64                  ; chceme udelat barvy 0..63, prechod cerna - modra?
                jb      c1
                cmp     CL, 128                 ; chceme barvy 64..127, prechod modra - cervena?
                jb      c2
                cmp     CL, 192                 ; chceme barvy 128..191, prechod cervena - zelena?
                jb      c3

                push    CX                      ; chceme barvy 192..255, prechod zelena - bila?
                sub     CL, 128                 ; ..::POZN - indexy jsou od vyssich barev tedy                                              
                mov     AH, CL                  ; R = 63..0
                pop     CX
                mov     BX, 3F3Fh               ; G = B = 63
                jmp     paldal

c1:             xor     AH, AH                  ; R = 0
                mov     BX, CX                  ; G = 0, B = 63..0
                jmp     paldal

c2:             xor     BH, BH                  ; G = 0
                push    CX
                sub     CL, 64
                mov     AH, CL                  ; R = 63..0
                pop     CX
                mov     BL, 63                  ; B = 0..63
                sub     BL, AH
                jmp     paldal

c3  :           push    CX
                sub     CL, 128
                mov     BL, CL                  ; B = 63..0
                pop     CX
                mov     AH, 63
                sub     AH, BL                  ; R = 0..63
                mov     BH, BL                  ; G = B

paldal:         mov     DX, 03C8h               ; vyber portu pro zapis adres
                mov     AL, CL
                out     DX, AL                  ; poslu index
                inc     DX                      ; vyberu datovej port grafarny
                mov     AL, AH
                out     DX, AL                  ; nastavim R
                mov     AL, BH
                out     DX, AL                  ; nastavim G
                mov     AL, BL
                out     DX, AL                  ; nastavim B
                loop    paleta                    ; udelam pro vsechny barvy
                mov     CX, 0FFh

DalsiN:  	mov	AL, CL                  ; zjistime, jestli je N sude nebo liche
	        shr     AL, 1
	        jc	liche

         	xor	AH, AH
          mov	[x0], word 0		; nastavim souradnice pro sude N
	        mov	[y0], word 199
	        mov	[x1], word 255
	        sub	[x1], word CX
	        mov	[y1], word 0
	        mov	[barva], byte CL
	        jmp	Nok
liche:         xor	AH, AH
	        mov	[x0], word 256		; nastvime souradnice pro liche N
	        mov	[y0], word 0
	        mov	[x1], word 64
	        add	[x1], word CX
	        mov	[y1], word 199
	        mov	[barva], byte CL

Nok:	    call	Bress             ; a zavolame vlastni algoritmus pro caru
	        loop	DalsiN                 ; to opakujeme pro vsechna N

neesc:    in      AL, 60h                 ; pak uz jen cekame na <esc>
          dec     AL
          jnz     neesc
          mov     AX, [rezim]             ; vratime puvodni graf. rezim
          int     10h
          ret                             ; ..::konecek programu::..

Bress:
	        push	si
	        push	di
	        push	dx
	        push	ax
	        push	bp
	        push	bx
	        push	cx
	        mov	SI, [x0]
	        mov	DI, [y0]
	        mov	ax,320
	        mul	di
	        add	ax, SI			; spocteme adresu v pameti
	        mov	di,ax
	        mov	DL, [barva]
	        mov	[ES:DI], DL
	        mov	SI, 1			; zmenime souradnici o jeden bod
	        mov	BP, 320
	        mov	AX, [x1]		; abs(x1 - x0)
	        sub	AX, [x0]
	        jnc	n1
	        neg	AX			; kdyz je rozdil zaporny tak zmenim znaminka
	        neg	SI			; bude se odcitat posun opacnym smerem
n1:    	
          mov	BX, [y1]		; urceni abs(y1-y0)
	        sub	BX, [y0]
	        jnc	n2		; kdyz je rozdil zaporny tak zmenim znaminka
	        neg	BX			; zmena znamenka rozdilu
	        neg	BP			; zmena znamenka posunu po obrazovce - nebude se pricitat ale odcitat
n2:                       ; AX=abs(x1-x0), BX=abs(y1-y0) a SI, BP  posuny po bodech
	        cmp	AX, BX			; podle jaky souradnice budeme skakat
	        jnc	hlavni
	        xchg	AX, BX
	        xchg	SI, BP
hlavni:      
          mov	CX, AX
	        inc	CX
	        mov	DX, AX			; spoctu polovinu hlavni osy
	        shr	DX, 1
	        neg	DX
          mov	[hla], AX
	        mov	AL,[barva]
opakuj:
        	mov	[ES:DI], AL
	        add	DI, SI			; posunu se po hlavni ose
	        add	DX, BX			; prictu vedlejsi osu
	        jnc	dale
	        sub	DX, [hla]		; hlavni snizim
	        add	DI, BP			; pridam k vedlejsi
dale:	    loop	opakuj		; a opakuju do znova

          pop	cx
          pop	bx
          pop	bp
          pop	ax
          pop	dx
          pop	di
          pop	si
          ret                            

        rezim   db	0
        x0	dw	0
        x1	dw	0
        y0	dw	0
        y1	dw	0
        barva	db	0
        hla	dw	0 