modo grafico caracteres emu8086 [facil]

Iniciado por ErielSinh, Diciembre 09, 2020, 11:47:37 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Diciembre 09, 2020, 11:47:37 PM Ultima modificación: Diciembre 10, 2020, 01:15:57 AM por ErielSinh
hoy experimentaremos a imprimir en el modo grafico en assembler en emu8086
un ejemplo basico para entender como funciona
Programa para imprimir la letra a en el modo grafico emu8086
Código: php

; si queremos modificar la direccion de pantalla es B800 contiene 2 bytes
; B800; 2 bytes (Caracter,Color)
org 100h
mov ax,0b800h; direccionando a memoria de pantalla 0b800h
mov es,ax; ponemos al segmento extra para poder acceder
mov es:[0],65; imprimimos el caracter A su valor en codigo ascii es 65 en la memoria de pantalla
ret

ejecutamos en emu

Ahora practiquemos un poco mas
nuestra zona de memoria de la pantalla es lineal, va desde el 1 hasta el 2000 linealmente, cada direccion de memoria se expresa en hexadecimal
tendriamos algo parecido a esto
;   zona de memoria es una especie de matriz o vector linea   0 ---------- 80
                                                                                         81--------- 160
                                  161-------- 240
                                  241-------- 320 (2000 caracteres en total)
ahora para practicar imprimiremos una cadena de caracteres A
Imprimir  caracteres A --------------------->
                               <---------------------A
Código: php


org 100h     
mov bx,0
mov cx,3 ; repetiremos 3 veces a->
                              ; <-a
                             
mov ax,0b800h; memoria de pantalla 

   
   ciclo:  ; este es el ciclo global que imprimira ambas lineas
   
   push cx   
   mov bx,contadord
   mov cx,80; son 80 caracteres por linea que debemos imprimir lo guardamos en cx para repetir 80 veces
   imprimirder:  ; ciclo que imprime a la derecha 
   mov es,ax; movemos al segmento extra
   mov es:[bx],65; imprimimos a en el indice 0
   ;mov es:[bx+320],65   
   ;mov es:[bx+640],65
   add bx,2         
   loop imprimirder
   
   add contadord,320
   pop cx
   push bx
   push cx 
   mov bx,contadori
   mov cx,80   
   
   imprimirizq: ; ciclo que imprime a la izquiera
   mov es:[bx],65
   sub bx,2   
   loop imprimirizq
   
   add contadori,320   
   pop cx
   pop bx
   loop ciclo     
     
ret     
contadord dw 0h ;iniciamos la primera linea en la direccion 0h para que empiece a imprimir desde ahi
contadori dw 318 ;iniciamos en la segunda fila 320-2 si tomamos en cuenta que es una direccion lineal
resta dw 2h ; utilizaremos la variable para el decremento         

viendo su ejecucion en emu8086
el modo de pantalla es de 80*25
entendiendo el funcionamiento cada posicion seria

Para practicar un poco mas, haremos una impresion de caracteres primero hacia abajo y luego hacia arriba
Código: php

org 100h     
mov ax,0b800h
mov es,ax
;mov bx,0
mov cx,3

inccolumna: 
push cx
push bx   
mov bx,posicionx
mov cx,25; repetir 2 veces columna
 
     abajo: 
      mov es:[bx],65
      ;mov es:[bx+1],24h
      add bx,160   
       loop abajo     
pop bx
pop cx
  push cx
  push bx
  mov cx, 25
  mov bx,posiciony
   arriba:
    mov es:[bx+2],65
    sub bx,160     
    loop arriba 
  pop bx
  pop cx
   
add posicionx,4
add posiciony,4
loop inccolumna     
ret           
x dw 0       
posicionx dw 0h
posiciony dw 3840



como ven lo unico que cambia es el incremento, antes incrementabamos en 1 espacio, ahora añadimos +160 caracteres para imprimir en la siguiente linea, o decrementamos -160 para subir por la memoria de pantalla
movemos en CX el valor de 25 porque solo hay 25 lineas hacia abajo
ejecutemos en emu

ejecutemos

por ultimo les dejo un codigo que imprime las dos filas en direcciones contrarias al mismo tiempo
Código: php

org 100h     
mov ax,0b800h
mov es,ax
;mov bx,0
mov cx,3   
push ax
mov ax, posiciony  ;inicializar resto
mov resto,ax
pop ax
inccolumnadoble: 
push cx       
mov bx,posicionx
mov cx,25; repetir 2 veces columna
   
     abajo:
      ;mov ax,posiciony
      ; imprimir caracter hacia abajo
      mov es:[bx],65
      ;mov es:[bx+1],24h
      add bx,160
       ; imprimir caracter hacia arriba
       push bx 
       mov bx,resto
       mov es:[bx+2],65
       
       sub resto,160 
       pop bx
       loop abajo       
pop cx           
add posicionx,4 ; incrementar posicionx en 4 para siguiente columna
push ax            ; copiar la direcion de posicionx y aumentar 3840 + 4
mov ax,posicionx
mov resto,ax
pop ax 
add resto,3840 
loop inccolumnadoble     
ret           
x dw 0       
posicionx dw 0h
posiciony dw 3840
resto dw 0


a modo de curiosidad mario bros fue escrito en assembler


                                              



Excelente aporte. Muchas gracias por compartir ^-^)

~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF