Assembler - program rezydentny

0

Witam,
mam do napisania program rezydentny, który co określony czas, dajmy 1 sekundę zmieni wyświetlany znak na następną pozycję. Mam już napisany program który pobiera z zegara cmos jedności sekundy i wyświetla je na ekranie. i tu jest problem, bo nie wiem jak to zrobić aby zmieniało mi pozycje wyświetlanego znaku. użyte przeze mnie mov ax, 0b800h wyświetla mi cały czas aktualną sekunde w lewym, górnym rogu

Kod:

.model tiny
.code
.386
org 100h

Start:
  jmp  Instaluj

staraproc dd 0             


NaszaProc:

  push ax                   
  push bx
  push di
  push es
  mov ax, 0b800h
  mov  es,ax
  xor  di,di                 
  xor  al,al                 
  out  70h,al                
  jmp  $+2                   
  in   al,71h                
  and  al,0fh                
  add  al,'0'                      
  mov  ah,0ch  
  stosw     
  pop  es
  pop  di
  pop  bx
  pop  ax
  jmp  dword ptr cs:[staraproc]       

Instaluj:

  mov  ax,3508h             
  int  21h                   
  mov  word ptr cs:[staraproc],bx    
  mov  word ptr cs:[staraproc +2],es 
  mov  ax,2508h            
  mov  dx,offset NaszaProc  
  int  21h
  mov  dx,offset Instaluj   
  int  27h                 

end Start
0

Udało mi się stworzyć jakąś namiastkę, jednak wyświetlany znak przeskakuje mi o 8 pozycji zamiast jednej, wie ktoś jak to zmienić?

NaszaProc:

  push ax                   
  push bx
  push di
  push es
  mov ax, 0b800h
add ax,cx
  mov  es,ax
  xor  di,di                 
  xor  al,al                 
  out  70h,al                
  jmp  $+2                   
  in   al,71h                
  and  al,0fh                
  add  al,'0'                      
  mov  ah,0ch  
  stosw  
cmp al, dl
je dalej
add cx, 1
dalej:
mov dl, al
  pop  es
  pop  di
  pop  bx
  pop  ax
  jmp  dword ptr cs:[staraproc]
0

Nie chce mi sie tego odpalać i debugować pod Dosboxem, ale tak na łoko, to wstaw przed stosw, xor di, di.
Jeśli nie pomoże upewnij się że cx pomiędzy krokami pętli zmienia się dokładnie o 1.
Ponadto troche dziwnie używasz instrukcji stosw i to przez to może nie działać, bo działa ona tak, że ładuje do [es:di] bajt z ax, a ty zamiast inkrementować di to dodajesz do es cx, w wyniku operacja ta MOŻE działać tak: [es+cx:di]

0
Proxima napisał(a):

że ładuje do [es:di] bajt z ax

Efekt taki sam, i myślę że kluczowe słowo tutaj jest bajt i każda kolejna pozycja karty graficznej jest w 8 bitach, bo jak na sztywno wstawiłem 0B801 to zaczęło wyświetlać od 9 pozycji konsoli...

0

Jejku. Przepraszam, pomyliłem się. Każdy znak w framebufferze zajmuje 2 bajty, a nie jeden, na 1 kodowany jest znak ASCII, a na drugim kolor znaku, kolor tła i atrybuty (miganie itp). Spójrz tu http://geezer.osdevbrasil.net/osd/cons/index.htm. Spróbuj inkrementować o 2 bajty (Ale nie zapomij o tym xorze co wspominałem o nim wcześniej, dla pewności)

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