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
Quel est votre emplacement de mémoire vidéo? B800: xxxx est la sortie habituelle – ady
ret 2 - qu'est-ce que cela signifie? pop bx ax bp a l'air pratique, vous ne l'avez pas vu auparavant – ady
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