2013-06-18 2 views
0

Je travaille sur un projet TASM 16 bits, dont une partie importante consiste à accéder assez largement à la mémoire vidéo. Le projet est en mode 320x200x256 VGA, et je suis en cours d'exécution à travers DOSBox8086 Discordance de la mémoire vidéo d'assemblage

Par exemple, je donne les résultats suivants ensemble d'instructions pour remplir/nettoyer l'écran au début du programme:

GFXMode proc ;Initialize 256-Color Graphics Mode [Args: None] [Returns: None] 
    push ax 
    mov ax, 0013h 
    int 10h 
    mov ax, 0a000h 
    mov es, ax 
    pop ax 
    ret 
GFXMode endp 

RefreshOff proc ;Disables screen refresh while drawing [Args: None] [Returns: None] 
    push ax bx 
    mov ax, 1201h 
    mov bl, 36h 
    int 10h 
    pop bx ax 
    ret 
RefreshOff endp 

FillScreen proc ;Fills screen with a certain color [Args: 8-bit Color] [Returns: None] 
    push bp 
    mov bp, sp 
    push ax bx 
    mov al, ss:[bp + 4] ;Color 
    mov bx, 0h 
    _fillScreenNextPixel: 
     mov es:[bx], al 
     inc bx 
     cmp bx, 0ffffh 
     jb _fillScreenNextPixel 
    pop bx ax bp 
    ret 2 
FillScreen endp 

RefreshOn proc ;Shows changes on screen [Args: None] [Returns: None] 
    push ax bx 
    mov ax, 1200h 
    mov bl, 36h 
    int 10h 
    pop bx ax 
    ret 
RefreshOn endp 

Et la fonction FillScreen est généralement donnée 0FFh donc il devrait être blanc.

Depuis que je travaille avec TASM, j'ai débogué avec Turbo Debugger depuis qu'ils se sont réunis. Et certaines choses vraiment bizarres ont eu lieu - je peux appuyer sur F7 dans le débogueur pour avancer ligne par ligne ou je peux appuyer sur F9 pour passer à la fin. Donc, je regarde le contenu du segment es (il est fixé à A000 dans les deux cas), deux fois, en appuyant sur F9 et en maintenant la touche F7 (jusqu'à ce que je ne supporte plus)

Je tape F9 Tout apparaît à l'écran, mais rien n'est assigné à la mémoire vidéo. Pas du tout. À la fin du programme, je vérifie s'il y a quoi que ce soit à l'intérieur et il y a des zéros. Quand je maintiens F7 pendant quelques minutes, je peux voir les valeurs placées dans le registre, donc je sais qu'elles sont là, mais quand j'arrête de maintenir la touche enfoncée après quelques centaines de pixels et que je la laisse aller , les valeurs cessent d'être affectées. Quand je regarde l'écran, c'est une demi-couleur et une autre moitié. Je ne sais pas si c'est un problème avec mon débogueur ou avec dosbox ou quelque chose dans mon code, mais je dois garder ces valeurs quelque part afin que je puisse y accéder plus tard. En gros, qu'est-ce qui se passe avec mon programme?

EDIT: Je n'ai pas le représentant pour poster une image, donc http://puu.sh/3iKhw.png est à quoi il ressemble si je tiens F7 pour 0x600 pixels, puis laisser aller pour la couleur 0x3B. La ligne du milieu ne sont apparus après un clic accidentel

+0

Quel est votre emplacement de mémoire vidéo? B800: xxxx est la sortie habituelle – ady

+0

ret 2 - qu'est-ce que cela signifie? pop bx ax bp a l'air pratique, vous ne l'avez pas vu auparavant – ady

+0

Vous ne nous montrez pas où vous attribuez des valeurs à 'es', donc il est difficile de dire si on s'attend à avoir une certaine valeur à un certain point dans le programme. En passant, vous pouvez simplifier votre procédure 'FillScreen' en utilisant' REP STOSB'. – Michael

Répondre

-1

Si vous vous en tenez B800 en es et l'utilisation di, non Bx, vous pouvez avoir un peu plus de chance

mov es:[di], al 
    inc di 
    cmp di, 0ffffh 

pourrait également aider à arrêter à F9FF, pas FFFF, (peut-être besoin de se trémousser ce nombre)

Je l'ai testé la partie inférieure de votre code et il est très bien si vous le tordre, il y a une touche de couleur à l'écran

mov bx,B800      
mov es,bx      
mov bp,sp      
ss:mov al,[bp+4]     
mov di,0       
NextPixel      
es:mov [di],al     
inc di       
cmp di,FFF      
jb NextPixel      
mov ax,1200      
mov bl,36      
int 10       

l'arbitre bit d'arrêt resh mais a fait des trucs bizarres et je l'excluait

Si vous êtes coincé avec la mémoire A000 alors assez juste, mais es: di sont un appariement

+1

L'OP utilise un mode _graphics_ où le segment d'écran est 0A000h, donc en utilisant un segment de mode texte comme 0B800h fait pas de sens. – Michael

+0

ES: DI est une convention courante dans la manipulation de mémoire de noyau en raison des instructions de chaîne l'employant, cependant j'ai vu ES: BX utilisé assez peu dans le code de graphiques. –