[ASM] wyswietlanie godziny... HELP

0

Prosze o pomoc :], mam progs do zrobienia/przerobienia, aby w miejsce gdzie wyswietla znak wyswietlal aktualna godzine. Wiem jak zaladowac godzine do rejestrow ch, cl, dh, dl, ale nie potrafie wyswietlic jej na ekranie :(. Jak w takim programie wyswietlic godzinke w miejscu klikniecia mysza:

.model small
.286                            ; dla rozkazu shl/shr xxx, 3

.stack 512
.code
        assume ds:@data
poczatek:
        mov ax, @data           ; ustawienie wlasciwej wartosci
        mov ds, ax              ; rejestru segmentowego
	mov ax, 0B800h		; zakładamy, że pracujemy w trybie 3
	mov es, ax
	mov ax, 0
	int 33h			; czy jest zainstalowany sterownik?
	or ax, ax
	jz koniec		; brak sterownika
        mov ax, 0001h
        int 33h                 ; pokaz kursor
petla:



        mov ax, 0003h
        int 33h                 ; odczytaj pozycje
	shr cx, 3	       ; dzielimy przez 8 (bo sterownik podaje
        shr dx, 3               ; wspolrzedne ekranu graficznego)
        mov ax, bx
        test ax, 1              ; czy wcisniety lewy klawisz?
        jz  nie_lewy
        mov bx, dx              ; y*80
        shl bx, 2               ; y*4
        add bx, dx              ; BX=y*5
        shl bx, 4               ; BX=y*80
	add bx, cx
	shl bx, 1		 ; przemieszczenie w BX (kazdy
                                ; znak jest przechowywany jako para
				; kod ASCII-atrybuty)
	mov AL,'0'
	mov AH,2Ch
	int 21h

	mov byte ptr es:[bx], 'r'

nie_lewy:
        test ax, 2              ; czy wcisniety prawy klawisz?
        jz  petla               ; jesli nie, to skok

        mov ax, 0002h
        int 33h                 ; ukryj kursor
koniec:
	mov ax, 4C00h           ; zakonczenie programu
	int 21h

end poczatek

Do programu dodalem:

	mov AL,'0'
	mov AH,2Ch
	int 21h

Ale nie wiem jak w tym miejscu:

	mov byte ptr es:[bx], 'r'

wkleic ta godzinke, zamiast godziny wyskakuja mi znaczki ASCII, jak wpakowac tu cos wiecej niz 1 znak...?

BTW, tak wyglada tresc zadanka:
Zmodyfikowac program tak, by w miejsce '*' pojawial sie aktualny czas
(pobrany np funkcja 2Ch DOSu). Uwzglednic krytyczne polozenie kursora
myszy (przy brzegu ekranu) oraz usuwanie poprzedniego wskazania.
</asm>

0

Pozdrowienia dla towarzysza broni z polibudy, a tu program:

.model small
.286                                ; dla rozkazu shl/shr xxx, 3

.stack 512

.data

punkt	word   ?		    ; punkt poprzedniego ukazania zegara
zegar	byte   'hh:mm:ss'	    ; bufor na zegar w formacie	ASCII
flaga	byte   1		    ; czy istnieje punkt poprzedni?

; --------------------------------------------------------------------------

.code
        assume ds:@data

poczatek:
        mov   ax, @data             ; ustawienie wlasciwej wartosci
        mov   ds, ax                ; rejestru segmentowego DS
        mov   ax, 0B800h            ; ustawienie w ES segmentu pamieci ekranu
        mov   es, ax                ; dla trybu nr 3

        mov   ax, 0
        int   33h                   ; czy jest zainstalowany sterownik?
        or    ax, ax
        jz    koniec                ; brak sterownika - koniec programu
        mov   ax, 0001h
        int   33h                   ; pokaz kursor

petla:
        mov   ax, 0003h
        int   33h                   ; odczytaj pozycje kursora

        test  bx, 1                 ; czy wcisniety lewy klawisz?
        jz    nie_lewy              ; jesli nie, to testuj prawy

        shr   cx, 3                 ; dzielimy przez 8 (bo sterownik podaje
        shr   dx, 3                 ; wspolrzedne ekranu graficznego)
        cmp   cx, 72                ; czy zegar wyszedlby za prawy margines?
        jna   dalej
        mov   cx, 72                ; jesli tak, to ustaw max pozycje x=72

dalej:
        mov   di, dx                ; dostajemy y, a potrzebujemy y*80
        shl   di, 2                 ; DI=y*4
        add   di, dx                ; DI=y*5
        shl   di, 4                 ; DI=y*80
        add   di, cx                ; DI=y*80+x
        shl   di, 1                 ; przemieszczenie w DI (kazdy
				    ; znak jest przechowywany jako para
				    ; kod ASCII-atrybuty)
	test  [flaga], 1	    ; istnieje punkt poprzedni?
	jnz   pokaz		    ; jesli nie, to nie porownuj
        cmp   [punkt], di           ; porownaj z poprzednim punktem
        je    nie_lewy              ; jesli ten sam, to zignoruj klawisz

pokaz:
        mov   ax, 0002h
        int   33h                   ; ukryj kursor

        call  wymaz                 ; wymaz poprzedni zegar
        mov   [punkt], di           ; ustaw wartosc punktu poprzedniego
        call  wypisz                ; wypisz zegar na nowym miejscu

        mov   ax, 0001h
        int   33h                   ; pokaz kursor

nie_lewy:
        test  bx, 2                 ; czy wcisniety prawy klawisz?
        jz    petla                 ; jesli nie, to skok do petli

        mov   ax, 0002h
        int   33h                   ; ukryj kursor
        call  wymaz                 ; wymaz ostatnio pokazany zegar

koniec:
        mov   ax, 4C00h             ; zakonczenie programu
        int   21h

; --------------------------------------------------------------------------

wymaz proc near
	test  [flaga], 1	    ; istnieje punkt poprzedni?
	jz    pomin		    ; jesli tak, to pomin
	mov   [flaga], 0	    ; wyzeruj flage (od teraz punkt istnieje)
	ret			    ; pomin reszte procedury
pomin:
        mov   si, [punkt]           ; pobierz nr poprzedniego punktu
        mov   cx, 8                 ; zamaz osmioma spacjami
powt:
        mov   byte ptr es:[si], ' ' ; zapisz kolejna spacje
        add   si, 2                 ; pomijamy atrybut znaku
        loop  powt                  ; powtorz
        ret
wymaz endp

; --------------------------------------------------------------------------

wypisz proc near
        mov   ah, 2Ch
        int   21h                   ; pobierz czas systemowy
	mov   si, offset zegar	    ; ustaw wskaznik na bufor

	mov   al, ch		    ; godziny jako parametr procedury
        call  konwertuj             ; skonwertuj na ASCII
	mov   al, cl		    ; minuty jako parametr procedury
        call  konwertuj             ; skonwertuj na ASCII
	mov   al, dh		    ; sekundy jako parametr procedury
        call  konwertuj             ; skonwertuj na ASCII

	mov   si, offset zegar	    ; ustaw wskaznik na bufor
        mov   cx, 8                 ; skopiuj 8 znakow
powtorz:
	movsb			    ; kopiuj znak z bufora do pamieci ekranu
        inc   di                    ; przeskocz atrybut znaku
        loop  powtorz               ; powtorz petle
        ret
wypisz endp

; --------------------------------------------------------------------------

konwertuj proc near
	xor   ah, ah		    ; w AL dzielna, wiec zeruj AH
        mov   dl, 10                ; dzielnik
        div   dl                    ; wylicz dziesiatki i jednosci
        add   ax, '0'*256+'0'       ; konwertuj na ASCII
        mov   [si], ax              ; zapisz obie cyfry do bufora
	add   si, 3		    ; przestaw wskaznik na nastepne cyfry
        ret
konwertuj endp

end poczatek
0

Dzieki wielkie :], juz myslalem ze nie oddam tego na czas :]...

no pięknie :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1